diff --git a/esbuild.config.mjs b/esbuild.config.mjs index f2c97d9e..d06890bd 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -39,6 +39,7 @@ esbuild format: "cjs", plugins: [ sveltePlugin({ + compilerOptions: { css: true }, preprocess: sveltePreprocess(), }), ], diff --git a/main.css b/main.css index 91efa10a..69f1eb9e 100644 --- a/main.css +++ b/main.css @@ -14,17 +14,17 @@ } /* fakecss:C:/Users/rossk/OneDrive/1D Personal/Programming/Obsidian Plugins/breadcrumbs-test-vault/.obsidian/plugins/breadcrumbs/src/Components/TrailGrid.esbuild-svelte-fake-css */ -div.BC-grid-wrapper.svelte-c6w3ih.svelte-c6w3ih { +div.BC-grid-wrapper.svelte-rrkswg.svelte-rrkswg { position: relative; } -div.BC-trail-grid.svelte-c6w3ih.svelte-c6w3ih { +div.BC-trail-grid.svelte-rrkswg.svelte-rrkswg { border: 2px solid var(--background-modifier-border); - display: grid; + display: grid !important; align-items: stretch; width: auto; height: auto; } -.BC-grid-options.svelte-c6w3ih.svelte-c6w3ih { +.BC-grid-options.svelte-rrkswg.svelte-rrkswg { position: absolute; top: 0px; right: 0px; @@ -37,23 +37,23 @@ div.BC-trail-grid.svelte-c6w3ih.svelte-c6w3ih { overflow-wrap: normal; overflow: hidden; } -div.BC-grid-options.svelte-c6w3ih.svelte-c6w3ih:hover { +div.BC-grid-options.svelte-rrkswg.svelte-rrkswg:hover { padding: 5px; width: fit-content; } -div.BC-grid-options.svelte-c6w3ih:hover .BC-grid-options-icon.svelte-c6w3ih { +div.BC-grid-options.svelte-rrkswg:hover .BC-grid-options-icon.svelte-rrkswg { display: none; } -.BC-grid-options-options.svelte-c6w3ih.svelte-c6w3ih { +.BC-grid-options-options.svelte-rrkswg.svelte-rrkswg { display: none; } -div.BC-grid-options.svelte-c6w3ih:hover .BC-grid-options-options.svelte-c6w3ih { +div.BC-grid-options.svelte-rrkswg:hover .BC-grid-options-options.svelte-rrkswg { display: unset; } -.BC-depth-button.svelte-c6w3ih.svelte-c6w3ih { +.BC-depth-button.svelte-rrkswg.svelte-rrkswg { padding: 3px 5px; } -div.BC-trail-grid-item.svelte-c6w3ih.svelte-c6w3ih { +div.BC-trail-grid-item.svelte-rrkswg.svelte-rrkswg { display: flex; flex-direction: column; border: 1px solid var(--background-modifier-border); @@ -62,7 +62,7 @@ div.BC-trail-grid-item.svelte-c6w3ih.svelte-c6w3ih { padding: 2px; font-size: smaller; } -div.BC-trail-grid-item.BC-filler.svelte-c6w3ih.svelte-c6w3ih { +div.BC-trail-grid-item.BC-filler.svelte-rrkswg.svelte-rrkswg { opacity: 0.7; } diff --git a/main.js b/main.js index 2d0cae60..76b71a6a 100644 --- a/main.js +++ b/main.js @@ -15425,6 +15425,27 @@ function end_hydrating() { function append(target, node) { target.appendChild(node); } +function append_styles(target, style_sheet_id, styles) { + const append_styles_to = get_root_for_style(target); + if (!append_styles_to.getElementById(style_sheet_id)) { + const style = element("style"); + style.id = style_sheet_id; + style.textContent = styles; + append_stylesheet(append_styles_to, style); + } +} +function get_root_for_style(node) { + if (!node) + return document; + const root2 = node.getRootNode ? node.getRootNode() : node.ownerDocument; + if (root2 && root2.host) { + return root2; + } + return node.ownerDocument; +} +function append_stylesheet(node, style) { + append(node.head || node, style); +} function insert(target, node, anchor) { target.insertBefore(node, anchor || null); } @@ -15679,7 +15700,7 @@ function make_dirty(component, i) { } component.$$.dirty[i / 31 | 0] |= 1 << i % 31; } -function init(component, options, instance24, create_fragment24, not_equal, props, append_styles, dirty = [-1]) { +function init(component, options, instance24, create_fragment24, not_equal, props, append_styles2, dirty = [-1]) { const parent_component = current_component; set_current_component(component); const $$ = component.$$ = { @@ -15700,7 +15721,7 @@ function init(component, options, instance24, create_fragment24, not_equal, prop skip_bound: false, root: options.target || parent_component.$$.root }; - append_styles && append_styles($$.root); + append_styles2 && append_styles2($$.root); let ready = false; $$.ctx = instance24 ? instance24(component, options.props || {}, (i, ret, ...rest) => { const value = rest.length ? rest[0] : ret; @@ -16838,6 +16859,9 @@ var import_loglevel12 = __toESM(require_loglevel()); var import_obsidian8 = require("obsidian"); // src/Components/NextPrev.svelte +function add_css(target) { + append_styles(target, "svelte-11g23nm", ".BC-nexts.svelte-11g23nm div.svelte-11g23nm{text-align:right}.BC-nexts.svelte-11g23nm.svelte-11g23nm{border-left:1px solid var(--background-modifier-border)}.BC-prevs.svelte-11g23nm.svelte-11g23nm{border-right:1px solid var(--background-modifier-border)}.BC-NextPrev-Container.svelte-11g23nm.svelte-11g23nm{display:grid;grid-template-columns:1fr 1fr}"); +} function get_each_context(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[8] = list[i].field; @@ -17102,12 +17126,15 @@ function instance($$self, $$props, $$invalidate) { var NextPrev = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance, create_fragment, safe_not_equal, { plugin: 3, next: 0, prev: 1 }); + init(this, options, instance, create_fragment, safe_not_equal, { plugin: 3, next: 0, prev: 1 }, add_css); } }; var NextPrev_default = NextPrev; // src/Components/TrailGrid.svelte +function add_css2(target) { + append_styles(target, "svelte-dgw0hd", "div.BC-grid-wrapper.svelte-dgw0hd.svelte-dgw0hd{position:relative}div.BC-trail-grid.svelte-dgw0hd.svelte-dgw0hd{border:2px solid var(--background-modifier-border);display:grid;align-items:stretch;width:auto;height:auto}.BC-grid-options.svelte-dgw0hd.svelte-dgw0hd{position:absolute;top:0px;right:0px;height:35px;width:32px;border:1px solid var(--background-modifier-border);border-radius:10px;text-align:center;transition:width 0.3s;overflow-wrap:normal;overflow:hidden}div.BC-grid-options.svelte-dgw0hd.svelte-dgw0hd:hover{padding:5px;width:fit-content}div.BC-grid-options.svelte-dgw0hd:hover .BC-grid-options-icon.svelte-dgw0hd{display:none}.BC-grid-options-options.svelte-dgw0hd.svelte-dgw0hd{display:none}div.BC-grid-options.svelte-dgw0hd:hover .BC-grid-options-options.svelte-dgw0hd{display:unset}.BC-depth-button.svelte-dgw0hd.svelte-dgw0hd{padding:3px 5px}div.BC-trail-grid-item.svelte-dgw0hd.svelte-dgw0hd{display:flex;flex-direction:column;border:1px solid var(--background-modifier-border);align-items:center;justify-content:center;padding:2px;font-size:smaller}div.BC-trail-grid-item.BC-filler.svelte-dgw0hd.svelte-dgw0hd{opacity:0.7}"); +} function get_each_context2(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[15] = list[i]; @@ -17144,8 +17171,8 @@ function create_each_block_12(ctx) { div0 = element("div"); t0 = text(t0_value); t1 = space(); - attr(div0, "class", div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-c6w3ih"); - attr(div1, "class", div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-c6w3ih"); + attr(div0, "class", div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-dgw0hd"); + attr(div1, "class", div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-dgw0hd"); set_style(div1, "grid-area", ctx[19] + 1 + " / " + (ctx[17] + 1) + " / " + (ctx[20] + 2) + " / " + (ctx[17] + 2)); }, m(target, anchor) { @@ -17166,10 +17193,10 @@ function create_each_block_12(ctx) { ctx = new_ctx; if (dirty & 17 && t0_value !== (t0_value = ((_a2 = getAlt(ctx[18], ctx[0])) != null ? _a2 : dropDendron(ctx[18], ctx[5])) + "")) set_data(t0, t0_value); - if (dirty & 16 && div0_class_value !== (div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-c6w3ih")) { + if (dirty & 16 && div0_class_value !== (div0_class_value = null_to_empty(linkClass(ctx[18])) + " svelte-dgw0hd")) { attr(div0, "class", div0_class_value); } - if (dirty & 16 && div1_class_value !== (div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-c6w3ih")) { + if (dirty & 16 && div1_class_value !== (div1_class_value = "BC-trail-grid-item " + (ctx[18] === "" ? "BC-filler" : "") + " svelte-dgw0hd")) { attr(div1, "class", div1_class_value); } if (dirty & 16) { @@ -17279,18 +17306,18 @@ function create_fragment2(ctx) { t6 = space(); button1 = element("button"); t7 = text("+"); - attr(div0, "class", "BC-trail-grid svelte-c6w3ih"); + attr(div0, "class", "BC-trail-grid svelte-dgw0hd"); set_style(div0, "grid-template-columns", "1fr ".repeat(ctx[3].length)); set_style(div0, "grid-template-rows", "1fr ".repeat(ctx[2].length)); - attr(span0, "class", "BC-grid-options-icon svelte-c6w3ih"); - attr(button0, "class", "BC-depth-button svelte-c6w3ih"); + attr(span0, "class", "BC-grid-options-icon svelte-dgw0hd"); + attr(button0, "class", "BC-depth-button svelte-dgw0hd"); button0.disabled = button0_disabled_value = ctx[1] === 1; attr(span1, "class", "tree-item-flair"); - attr(button1, "class", "BC-depth-button svelte-c6w3ih"); + attr(button1, "class", "BC-depth-button svelte-dgw0hd"); button1.disabled = button1_disabled_value = ctx[1] === ctx[7]; - attr(span2, "class", "BC-grid-options-options svelte-c6w3ih"); - attr(div1, "class", "BC-grid-options svelte-c6w3ih"); - attr(div2, "class", "BC-grid-wrapper svelte-c6w3ih"); + attr(span2, "class", "BC-grid-options-options svelte-dgw0hd"); + attr(div1, "class", "BC-grid-options svelte-dgw0hd"); + attr(div2, "class", "BC-grid-wrapper svelte-dgw0hd"); }, m(target, anchor) { insert(target, div2, anchor); @@ -17431,12 +17458,15 @@ function instance2($$self, $$props, $$invalidate) { var TrailGrid = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance2, create_fragment2, safe_not_equal, { sortedTrails: 8, plugin: 0 }); + init(this, options, instance2, create_fragment2, safe_not_equal, { sortedTrails: 8, plugin: 0 }, add_css2); } }; var TrailGrid_default = TrailGrid; // src/Components/TrailPath.svelte +function add_css3(target) { + append_styles(target, "svelte-3c1frp", "span.BC-trail-path-container.svelte-3c1frp{display:flex;justify-content:space-between}"); +} function get_each_context3(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[13] = list[i]; @@ -17802,7 +17832,7 @@ function instance3($$self, $$props, $$invalidate) { var TrailPath = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance3, create_fragment3, safe_not_equal, { sortedTrails: 0, plugin: 1 }); + init(this, options, instance3, create_fragment3, safe_not_equal, { sortedTrails: 0, plugin: 1 }, add_css3); } }; var TrailPath_default = TrailPath; @@ -18587,7 +18617,7 @@ async function drawTrail(plugin) { const trailDiv = createDiv({ cls: `BC-trail ${respectReadableLineLength ? "is-readable-line-width markdown-preview-sizer markdown-preview-section" : ""}`, attr: { - style: (mode !== "preview" ? `max-width: ${max_width};` : "") + "margin: 0 auto; width: 100%;" + style: (mode !== "preview" ? `max-width: ${max_width};` : "") + `margin: 0 auto;${respectReadableLineLength ? "width: var(--file-line-width);" : "width: 100%"}` } }); plugin.visited.push([file.path, trailDiv]); @@ -18853,6 +18883,9 @@ async function refreshIndex(plugin) { } // src/Components/MatrixButtons.svelte +function add_css4(target) { + append_styles(target, "svelte-barhym", "button.svelte-barhym{padding:1px 6px 2px 6px;margin-right:6px}"); +} function create_if_block3(ctx) { let button; let mounted; @@ -18955,12 +18988,15 @@ function instance6($$self, $$props, $$invalidate) { var MatrixButtons = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance6, create_fragment6, safe_not_equal, { matrixView: 0 }); + init(this, options, instance6, create_fragment6, safe_not_equal, { matrixView: 0 }, add_css4); } }; var MatrixButtons_default = MatrixButtons; // src/Components/Matrix.svelte +function add_css5(target) { + append_styles(target, "svelte-1p44ezg", ".BC-Matrix.svelte-1p44ezg.svelte-1p44ezg{padding:5px;font-variant-numeric:tabular-nums;line-height:1.5}.BC-Matrix.svelte-1p44ezg>div.svelte-1p44ezg{border:3px solid var(--background-modifier-border);border-radius:3px;margin:3px;position:relative;height:fit-content}.BC-Matrix-square.svelte-1p44ezg.svelte-1p44ezg{border:1px solid var(--background-modifier-border)}.BC-Matrix-headers.svelte-1p44ezg.svelte-1p44ezg{display:flex;justify-content:space-between;align-items:center}.BC-Matrix-header.svelte-1p44ezg.svelte-1p44ezg{margin:2px;padding:0px 10px}h4.BC-Matrix-header.svelte-1p44ezg.svelte-1p44ezg:first-letter{text-transform:capitalize}ol.svelte-1p44ezg.svelte-1p44ezg{margin:3px;padding-left:30px}.BC-Matrix.svelte-1p44ezg li.svelte-1p44ezg{margin:0.1em}"); +} function get_each_context4(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[13] = list[i]; @@ -19636,7 +19672,7 @@ var Matrix = class extends SvelteComponent { hierSquares: 0, currFile: 1, matrixView: 2 - }); + }, add_css5); } }; var Matrix_default = Matrix; @@ -19893,6 +19929,9 @@ var import_obsidian12 = require("obsidian"); // src/Components/ModifyHNItemComp.svelte var import_console = require("console"); var import_obsidian11 = require("obsidian"); +function add_css6(target) { + append_styles(target, "svelte-13g4k7i", "pre.svelte-13g4k7i{display:inline}"); +} function create_if_block_23(ctx) { let if_block_anchor; function select_block_type(ctx2, dirty) { @@ -20285,7 +20324,7 @@ var ModifyHNItemComp = class extends SvelteComponent { hnItem: 2, file: 3, rel: 0 - }); + }, add_css6); } }; var ModifyHNItemComp_default = ModifyHNItemComp; @@ -20469,6 +20508,9 @@ var import_obsidian16 = require("obsidian"); // src/Components/RenderMarkdown.svelte var import_obsidian15 = require("obsidian"); +function add_css7(target) { + append_styles(target, "svelte-7e9i10", "div.BC-note-content.svelte-7e9i10{padding-left:20px}"); +} function create_fragment9(ctx) { let div; return { @@ -20544,12 +20586,15 @@ function instance9($$self, $$props, $$invalidate) { var RenderMarkdown = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance9, create_fragment9, safe_not_equal, { path: 1 }); + init(this, options, instance9, create_fragment9, safe_not_equal, { path: 1 }, add_css7); } }; var RenderMarkdown_default = RenderMarkdown; // src/Components/CBTree.svelte +function add_css8(target) { + append_styles(target, "svelte-1df5nr5", ".BC-tree.svelte-1df5nr5{padding-left:5px}pre.indent.svelte-1df5nr5{display:inline;background-color:transparent;position:top}details.svelte-1df5nr5{display:inline-block}.is-unresolved.svelte-1df5nr5{color:var(--text-muted)}"); +} function get_each_context5(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[17] = list[i][0]; @@ -21010,7 +21055,7 @@ var CBTree = class extends SvelteComponent { max: 3, basename: 4, parsedSource: 12 - }); + }, add_css8); } }; var CBTree_default = CBTree; @@ -21425,6 +21470,9 @@ var RelationSuggestor = class extends import_obsidian21.EditorSuggest { var import_obsidian40 = require("obsidian"); // src/Components/KoFi.svelte +function add_css9(target) { + append_styles(target, "svelte-1j4tt4j", ".BC-Kofi-button.svelte-1j4tt4j{margin-top:10px}"); +} function create_fragment11(ctx) { let script; let script_src_value; @@ -21484,7 +21532,7 @@ function instance11($$self, $$props, $$invalidate) { var KoFi = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance11, create_fragment11, safe_not_equal, {}); + init(this, options, instance11, create_fragment11, safe_not_equal, {}, add_css9); } }; var KoFi_default = KoFi; @@ -21732,6 +21780,9 @@ function addHierarchyNoteSettings(plugin, alternativeHierarchyDetails) { var import_obsidian30 = require("obsidian"); // node_modules/svelte-icons/components/IconBase.svelte +function add_css10(target) { + append_styles(target, "svelte-c8tyih", "svg.svelte-c8tyih{stroke:currentColor;fill:currentColor;stroke-width:0;width:100%;height:auto;max-height:100%}"); +} function create_if_block7(ctx) { let title_1; let t; @@ -21842,7 +21893,7 @@ function instance12($$self, $$props, $$invalidate) { var IconBase = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance12, create_fragment12, safe_not_equal, { title: 0, viewBox: 1 }); + init(this, options, instance12, create_fragment12, safe_not_equal, { title: 0, viewBox: 1 }, add_css10); } }; var IconBase_default = IconBase; @@ -22070,6 +22121,9 @@ var FaRegTrashAlt = class extends SvelteComponent { var FaRegTrashAlt_default = FaRegTrashAlt; // src/Components/UserHierarchies.svelte +function add_css11(target) { + append_styles(target, "svelte-1e9on6f", "label.BC-Arrow-Label.svelte-1e9on6f.svelte-1e9on6f{display:inline-block;width:20px !important}div.BC-Buttons.svelte-1e9on6f.svelte-1e9on6f{padding-bottom:5px}details.BC-Hier-Details.svelte-1e9on6f.svelte-1e9on6f{border:1px solid var(--background-modifier-border);border-radius:10px;padding:10px 5px 10px 10px;margin-bottom:15px}.BC-Hier-Details.svelte-1e9on6f summary.svelte-1e9on6f::marker{font-size:10px}.BC-Hier-Details.svelte-1e9on6f summary button.svelte-1e9on6f{float:right}.icon.svelte-1e9on6f.svelte-1e9on6f{color:var(--text-normal);display:inline-block;padding-top:3px;width:17px;height:17px}"); +} function get_each_context6(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[13] = list[i]; @@ -22499,7 +22553,7 @@ function instance16($$self, $$props, $$invalidate) { var UserHierarchies = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance16, create_fragment16, safe_not_equal, { plugin: 0 }); + init(this, options, instance16, create_fragment16, safe_not_equal, { plugin: 0 }, add_css11); } }; var UserHierarchies_default = UserHierarchies; @@ -22521,6 +22575,9 @@ function addHierarchySettings(plugin, containerEl) { // src/Components/Checkboxes.svelte var import_loglevel19 = __toESM(require_loglevel()); +function add_css12(target) { + append_styles(target, "svelte-d1my4i", ".grid.svelte-d1my4i{display:grid;grid-template-columns:repeat(auto-fit, minmax(100px, 1fr))}"); +} function get_each_context7(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[12] = list[i]; @@ -22752,7 +22809,7 @@ function instance17($$self, $$props, $$invalidate) { var Checkboxes = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance17, create_fragment17, safe_not_equal, { plugin: 4, settingName: 5, options: 0 }); + init(this, options, instance17, create_fragment17, safe_not_equal, { plugin: 4, settingName: 5, options: 0 }, add_css12); } }; var Checkboxes_default = Checkboxes; @@ -23363,6 +23420,9 @@ var FaInfo = class extends SvelteComponent { var FaInfo_default = FaInfo; // src/Components/Ducks.svelte +function add_css13(target) { + append_styles(target, "svelte-gmdm3a", ".icon.svelte-gmdm3a{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}"); +} function get_each_context8(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[13] = list[i]; @@ -23601,7 +23661,7 @@ function instance19($$self, $$props, $$invalidate) { var Ducks = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance19, create_fragment19, safe_not_equal, { plugin: 4, ducksView: 0 }); + init(this, options, instance19, create_fragment19, safe_not_equal, { plugin: 4, ducksView: 0 }, add_css13); } }; var Ducks_default = Ducks; @@ -23797,6 +23857,9 @@ var FaRegSnowflake = class extends SvelteComponent { var FaRegSnowflake_default = FaRegSnowflake; // src/Components/SideTree.svelte +function add_css14(target) { + append_styles(target, "svelte-8j6nux", "button.svelte-8j6nux{display:inline;padding:1px 6px 2px 6px}.BC-downs.svelte-8j6nux{padding-left:5px}pre.svelte-8j6nux{display:inline}.is-unresolved.svelte-8j6nux{color:var(--text-muted)}.icon.svelte-8j6nux{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}"); +} function get_each_context9(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[15] = list[i]; @@ -24235,7 +24298,7 @@ function instance22($$self, $$props, $$invalidate) { var SideTree = class extends SvelteComponent { constructor(options) { super(); - init(this, options, instance22, create_fragment22, safe_not_equal, { plugin: 0, view: 1 }); + init(this, options, instance22, create_fragment22, safe_not_equal, { plugin: 0, view: 1 }, add_css14); } }; var SideTree_default = SideTree; @@ -31593,4 +31656,4 @@ var BCPlugin = class extends import_obsidian44.Plugin { * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvd2VicGFjay9ib290c3RyYXAiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2RlZHVwZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctYXQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2ljb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3NyYy9pY29ucy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvcmVwbGFjZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL3RvLXN2Zy5qcyIsICJub2RlX21vZHVsZXMvbG9nbGV2ZWwvbGliL2xvZ2xldmVsLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5L3NyYy91dGlscy5qcyIsICJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXIuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3Rha2UuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2Vycm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaW5kaWNlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvY2hhaW4uanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2l0ZXJhdGlvbi9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL25laWdoYm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL2FkamFjZW5jeS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvc2VyaWFsaXphdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2NsYXNzZXMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdXRpbHMvaXMtZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2ZvcmVhY2guanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy90eXBlZC1hcnJheXMuanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy9pdGVyYWJsZXMuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9tbmVtb25pc3QvZml4ZWQtZGVxdWUuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5LXRyYXZlcnNhbC9iZnMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL2Rmcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS10cmF2ZXJzYWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2VuZ2xpc2guanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHRlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvaW52YWxpZC5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9zeXN0ZW1ab25lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvSUFOQVpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9maXhlZE9mZnNldFpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9pbnZhbGlkWm9uZS5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvem9uZVV0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9zZXR0aW5ncy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9yZWdleFBhcnNlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2R1cmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW50ZXJ2YWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbmZvLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWZmLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWdpdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3Rva2VuUGFyc2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9jb252ZXJzaW9ucy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2RhdGV0aW1lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvbHV4b24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCAic3JjL21haW4udHMiLCAibm9kZV9tb2R1bGVzL2p1Z2dsLWFwaS9kaXN0L2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvb2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzLmpzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL1ZpZXdzL01hdHJpeFZpZXcudHMiLCAic3JjL0RlYnVnZ2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwgInNyYy9yZWZyZXNoSW5kZXgudHMiLCAic3JjL1V0aWxzL2dyYXBoVXRpbHMudHMiLCAic3JjL1V0aWxzL0hpZXJVdGlscy50cyIsICJzcmMvVXRpbHMvT2JzaWRpYW5VdGlscy50cyIsICJzcmMvVXRpbHMvZ2VuZXJhbFV0aWxzLnRzIiwgInNyYy9SZWxhdGlvbnMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGF2aWV3Tm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRGF0ZU5vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RlbmRyb25Ob3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9Gb2xkZXJOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyYXJjaHlOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9KdWdnbExpbmtzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0xpbmtOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9SZWdleE5vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RhZ05vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RyYXZlcnNlTm90ZXMudHMiLCAic3JjL1ZpZXdzL1RyYWlsVmlldy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvTmV4dFByZXYuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvVHJhaWxHcmlkLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9UcmFpbEdyaWQuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1RyYWlsUGF0aC5zdmVsdGUiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0p1Z2dsLnRzIiwgInNyYy9Db21tYW5kcy9DcmVhdGVJbmRleC50cyIsICJzcmMvQ29tcG9uZW50cy9KdWdnbEJ1dHRvbi5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9NYXRyaXguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeC5zdmVsdGUiLCAic3JjL0FQSS50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyTm90ZU1vZGFsLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvci50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9Nb2RpZnlIaWVySXRlbU1vZGFsLnRzIiwgInNyYy9zcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29kZWJsb2Nrcy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvUmVuZGVyTWFya2Rvd24uc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1JlbmRlck1hcmtkb3duLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ0JUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlIiwgInNyYy9Db21tYW5kcy9qdW1wVG9GaXJzdERpci50cyIsICJzcmMvQ29tbWFuZHMvdGhyZWFkaW5nLnRzIiwgInNyYy9Db21tYW5kcy9Xcml0ZUJDcy50cyIsICJzcmMvRmllbGRTdWdnZXN0b3IudHMiLCAic3JjL1JlbGF0aW9uU3VnZ2VzdG9yLnRzIiwgInNyYy9TZXR0aW5ncy9CcmVhZGNydW1ic1NldHRpbmdUYWIudHMiLCAic3JjL0NvbXBvbmVudHMvS29GaS5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0NyZWF0ZUluZGV4U2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0NTVlNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9EYXRhdmlld05vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGF0ZU5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGVidWdnaW5nU2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0RlbmRyb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvR2VuZXJhbFNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlOb3RlU2V0dGluZ3MudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1VzZXJIaWVyYXJjaGllcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvVXNlckhpZXJhcmNoaWVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFMaXN0VWwuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFQbHVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2ZhL0ZhUmVnVHJhc2hBbHQuc3ZlbHRlIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlTZXR0aW5ncy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0p1bXBUb05leHRTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvTWF0cml4Vmlld1NldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9Ob1N5c3RlbVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9SZWdleE5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvUmVsYXRpb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVGFnTm90ZVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9UaHJlYWRpbmdTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVHJhaWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVmlzTW9kYWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvV3JpdGVCQ3NTZXR0aW5ncy50cyIsICJzcmMvVmlld3MvRHVja3NWaWV3LnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFJbmZvLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvRHVja3Muc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL0R1Y2tzLnN2ZWx0ZSIsICJzcmMvVmlld3MvVHJlZVZpZXcudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1NpZGVUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9TaWRlVHJlZS5zdmVsdGUiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS1pY29ucy9mYS9GYUZpcmUuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFSZWdTbm93Zmxha2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aWNrcy5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbWF0Y2hlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VtcHR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbG93ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY3ViZWhlbGl4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXJBcnJheS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL29iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3ZhbHVlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcm91bmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2N1YmVoZWxpeC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3F1YW50aXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvYnJ1c2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXBhdGgvc3JjL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9hZGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9jb3Zlci5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9leHRlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvZmluZC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Jvb3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvdmlzaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy92aXNpdEFmdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMveC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3kuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvamlnZ2xlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY29sbGlkZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2xpbmsuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9sY2cuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9zaW11bGF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbWFueUJvZHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uRml4ZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUHJlZml4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblJvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2NsdXN0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2NvdW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQmVmb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQWZ0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2ZpbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3N1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvcGF0aC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvYW5jZXN0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9kZXNjZW5kYW50cy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvbGVhdmVzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9saW5rcy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2FjY2Vzc29ycy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3JvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvZGljZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYXJ0aXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvc3RyYXRpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3NsaWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvc3F1YXJpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9vcmRpbmFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvYmFuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29udGludW91cy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpY2tGb3JtYXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY29sb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9yYWluYm93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJjLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9yYWRpYWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lUmFkaWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYnVuZGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVmlzTW9kYWwudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9BcmNEaWFncmFtLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9DaXJjbGVQYWNraW5nLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9FZGdlQnVuZGxpbmcudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0ZvcmNlRGlyZWN0ZWRHLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9JY2ljbGUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1JhZGlhbFRyZWUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1N1bmJ1cnN0LnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9UaWR5VHJlZS50cyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVHJlZU1hcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZmVhdGhlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJmZWF0aGVyXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsICIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwgIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjbGFzc05hbWVzID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvLyBkb24ndCBpbmhlcml0IGZyb20gT2JqZWN0IHNvIHdlIGNhbiBza2lwIGhhc093blByb3BlcnR5IGNoZWNrIGxhdGVyXG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTUxODMyOC9jcmVhdGluZy1qcy1vYmplY3Qtd2l0aC1vYmplY3QtY3JlYXRlbnVsbCNhbnN3ZXItMjEwNzkyMzJcblx0XHRmdW5jdGlvbiBTdG9yYWdlT2JqZWN0KCkge31cblx0XHRTdG9yYWdlT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0XHRmdW5jdGlvbiBfcGFyc2VBcnJheSAocmVzdWx0U2V0LCBhcnJheSkge1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRfcGFyc2UocmVzdWx0U2V0LCBhcnJheVtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdFx0ZnVuY3Rpb24gX3BhcnNlTnVtYmVyIChyZXN1bHRTZXQsIG51bSkge1xuXHRcdFx0cmVzdWx0U2V0W251bV0gPSB0cnVlO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9wYXJzZU9iamVjdCAocmVzdWx0U2V0LCBvYmplY3QpIHtcblx0XHRcdGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChvYmplY3QsIGspKSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlIHRvIGZhbHNlIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQgdG8gYXZvaWQgY2hhbmdpbmcgb2JqZWN0IHN0cnVjdHVyZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tLzIwMTIvMTEvd3JpdGluZy1mYXN0LW1lbW9yeS1lZmZpY2llbnQtamF2YXNjcmlwdC8jZGUtcmVmZXJlbmNpbmctbWlzY29uY2VwdGlvbnNcblx0XHRcdFx0XHRyZXN1bHRTZXRba10gPSAhIW9iamVjdFtrXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBTUEFDRSA9IC9cXHMrLztcblx0XHRmdW5jdGlvbiBfcGFyc2VTdHJpbmcgKHJlc3VsdFNldCwgc3RyKSB7XG5cdFx0XHR2YXIgYXJyYXkgPSBzdHIuc3BsaXQoU1BBQ0UpO1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRyZXN1bHRTZXRbYXJyYXlbaV1dID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfcGFyc2UgKHJlc3VsdFNldCwgYXJnKSB7XG5cdFx0XHRpZiAoIWFyZykgcmV0dXJuO1xuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHQvLyAnZm9vIGJhcidcblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRfcGFyc2VTdHJpbmcocmVzdWx0U2V0LCBhcmcpO1xuXG5cdFx0XHQvLyBbJ2ZvbycsICdiYXInLCAuLi5dXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0XHRfcGFyc2VBcnJheShyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vIHsgJ2Zvbyc6IHRydWUsIC4uLiB9XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdF9wYXJzZU9iamVjdChyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vICcxMzAnXG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdF9wYXJzZU51bWJlcihyZXN1bHRTZXQsIGFyZyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NsYXNzTmFtZXMgKCkge1xuXHRcdFx0Ly8gZG9uJ3QgbGVhayBhcmd1bWVudHNcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvd2lraS9PcHRpbWl6YXRpb24ta2lsbGVycyMzMi1sZWFraW5nLWFyZ3VtZW50c1xuXHRcdFx0dmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgYXJncyA9IEFycmF5KGxlbik7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjbGFzc1NldCA9IG5ldyBTdG9yYWdlT2JqZWN0KCk7XG5cdFx0XHRfcGFyc2VBcnJheShjbGFzc1NldCwgYXJncyk7XG5cblx0XHRcdHZhciBsaXN0ID0gW107XG5cblx0XHRcdGZvciAodmFyIGsgaW4gY2xhc3NTZXQpIHtcblx0XHRcdFx0aWYgKGNsYXNzU2V0W2tdKSB7XG5cdFx0XHRcdFx0bGlzdC5wdXNoKGspXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3Quam9pbignICcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBfY2xhc3NOYW1lcztcblx0fSkoKTtcblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmdcbiAgICAgICAgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSlcbiAgICAgICAgOiBzdGVwLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxuLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwgInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwgInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCAidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwgInZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwgInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBleGlzdCA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGV4aXN0ID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCAiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsICJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYXJlZCgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiIsICJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCAidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsICJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCAidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsICIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTtcbn0gOiBPYmplY3Q7XG4iLCAidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGhpZGUoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbmlmIChJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5pZiAoIUlTX1BVUkUgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QobmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKFdlYWtNYXApKTtcbiIsICJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaSsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG5cbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCAiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwgImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsICJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBhcnJheUluZGV4T2YgPSBhcnJheUluY2x1ZGVzKGZhbHNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsICJ2YXIgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cycpO1xuXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3JyZWN0U2V0dGVyID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBjb3JyZWN0U2V0dGVyID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMoTywgcHJvdG8pO1xuICAgIGlmIChjb3JyZWN0U2V0dGVyKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhuYXRpdmVGdW5jdGlvblRvU3RyaW5nKS5zcGxpdCgndG9TdHJpbmcnKTtcblxuc2hhcmVkKCdpbnNwZWN0U291cmNlJywgZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xufSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgaGlkZSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBoaWRlKE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsICIvLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgaGlkZShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsICJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwgInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjEuMycsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnXHUwMEE5IDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsICJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCAidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCAidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwgInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsICJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNikpO1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhwcm90bykgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH1cbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCAidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4LCB0cnVlKTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsICJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsICJpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBERUZBVUxUX0FUVFJTIGZyb20gJy4vZGVmYXVsdC1hdHRycy5qc29uJztcblxuY2xhc3MgSWNvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbnRlbnRzLCB0YWdzID0gW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29udGVudHMgPSBjb250ZW50cztcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIHRoaXMuYXR0cnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0FUVFJTLFxuICAgICAgLi4ueyBjbGFzczogYGZlYXRoZXIgZmVhdGhlci0ke25hbWV9YCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNWRyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdmcoYXR0cnMgPSB7fSkge1xuICAgIGNvbnN0IGNvbWJpbmVkQXR0cnMgPSB7XG4gICAgICAuLi50aGlzLmF0dHJzLFxuICAgICAgLi4uYXR0cnMsXG4gICAgICAuLi57IGNsYXNzOiBjbGFzc25hbWVzKHRoaXMuYXR0cnMuY2xhc3MsIGF0dHJzLmNsYXNzKSB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gYDxzdmcgJHthdHRyc1RvU3RyaW5nKGNvbWJpbmVkQXR0cnMpfT4ke3RoaXMuY29udGVudHN9PC9zdmc+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBJY29uYC5cbiAgICpcbiAgICogQWRkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIElmIG9sZCBjb2RlIGV4cGVjdHMgYGZlYXRoZXIuaWNvbnMuPG5hbWU+YFxuICAgKiB0byBiZSBhIHN0cmluZywgYHRvU3RyaW5nKClgIHdpbGwgZ2V0IGltcGxpY2l0bHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGF0dHJpYnV0ZXMgb2JqZWN0IHRvIHN0cmluZyBvZiBIVE1MIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJzVG9TdHJpbmcoYXR0cnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoa2V5ID0+IGAke2tleX09XCIke2F0dHJzW2tleV19XCJgKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCAiaW1wb3J0IEljb24gZnJvbSAnLi9pY29uJztcbmltcG9ydCBpY29ucyBmcm9tICcuLi9kaXN0L2ljb25zLmpzb24nO1xuaW1wb3J0IHRhZ3MgZnJvbSAnLi90YWdzLmpzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3Qua2V5cyhpY29ucylcbiAgLm1hcChrZXkgPT4gbmV3IEljb24oa2V5LCBpY29uc1trZXldLCB0YWdzW2tleV0pKVxuICAucmVkdWNlKChvYmplY3QsIGljb24pID0+IHtcbiAgICBvYmplY3RbaWNvbi5uYW1lXSA9IGljb247XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSwge30pO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcbmltcG9ydCB0b1N2ZyBmcm9tICcuL3RvLXN2Zyc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICcuL3JlcGxhY2UnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgaWNvbnMsIHRvU3ZnLCByZXBsYWNlIH07XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBSZXBsYWNlIGFsbCBIVE1MIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGBkYXRhLWZlYXRoZXJgIGF0dHJpYnV0ZSB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZShhdHRycyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmVhdGhlci5yZXBsYWNlKClgIG9ubHkgd29ya3MgaW4gYSBicm93c2VyIGVudmlyb25tZW50LicpO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudHNUb1JlcGxhY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mZWF0aGVyXScpO1xuXG4gIEFycmF5LmZyb20oZWxlbWVudHNUb1JlcGxhY2UpLmZvckVhY2goZWxlbWVudCA9PlxuICAgIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGF0dHJzKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgYXR0cnMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50QXR0cnMgPSBnZXRBdHRycyhlbGVtZW50KTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnRBdHRyc1snZGF0YS1mZWF0aGVyJ107XG4gIGRlbGV0ZSBlbGVtZW50QXR0cnNbJ2RhdGEtZmVhdGhlciddO1xuXG4gIGNvbnN0IHN2Z1N0cmluZyA9IGljb25zW25hbWVdLnRvU3ZnKHtcbiAgICAuLi5hdHRycyxcbiAgICAuLi5lbGVtZW50QXR0cnMsXG4gICAgLi4ueyBjbGFzczogY2xhc3NuYW1lcyhhdHRycy5jbGFzcywgZWxlbWVudEF0dHJzLmNsYXNzKSB9LFxuICB9KTtcbiAgY29uc3Qgc3ZnRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgIHN2Z1N0cmluZyxcbiAgICAnaW1hZ2Uvc3ZnK3htbCcsXG4gICk7XG4gIGNvbnN0IHN2Z0VsZW1lbnQgPSBzdmdEb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcblxuICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHN2Z0VsZW1lbnQsIGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBIVE1MIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRBdHRycyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcykucmVkdWNlKChhdHRycywgYXR0cikgPT4ge1xuICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIHJldHVybiBhdHRycztcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gU1ZHIHN0cmluZy5cbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0b1N2ZyhuYW1lLCBhdHRycyA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICAnZmVhdGhlci50b1N2ZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZygpIGluc3RlYWQuJyxcbiAgKTtcblxuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZXF1aXJlZCBga2V5YCAoaWNvbiBuYW1lKSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4nKTtcbiAgfVxuXG4gIGlmICghaWNvbnNbbmFtZV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gaWNvbiBtYXRjaGluZyAnJHtcbiAgICAgICAgbmFtZVxuICAgICAgfScuIFNlZSB0aGUgY29tcGxldGUgbGlzdCBvZiBpY29ucyBhdCBodHRwczovL2ZlYXRoZXJpY29ucy5jb21gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaWNvbnNbbmFtZV0udG9TdmcoYXR0cnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1N2ZztcbiIsICIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcyhsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBsb2cubG9nIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWdcbiAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmRlYnVnO1xuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSwgbGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHRoaXMsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGRlZmF1bHRMZXZlbCwgZmFjdG9yeSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGN1cnJlbnRMZXZlbDtcbiAgICAgIGRlZmF1bHRMZXZlbCA9IGRlZmF1bHRMZXZlbCA9PSBudWxsID8gXCJXQVJOXCIgOiBkZWZhdWx0TGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbGVhclBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudExldmVsO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUobGV2ZWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYsIGxldmVsLCBuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgXCJsb2cuc2V0TGV2ZWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGxldmVsOiBcIiArIGxldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgZGVmYXVsdExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXRMZXZlbChkZWZhdWx0TGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIHJpZ2h0IGxldmVsXG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxMZXZlbCA9IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIgJiYgdHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHx8IG5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICBuYW1lLCBkZWZhdWx0TG9nZ2VyLmdldExldmVsKCksIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIENvbGxlY3Rpb24gb2YgaGVscGZ1bCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBPYmplY3QuYXNzaWduLWxpa2UgcG9seWZpbGwuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXQgICAgICAgLSBGaXJzdCBvYmplY3QuXG4gKiBAcGFyYW0gIHtvYmplY3R9IFsuLi5vYmplY3RzXSAtIE9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGFzc2lnblBvbHlmaWxsKCkge1xuICBjb25zdCB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cbiAgZm9yIChsZXQgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKCFhcmd1bWVudHNbaV0pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGFyZ3VtZW50c1tpXSkgdGFyZ2V0W2tdID0gYXJndW1lbnRzW2ldW2tdO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubGV0IGFzc2lnbiA9IGFzc2lnblBvbHlmaWxsO1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicpIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbmV4cG9ydCB7YXNzaWdufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZpcnN0IG1hdGNoaW5nIGVkZ2UgZm9yIGdpdmVuIHBhdGguXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSBleGlzdGVuY2Ugb2Ygc291cmNlICYgdGFyZ2V0LiBUaGlzXG4gKiBtdXN0IGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgZ3JhcGggIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAqIEBwYXJhbSAge2FueX0gICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUgICAtIFR5cGUgb2YgdGhlIGVkZ2UgKG1peGVkLCBkaXJlY3RlZCBvciB1bmRpcmVjdGVkKS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdFZGdlKGdyYXBoLCBzb3VyY2UsIHRhcmdldCwgdHlwZSkge1xuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpO1xuXG4gIGxldCBlZGdlID0gbnVsbDtcblxuICBpZiAoIXNvdXJjZURhdGEpIHJldHVybiBlZGdlO1xuXG4gIGlmICh0eXBlID09PSAnbWl4ZWQnKSB7XG4gICAgZWRnZSA9XG4gICAgICAoc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XSkgfHxcbiAgICAgIChzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgJiYgc291cmNlRGF0YS51bmRpcmVjdGVkW3RhcmdldF0pO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkaXJlY3RlZCcpIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgR3JhcGggaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgbyAtIFRhcmdldCBPYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvKSB7XG4gIGxldCBrO1xuXG4gIGZvciAoayBpbiBvKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFwicHJpdmF0ZVwiIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgYnkgY29uY2VhbGluZyBpdFxuICogdXNpbmcgdGhlIGBlbnVtZXJhYmxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAgIC0gTWVtYmVyIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgJiB0aGUgZ2l2ZW4gZ2V0dGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgLSBNZW1iZXIgbmFtZS5cbiAqIEBwYXJhbSB7bWl4ZWR9ICAgIHZhbHVlICAtIFRoZSBhdHRhY2hlZCBnZXR0ZXIgb3IgZml4ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT25seVByb3BlcnR5KHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9O1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLmdldCA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBjb25zdGl0dXRlIHZhbGlkIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBoaW50cyAtIFRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUhpbnRzKGhpbnRzKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChoaW50cykpIHJldHVybiBmYWxzZTtcblxuICBpZiAoaGludHMuYXR0cmlidXRlcyAmJiAhQXJyYXkuaXNBcnJheShoaW50cy5hdHRyaWJ1dGVzKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBnZW5lcmF0aW5nIGluY3JlbWVudGFsIGlkcyBmb3IgZWRnZXMuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSgpIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpICYgMHhmZjtcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIHJldHVybiBpKys7XG4gIH07XG59XG4iLCAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEl0ZXJhdG9yIENsYXNzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBTaW1wbGUgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5J3MgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogSXRlcmF0b3IgY2xhc3MuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0IC0gTmV4dCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICBpZiAodHlwZW9mIG5leHQgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9pdGVyYXRvcjogZXhwZWN0aW5nIGEgZnVuY3Rpb24hJyk7XG5cbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn1cblxuLyoqXG4gKiBJZiBzeW1ib2xzIGFyZSBzdXBwb3J0ZWQsIHdlIGFkZCBgbmV4dGAgdG8gYFN5bWJvbC5pdGVyYXRvcmAuXG4gKi9cbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJylcbiAgSXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9mIHRoZSBnaXZlbiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtICB7YW55Li4ufSB2YWx1ZXMgLSBWYWx1ZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3Iub2YgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgIGwgPSBhcmdzLmxlbmd0aCxcbiAgICBpID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IGFyZ3NbaSsrXX07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3IuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7ZG9uZTogdHJ1ZX07XG4gIH0pO1xuXG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGdpdmVuIGluZGV4ZWQgc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfEFycmF5fSBzZXF1ZW5jZSAtIFRhcmdldCBzZXF1ZW5jZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5mcm9tU2VxdWVuY2UgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHtcbiAgdmFyIGkgPSAwLFxuICAgIGwgPSBzZXF1ZW5jZS5sZW5ndGg7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIHJldHVybiB7ZG9uZTogZmFsc2UsIHZhbHVlOiBzZXF1ZW5jZVtpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gIHthbnl9IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5JdGVyYXRvci5pcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRvcikgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUubmV4dCA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gSXRlcmF0b3I7XG4iLCAiZXhwb3J0cy5BUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCc7XG5leHBvcnRzLlNZTUJPTF9TVVBQT1JUID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCc7XG4iLCAiLyoqXG4gKiBPYmxpdGVyYXRvciBJdGVyIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEZ1bmN0aW9uIGNvZXJjaW5nIHZhbHVlcyB0byBhbiBpdGVyYXRvci4gSXQgY2FuIGJlIHF1aXRlIHVzZWZ1bCB3aGVuIG5lZWRpbmdcbiAqIHRvIGhhbmRsZSBpdGVyYWJsZXMgYW5kIGl0ZXJhdG9ycyB0aGUgc2FtZSB3YXkuXG4gKi9cbnZhciBJdGVyYXRvciA9IHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG5mdW5jdGlvbiBpdGVyT3JOdWxsKHRhcmdldCkge1xuICAvLyBJbmRleGVkIHNlcXVlbmNlXG4gIGlmIChcbiAgICB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyB8fFxuICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSB8fFxuICAgIChBUlJBWV9CVUZGRVJfU1VQUE9SVCAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodGFyZ2V0KSlcbiAgKVxuICAgIHJldHVybiBJdGVyYXRvci5mcm9tU2VxdWVuY2UodGFyZ2V0KTtcblxuICAvLyBJbnZhbGlkIHZhbHVlXG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIC8vIEl0ZXJhYmxlXG4gIGlmIChTWU1CT0xfU1VQUE9SVCAmJiB0eXBlb2YgdGFyZ2V0W1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cbiAgLy8gSXRlcmF0b3IgZHVjay10eXBpbmdcbiAgaWYgKHR5cGVvZiB0YXJnZXQubmV4dCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRhcmdldDtcblxuICAvLyBJbnZhbGlkIG9iamVjdFxuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpdGVyKHRhcmdldCkge1xuICB2YXIgaXRlcmF0b3IgPSBpdGVyT3JOdWxsKHRhcmdldCk7XG5cbiAgaWYgKCFpdGVyYXRvcilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnb2JsaXRlcmF0b3I6IHRhcmdldCBpcyBub3QgaXRlcmFibGUgbm9yIGEgdmFsaWQgaXRlcmF0b3IuJ1xuICAgICk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcbiIsICIvKiBlc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiAwICovXG4vKipcbiAqIE9ibGl0ZXJhdG9yIFRha2UgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogRnVuY3Rpb24gdGFraW5nIG4gb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCByZXR1cm5zIHRoZW1cbiAqIGludG8gYW4gYXJyYXkuXG4gKi9cbnZhciBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogVGFrZS5cbiAqXG4gKiBAcGFyYW0gIHtJdGVyYWJsZX0gaXRlcmFibGUgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgW25dICAgICAgLSBPcHRpb25hbCBudW1iZXIgb2YgaXRlbXMgdG8gdGFrZS5cbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRha2UoaXRlcmFibGUsIG4pIHtcbiAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IG4gOiBJbmZpbml0eSxcbiAgICBhcnJheSA9IGwgIT09IEluZmluaXR5ID8gbmV3IEFycmF5KGwpIDogW10sXG4gICAgc3RlcCxcbiAgICBpID0gMDtcblxuICB2YXIgaXRlcmF0b3IgPSBpdGVyKGl0ZXJhYmxlKTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChpID09PSBsKSByZXR1cm4gYXJyYXk7XG5cbiAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGkgIT09IG4pIGFycmF5Lmxlbmd0aCA9IGk7XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICBhcnJheVtpKytdID0gc3RlcC52YWx1ZTtcbiAgfVxufTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgQ3VzdG9tIEVycm9yc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlZmluaW5nIGN1c3RvbSBlcnJvcnMgZm9yIGVhc2Ugb2YgdXNlICYgZWFzeSB1bml0IHRlc3RzIGFjcm9zc1xuICogaW1wbGVtZW50YXRpb25zIChub3JtYWxpemVkIHR5cG9sb2d5IHJhdGhlciB0aGFuIHJlbHlpbmcgb24gZXJyb3JcbiAqIG1lc3NhZ2VzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvcnJlY3QgZXJyb3Igd2FzIGZvdW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubmFtZSA9ICdHcmFwaEVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciBleHRlbmRzIEdyYXBoRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yJztcblxuICAgIC8vIFRoaXMgaXMgVjggc3BlY2lmaWMgdG8gZW5oYW5jZSBzdGFjayByZWFkYWJpbGl0eVxuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpXG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yXG4gICAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdOb3RGb3VuZEdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdEZvdW5kR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVc2FnZUdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdVc2FnZUdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFVzYWdlR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEludGVybmFsIERhdGEgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSW50ZXJuYWwgY2xhc3NlcyBob3BlZnVsbHkgcmVkdWNlZCB0byBzdHJ1Y3RzIGJ5IGVuZ2luZXMgJiBzdG9yaW5nXG4gKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIG5vZGVzICYgZWRnZXMuXG4gKlxuICogTm90ZSB0aGF0IHRob3NlIGNsYXNzZXMgZG9uJ3QgcmVseSBvbiB0aGUgYGNsYXNzYCBrZXl3b3JkIHRvIGF2b2lkIHNvbWVcbiAqIGNydWZ0IGludHJvZHVjZWQgYnkgbW9zdCBvZiBFUzIwMTUgdHJhbnNwaWxlcnMuXG4gKi9cblxuLyoqXG4gKiBNaXhlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNaXhlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuTWl4ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy51bmRpcmVjdGVkRGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG4gIHRoaXMudW5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG4gIHRoaXMudW5kaXJlY3RlZCA9IHt9O1xufTtcblxuLyoqXG4gKiBEaXJlY3RlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuRGlyZWN0ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG59O1xuXG5EaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS51cGdyYWRlVG9NaXhlZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG4vKipcbiAqIFVuZGlyZWN0ZWROb2RlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyAtIE5vZGUncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVW5kaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuVW5kaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG5VbmRpcmVjdGVkTm9kZURhdGEucHJvdG90eXBlLnVwZ3JhZGVUb01peGVkID0gZnVuY3Rpb24gKCkge1xuICAvLyBEZWdyZWVzXG4gIHRoaXMuaW5EZWdyZWUgPSAwO1xuICB0aGlzLm91dERlZ3JlZSA9IDA7XG4gIHRoaXMuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy5pbiA9IHt9O1xuICB0aGlzLm91dCA9IHt9O1xufTtcblxuLyoqXG4gKiBFZGdlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9ICBzdHJpbmcgICAgICAgLSBUaGUgZWRnZSdzIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgc291cmNlICAgICAgIC0gU291cmNlIG9mIHRoZSBlZGdlLlxuICogQHBhcmFtIHtzdHJpbmd9ICB0YXJnZXQgICAgICAgLSBUYXJnZXQgb2YgdGhlIGVkZ2UuXG4gKiBAcGFyYW0ge29iamVjdH0gIGF0dHJpYnV0ZXMgICAtIEVkZ2UncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRWRnZURhdGEodW5kaXJlY3RlZCwga2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICB0aGlzLnVuZGlyZWN0ZWQgPSB1bmRpcmVjdGVkO1xuXG4gIC8vIEV4dHJlbWl0aWVzXG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgSW5kZXhlcyBGdW5jdGlvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQnVuY2ggb2YgZnVuY3Rpb25zIHVzZWQgdG8gY29tcHV0ZSBvciBjbGVhciBpbmRleGVzLlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gdXBkYXRpbmcgdGhlICdzdHJ1Y3R1cmUnIGluZGV4IHdpdGggdGhlIGdpdmVuIGVkZ2UncyBkYXRhLlxuICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIHRoZSBtdWx0aSBncmFwaCwgcmVsYXRlZCBlZGdlcyBhcmUgc3RvcmVkIGluIGFcbiAqIHNldCB0aGF0IGlzIHRoZSBzYW1lIGZvciBBIC0+IEIgJiBCIDwtIEEuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RWRnZURhdGF9IGVkZ2VEYXRhICAgLSBBZGRlZCBlZGdlJ3MgZGF0YS5cbiAqIEBwYXJhbSB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0ge05vZGVEYXRhfSB0YXJnZXREYXRhIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RydWN0dXJlSW5kZXgoXG4gIGdyYXBoLFxuICB1bmRpcmVjdGVkLFxuICBlZGdlRGF0YSxcbiAgc291cmNlLFxuICB0YXJnZXQsXG4gIHNvdXJjZURhdGEsXG4gIHRhcmdldERhdGFcbikge1xuICBjb25zdCBtdWx0aSA9IGdyYXBoLm11bHRpO1xuXG4gIGxldCBvdXRLZXkgPSAnb3V0JztcbiAgbGV0IGluS2V5ID0gJ2luJztcblxuICBpZiAodW5kaXJlY3RlZCkgb3V0S2V5ID0gaW5LZXkgPSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IGFkaiwgY29udGFpbmVyO1xuXG4gIGlmIChtdWx0aSkge1xuICAgIC8vIEhhbmRsaW5nIHNvdXJjZVxuICAgIGFkaiA9IHNvdXJjZURhdGFbb3V0S2V5XTtcbiAgICBjb250YWluZXIgPSBhZGpbdGFyZ2V0XTtcblxuICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29udGFpbmVyID0gbmV3IFNldCgpO1xuICAgICAgYWRqW3RhcmdldF0gPSBjb250YWluZXI7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLmFkZChlZGdlRGF0YSk7XG5cbiAgICAvLyBJZiBzZWxmTG9vcCwgd2UgYnJlYWsgaGVyZVxuICAgIGlmIChzb3VyY2UgPT09IHRhcmdldCAmJiB1bmRpcmVjdGVkKSByZXR1cm47XG5cbiAgICAvLyBIYW5kbGluZyB0YXJnZXQgKHdlIHdvbid0IGFkZCB0aGUgZWRnZSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHRha2VuXG4gICAgLy8gY2FyZSBvZiB3aXRoIHNvdXJjZSBhYm92ZSlcbiAgICBhZGogPSB0YXJnZXREYXRhW2luS2V5XTtcbiAgICBpZiAodHlwZW9mIGFkaltzb3VyY2VdID09PSAndW5kZWZpbmVkJykgYWRqW3NvdXJjZV0gPSBjb250YWluZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gSGFuZGxpbmcgc291cmNlXG4gICAgc291cmNlRGF0YVtvdXRLZXldW3RhcmdldF0gPSBlZGdlRGF0YTtcblxuICAgIC8vIElmIHNlbGZMb29wLCB3ZSBicmVhayBoZXJlXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0ICYmIHVuZGlyZWN0ZWQpIHJldHVybjtcblxuICAgIC8vIEhhbmRsaW5nIHRhcmdldFxuICAgIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV0gPSBlZGdlRGF0YTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSAnc3RydWN0dXJlJyBpbmRleCBkYXRhIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGVkZ2UuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0VkZ2VEYXRhfSBlZGdlRGF0YSAtIERyb3BwZWQgZWRnZSdzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVkZ2VGcm9tU3RydWN0dXJlSW5kZXgoZ3JhcGgsIHVuZGlyZWN0ZWQsIGVkZ2VEYXRhKSB7XG4gIGNvbnN0IG11bHRpID0gZ3JhcGgubXVsdGk7XG5cbiAgY29uc3Qge3NvdXJjZTogc291cmNlRGF0YSwgdGFyZ2V0OiB0YXJnZXREYXRhfSA9IGVkZ2VEYXRhO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZURhdGEua2V5LFxuICAgIHRhcmdldCA9IHRhcmdldERhdGEua2V5O1xuXG4gIC8vIE5PVEU6IHNpbmNlIHRoZSBlZGdlIHNldCBpcyB0aGUgc2FtZSBmb3Igc291cmNlICYgdGFyZ2V0LCB3ZSBjYW4gb25seVxuICAvLyBhZmZlY3Qgc291cmNlXG4gIGNvbnN0IG91dEtleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnb3V0JyxcbiAgICBzb3VyY2VJbmRleCA9IHNvdXJjZURhdGFbb3V0S2V5XTtcblxuICBjb25zdCBpbktleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnaW4nO1xuXG4gIGlmICh0YXJnZXQgaW4gc291cmNlSW5kZXgpIHtcbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGNvbnN0IHNldCA9IHNvdXJjZUluZGV4W3RhcmdldF07XG5cbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMSkge1xuICAgICAgICBkZWxldGUgc291cmNlSW5kZXhbdGFyZ2V0XTtcbiAgICAgICAgZGVsZXRlIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXQuZGVsZXRlKGVkZ2VEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgZGVsZXRlIHNvdXJjZUluZGV4W3RhcmdldF07XG4gIH1cblxuICBpZiAobXVsdGkpIHJldHVybjtcblxuICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldERhdGFbaW5LZXldO1xuXG4gIGRlbGV0ZSB0YXJnZXRJbmRleFtzb3VyY2VdO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSB3aG9sZSAnc3RydWN0dXJlJyBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSBncmFwaCAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU3RydWN0dXJlSW5kZXgoZ3JhcGgpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgbGV0IHN0ZXA7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBzdGVwLnZhbHVlLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIHVwZ3JhZGUgYSBzaW1wbGUgYHN0cnVjdHVyZWAgaW5kZXggdG8gYSBtdWx0aSBvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgZ3JhcGggLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpKGdyYXBoKSB7XG4gIGdyYXBoLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBub2RlKSA9PiB7XG4gICAgLy8gRGlyZWN0ZWRcbiAgICBpZiAoZGF0YS5vdXQpIHtcbiAgICAgIGZvciAoY29uc3QgbmVpZ2hib3IgaW4gZGF0YS5vdXQpIHtcbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLm91dFtuZWlnaGJvcl0pO1xuICAgICAgICBkYXRhLm91dFtuZWlnaGJvcl0gPSBlZGdlcztcbiAgICAgICAgZ3JhcGguX25vZGVzLmdldChuZWlnaGJvcikuaW5bbm9kZV0gPSBlZGdlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVbmRpcmVjdGVkXG4gICAgaWYgKGRhdGEudW5kaXJlY3RlZCkge1xuICAgICAgZm9yIChjb25zdCBuZWlnaGJvciBpbiBkYXRhLnVuZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKG5laWdoYm9yID4gbm9kZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLnVuZGlyZWN0ZWRbbmVpZ2hib3JdKTtcbiAgICAgICAgZGF0YS51bmRpcmVjdGVkW25laWdoYm9yXSA9IGVkZ2VzO1xuICAgICAgICBncmFwaC5fbm9kZXMuZ2V0KG5laWdoYm9yKS51bmRpcmVjdGVkW25vZGVdID0gZWRnZXM7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTm9kZSBBdHRyaWJ1dGVzIG1ldGhvZHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YXNzaWduLCBpc1BsYWluT2JqZWN0fSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsIE5vdEZvdW5kR3JhcGhFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuY29uc3QgTk9ERSA9IDA7XG5jb25zdCBTT1VSQ0UgPSAxO1xuY29uc3QgVEFSR0VUID0gMjtcbmNvbnN0IE9QUE9TSVRFID0gMztcblxuZnVuY3Rpb24gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gIGdyYXBoLFxuICBtZXRob2QsXG4gIG1vZGUsXG4gIG5vZGVPckVkZ2UsXG4gIG5hbWVPckVkZ2UsXG4gIGFkZDEsXG4gIGFkZDJcbikge1xuICBsZXQgbm9kZURhdGEsIGVkZ2VEYXRhLCBhcmcxLCBhcmcyO1xuXG4gIG5vZGVPckVkZ2UgPSAnJyArIG5vZGVPckVkZ2U7XG5cbiAgaWYgKG1vZGUgPT09IE5PREUpIHtcbiAgICBub2RlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQobm9kZU9yRWRnZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlT3JFZGdlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhcmcxID0gbmFtZU9yRWRnZTtcbiAgICBhcmcyID0gYWRkMTtcbiAgfSBlbHNlIGlmIChtb2RlID09PSBPUFBPU0lURSkge1xuICAgIG5hbWVPckVkZ2UgPSAnJyArIG5hbWVPckVkZ2U7XG5cbiAgICBlZGdlRGF0YSA9IGdyYXBoLl9lZGdlcy5nZXQobmFtZU9yRWRnZSk7XG5cbiAgICBpZiAoIWVkZ2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtuYW1lT3JFZGdlfVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2UgPSBlZGdlRGF0YS5zb3VyY2Uua2V5O1xuICAgIGNvbnN0IHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gc291cmNlKSB7XG4gICAgICBub2RlRGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcbiAgICB9IGVsc2UgaWYgKG5vZGVPckVkZ2UgPT09IHRhcmdldCkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBub2RlIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgXCIke25hbWVPckVkZ2V9XCIgZWRnZSAoJHtzb3VyY2V9LCAke3RhcmdldH0pLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXJnMSA9IGFkZDE7XG4gICAgYXJnMiA9IGFkZDI7XG4gIH0gZWxzZSB7XG4gICAgZWRnZURhdGEgPSBncmFwaC5fZWRnZXMuZ2V0KG5vZGVPckVkZ2UpO1xuXG4gICAgaWYgKCFlZGdlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKG1vZGUgPT09IFNPVVJDRSkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVEYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuICAgIH1cblxuICAgIGFyZzEgPSBuYW1lT3JFZGdlO1xuICAgIGFyZzIgPSBhZGQxO1xuICB9XG5cbiAgcmV0dXJuIFtub2RlRGF0YSwgYXJnMSwgYXJnMl07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVHZXR0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UpIHtcbiAgICBjb25zdCBbZGF0YV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2VcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlU2V0dGVyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSwgYWRkMikge1xuICAgIGNvbnN0IFtkYXRhLCBuYW1lLCB2YWx1ZV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxLFxuICAgICAgYWRkMlxuICAgICk7XG5cbiAgICBkYXRhLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxLCBhZGQyKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWUsIHVwZGF0ZXJdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMSxcbiAgICAgIGFkZDJcbiAgICApO1xuXG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiB1cGRhdGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YS5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHZhbHVlID0gdXBkYXRlcihhdHRyaWJ1dGVzW25hbWVdKTtcblxuICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGRhdGEuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGFzc2lnbihkYXRhLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UsIGFkZDEpIHtcbiAgICBjb25zdCBbZGF0YSwgdXBkYXRlcl0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxXG4gICAgKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgTk9ERV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIE5PREVfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3Igbm9kZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnTm9kZScpLCBOT0RFKTtcblxuICAgIC8vIEZvciBzb3VyY2VzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ1NvdXJjZScpLCBTT1VSQ0UpO1xuXG4gICAgLy8gRm9yIHRhcmdldHNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnVGFyZ2V0JyksIFRBUkdFVCk7XG5cbiAgICAvLyBGb3Igb3Bwb3NpdGVzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ09wcG9zaXRlJyksIE9QUE9TSVRFKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEVkZ2UgQXR0cmlidXRlcyBtZXRob2RzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Fzc2lnbiwgaXNQbGFpbk9iamVjdCwgZ2V0TWF0Y2hpbmdFZGdlfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7XG4gIEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLFxuICBOb3RGb3VuZEdyYXBoRXJyb3IsXG4gIFVzYWdlR3JhcGhFcnJvclxufSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgZ2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHttaXhlZH0gICAgICAgICAgLSBUaGUgYXR0cmlidXRlJ3MgdmFsdWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlc1tuYW1lXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlcyBnZXR0ZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSB0YXJnZXQgZWxlbWVudCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAtIFRoZSBlbGVtZW50J3MgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhcmd1bWVudHNbMV07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09ICh0eXBlID09PSAndW5kaXJlY3RlZCcpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiICR7dHlwZX0gZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLmF0dHJpYnV0ZXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSBjaGVja2VyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGlzIHNldCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgc2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge21peGVkfSAgdmFsdWUgICAtIE5ldyBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKiBAcGFyYW0gIHttaXhlZH0gIHZhbHVlICAgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIG5hbWU7XG5cbiAgICAgIG5hbWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1szXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSB1cGRhdGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogVXBkYXRlIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkgdXNpbmdcbiAgICogdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHVwZGF0ZXIpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMykge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbM107XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHVwZGF0ZXIgc2hvdWxkIGJlIGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXNbbmFtZV0pO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnc2V0JyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVtb3ZlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVSZW1vdmVyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZGVzaXJlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lICAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBTb3VyY2UgZWxlbWVudC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVwbGFjZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBtZXRob2QgICAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgICAgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTmV3IGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBOZXcgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhdHRyaWJ1dGVzO1xuXG4gICAgICBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3JlcGxhY2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlIG1lcmdlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIE1lcmdlIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50ICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gbWVyZ2UuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIGF0dHJpYnV0ZXM7XG5cbiAgICAgIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYXR0cmlidXRlcykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC5gXG4gICAgICApO1xuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhc3NpZ24oZGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgdXBkYXRlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIFVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCB1cGRhdGVyKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIHVwZGF0ZXI7XG5cbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIHVwZGF0ZXIgaXMgbm90IGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgRURHRV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIEVER0VfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3IgZWRnZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnRWRnZScpLCAnbWl4ZWQnKTtcblxuICAgIC8vIEZvciBkaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdEaXJlY3RlZEVkZ2UnKSwgJ2RpcmVjdGVkJyk7XG5cbiAgICAvLyBGb3IgdW5kaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdVbmRpcmVjdGVkRWRnZScpLCAndW5kaXJlY3RlZCcpO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIENoYWluIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBWYXJpYWRpYyBmdW5jdGlvbiBjb21iaW5pbmcgdGhlIGdpdmVuIGl0ZXJhYmxlcy5cbiAqL1xudmFyIEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9pdGVyYXRvci5qcycpLFxuICBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogQ2hhaW4uXG4gKlxuICogQHBhcmFtICB7Li4uSXRlcmF0b3J9IGl0ZXJhYmxlcyAtIFRhcmdldCBpdGVyYWJsZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjaGFpbigpIHtcbiAgdmFyIGl0ZXJhYmxlcyA9IGFyZ3VtZW50cyxcbiAgICBjdXJyZW50LFxuICAgIGkgPSAtMTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIGl0ZXJhdGUoKSB7XG4gICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICBpKys7XG5cbiAgICAgIGlmIChpID49IGl0ZXJhYmxlcy5sZW5ndGgpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICAgIGN1cnJlbnQgPSBpdGVyKGl0ZXJhYmxlc1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIHN0ZXAgPSBjdXJyZW50Lm5leHQoKTtcblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuIGl0ZXJhdGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcDtcbiAgfSk7XG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBFZGdlIEl0ZXJhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlciBhXG4gKiBncmFwaCdzIGVkZ2VzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLCBOb3RGb3VuZEdyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IEVER0VTX0lURVJBVElPTiA9IFtcbiAge1xuICAgIG5hbWU6ICdlZGdlcycsXG4gICAgdHlwZTogJ21peGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luRWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0RWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnb3V0J1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luYm91bmRFZGdlcycsXG4gICAgdHlwZTogJ21peGVkJyxcbiAgICBkaXJlY3Rpb246ICdpbidcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdvdXRib3VuZEVkZ2VzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAndW5kaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBGdW5jdGlvbiBjb2xsZWN0aW5nIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHthcnJheX0gIGVkZ2VzICAtIEVkZ2VzIGFycmF5IHRvIHBvcHVsYXRlLlxuICogQHBhcmFtICB7b2JqZWN0fSBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBUaGUgZm91bmQgZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTaW1wbGUoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSBlZGdlcy5wdXNoKG9iamVjdFtrXS5rZXkpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0TXVsdGkoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KVxuICAgIG9iamVjdFtrXS5mb3JFYWNoKGVkZ2VEYXRhID0+IGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoU2ltcGxlKG9iamVjdCwgY2FsbGJhY2ssIGF2b2lkKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBpZiAoayA9PT0gYXZvaWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTXVsdGkob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBvYmplY3Rba10uZm9yRWFjaChlZGdlRGF0YSA9PlxuICAgICAgY2FsbGJhY2soXG4gICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdCB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1wbGUob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgbGV0IHNob3VsZEJyZWFrID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGZpbmRNdWx0aShvYmplY3QsIGNhbGxiYWNrLCBhdm9pZCkge1xuICBsZXQgaXRlcmF0b3IsIHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2UsIHRhcmdldDtcblxuICBsZXQgc2hvdWxkQnJlYWsgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGsgPT09IGF2b2lkKSBjb250aW51ZTtcblxuICAgIGl0ZXJhdG9yID0gb2JqZWN0W2tdLnZhbHVlcygpO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICAgIHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2Uua2V5LFxuICAgICAgICB0YXJnZXQua2V5LFxuICAgICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhLmtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhdG9yKG9iamVjdCwgYXZvaWQpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCksXG4gICAgbCA9IGtleXMubGVuZ3RoO1xuXG4gIGxldCBpbm5lciA9IG51bGwsXG4gICAgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuICAgIGxldCBlZGdlRGF0YTtcblxuICAgIGlmIChpbm5lcikge1xuICAgICAgY29uc3Qgc3RlcCA9IGlubmVyLm5leHQoKTtcblxuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICBpbm5lciA9IG51bGw7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgICBjb25zdCBrID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGsgPT09IGF2b2lkKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICBpbm5lciA9IGVkZ2VEYXRhLnZhbHVlcygpO1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZWRnZTogZWRnZURhdGEua2V5LFxuICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2U6IGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICAgIHRhcmdldDogZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZXM6IGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICB1bmRpcmVjdGVkOiBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY29sbGVjdGluZyBlZGdlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgZWRnZXMgIC0gRWRnZXMgYXJyYXkgdG8gcG9wdWxhdGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9iamVjdCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gIGsgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgIC0gVGhlIGZvdW5kIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Rm9yS2V5U2ltcGxlKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZvcktleU11bHRpKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZXNEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZXNEYXRhKSByZXR1cm47XG5cbiAgZWRnZXNEYXRhLmZvckVhY2goZWRnZURhdGEgPT4gZWRnZXMucHVzaChlZGdlRGF0YS5rZXkpKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB1c2luZ1xuICogYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge21peGVkfSAgICBrICAgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoRm9yS2V5U2ltcGxlKG9iamVjdCwgaywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgY2FsbGJhY2soXG4gICAgZWRnZURhdGEua2V5LFxuICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgc291cmNlRGF0YS5rZXksXG4gICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzRGF0YS5mb3JFYWNoKGVkZ2VEYXRhID0+XG4gICAgY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB0byBtYXRjaFxuICogb25lIG9mIHRoZW0uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAqL1xuZnVuY3Rpb24gZmluZEZvcktleVNpbXBsZShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZURhdGEpIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gIGlmIChcbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKVxuICAgIHJldHVybiBlZGdlRGF0YS5rZXk7XG59XG5cbmZ1bmN0aW9uIGZpbmRGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZWRnZXNEYXRhLnZhbHVlcygpO1xuICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICBzaG91bGRCcmVhayA9IGNhbGxiYWNrKFxuICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS50YXJnZXQuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBlZ2RlcyBmcm9tIHRoZSBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSXRlcmF0b3JGb3JLZXkob2JqZWN0LCBrKSB7XG4gIGNvbnN0IHYgPSBvYmplY3Rba107XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHYudmFsdWVzKCk7XG5cbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHNvdXJjZTogZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0QXR0cmlidXRlczogZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdW5kaXJlY3RlZDogZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIEl0ZXJhdG9yLm9mKFtcbiAgICB2LmtleSxcbiAgICB2LmF0dHJpYnV0ZXMsXG4gICAgdi5zb3VyY2Uua2V5LFxuICAgIHYudGFyZ2V0LmtleSxcbiAgICB2LnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgIHYudGFyZ2V0LmF0dHJpYnV0ZXNcbiAgXSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBBcnJheSBvZiBlZGdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWRnZUFycmF5KGdyYXBoLCB0eXBlKSB7XG4gIGlmIChncmFwaC5zaXplID09PSAwKSByZXR1cm4gW107XG5cbiAgaWYgKHR5cGUgPT09ICdtaXhlZCcgfHwgdHlwZSA9PT0gZ3JhcGgudHlwZSkge1xuICAgIGlmICh0eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGdyYXBoLl9lZGdlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UoZ3JhcGguX2VkZ2VzLmtleXMoKSwgZ3JhcGguX2VkZ2VzLnNpemUpO1xuICB9XG5cbiAgY29uc3Qgc2l6ZSA9XG4gICAgdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnID8gZ3JhcGgudW5kaXJlY3RlZFNpemUgOiBncmFwaC5kaXJlY3RlZFNpemU7XG5cbiAgY29uc3QgbGlzdCA9IG5ldyBBcnJheShzaXplKSxcbiAgICBtYXNrID0gdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX2VkZ2VzLnZhbHVlcygpO1xuXG4gIGxldCBpID0gMDtcbiAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChkYXRhLnVuZGlyZWN0ZWQgPT09IG1hc2spIGxpc3RbaSsrXSA9IGRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hFZGdlKGdyYXBoLCB0eXBlLCBjYWxsYmFjaykge1xuICBpZiAoZ3JhcGguc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBsZXQgc3RlcCwgZGF0YTtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fZWRnZXMudmFsdWVzKCk7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChzaG91bGRGaWx0ZXIgJiYgZGF0YS51bmRpcmVjdGVkICE9PSBtYXNrKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHtrZXksIGF0dHJpYnV0ZXMsIHNvdXJjZSwgdGFyZ2V0fSA9IGRhdGE7XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGtleSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2Uua2V5LFxuICAgICAgdGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBkYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2sgdG8gbWF0Y2ggb25lIG9mXG4gKiB0aGVtLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZShncmFwaCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBzaG91bGRGaWx0ZXIgPSB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IGdyYXBoLnR5cGU7XG4gIGNvbnN0IG1hc2sgPSB0eXBlID09PSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IHN0ZXAsIGRhdGE7XG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgIGRhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qge2tleSwgYXR0cmlidXRlcywgc291cmNlLCB0YXJnZXR9ID0gZGF0YTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBrZXksXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgc291cmNlLmtleSxcbiAgICAgIHRhcmdldC5rZXksXG4gICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIHRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YS51bmRpcmVjdGVkXG4gICAgKTtcblxuICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjcmVhdGluZyBhbiBpdGVyYXRvciBvZiBlZGdlcyBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3IoZ3JhcGgsIHR5cGUpIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybiBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGVkZ2U6IGRhdGEua2V5LFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgc291cmNlOiBkYXRhLnNvdXJjZS5rZXksXG4gICAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZUF0dHJpYnV0ZXM6IGRhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICB0YXJnZXRBdHRyaWJ1dGVzOiBkYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgdW5kaXJlY3RlZDogZGF0YS51bmRpcmVjdGVkXG4gICAgfTtcblxuICAgIHJldHVybiB7dmFsdWUsIGRvbmU6IGZhbHNlfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlICYgdGhlIGdpdmVuIG5vZGUuXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIGNvbnN0IGVkZ2VzID0gW107XG5cbiAgY29uc3QgZm4gPSBtdWx0aSA/IGNvbGxlY3RNdWx0aSA6IGNvbGxlY3RTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSBmbihlZGdlcywgbm9kZURhdGEuaW4pO1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIGZuKGVkZ2VzLCBub2RlRGF0YS5vdXQpO1xuXG4gICAgLy8gSGFuZGxpbmcgc2VsZiBsb29wIGVkZ2UgY2FzZVxuICAgIGlmICghZGlyZWN0aW9uICYmIG5vZGVEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihub2RlRGF0YS5rZXkpLCAxKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4oZWRnZXMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gIG11bHRpICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpIG9yIG5vdC5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICBjb25zdCBmbiA9IG11bHRpID8gZm9yRWFjaE11bHRpIDogZm9yRWFjaFNpbXBsZTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIGZuKG5vZGVEYXRhLmluLCBjYWxsYmFjayk7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKG5vZGVEYXRhLm91dCwgY2FsbGJhY2ssICFkaXJlY3Rpb24gPyBub2RlRGF0YS5rZXkgOiBudWxsKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjayB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZUZvck5vZGUobXVsdGksIHR5cGUsIGRpcmVjdGlvbiwgbm9kZURhdGEsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kTXVsdGkgOiBmaW5kU2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEub3V0LCBjYWxsYmFjaywgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvdW5kID0gZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZURhdGEgIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVkZ2VJdGVyYXRvckZvck5vZGUodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSkge1xuICBsZXQgaXRlcmF0b3IgPSBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnb3V0JyAmJiB0eXBlb2Ygbm9kZURhdGEuaW4gIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEuaW4pKTtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nICYmIHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihcbiAgICAgICAgaXRlcmF0b3IsXG4gICAgICAgIGNyZWF0ZUl0ZXJhdG9yKG5vZGVEYXRhLm91dCwgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpXG4gICAgICApO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcgJiYgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEudW5kaXJlY3RlZCkpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNyZWF0aW5nIGFuIGFycmF5IG9mIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcmV0dXJuIHthcnJheX0gICAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JQYXRoKHR5cGUsIG11bHRpLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEsIHRhcmdldCkge1xuICBjb25zdCBmbiA9IG11bHRpID8gY29sbGVjdEZvcktleU11bHRpIDogY29sbGVjdEZvcktleVNpbXBsZTtcblxuICBjb25zdCBlZGdlcyA9IFtdO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEuaW4gIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ291dCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS5pbiwgdGFyZ2V0KTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKGVkZ2VzLCBzb3VyY2VEYXRhLm91dCwgdGFyZ2V0KTtcblxuICAgIC8vIEhhbmRsaW5nIHNlbGYgbG9vcCBlZGdlIGNhc2VcbiAgICBpZiAoIWRpcmVjdGlvbiAmJiBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihzb3VyY2VEYXRhLmtleSksIDEpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEudW5kaXJlY3RlZCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBtdWx0aSAgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uICAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge05vZGVEYXRhfSBzb3VyY2VEYXRhIC0gU291cmNlIG5vZGUncyBkYXRhLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHRhcmdldCAgICAgLSBUYXJnZXQgbm9kZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JQYXRoKFxuICB0eXBlLFxuICBtdWx0aSxcbiAgZGlyZWN0aW9uLFxuICBzb3VyY2VEYXRhLFxuICB0YXJnZXQsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgZm4gPSBtdWx0aSA/IGZvckVhY2hGb3JLZXlNdWx0aSA6IGZvckVhY2hGb3JLZXlTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5pbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZGlyZWN0aW9uICE9PSAnb3V0JylcbiAgICAgIGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHNvdXJjZURhdGEua2V5ICE9PSB0YXJnZXQpXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEub3V0ICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdpbicpXG4gICAgICAgIGZuKHNvdXJjZURhdGEub3V0LCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgZm4oc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgICAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRFZGdlRm9yUGF0aCh0eXBlLCBtdWx0aSwgZGlyZWN0aW9uLCBzb3VyY2VEYXRhLCB0YXJnZXQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kRm9yS2V5TXVsdGkgOiBmaW5kRm9yS2V5U2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3VuZCA9IGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlRGF0YS5rZXkgIT09IHRhcmdldClcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJykge1xuICAgICAgICBmb3VuZCA9IGZuKFxuICAgICAgICAgIHNvdXJjZURhdGEub3V0LFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAhZGlyZWN0aW9uID8gc291cmNlRGF0YS5rZXkgOiBudWxsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm91bmQgPSBmbihzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZm9yIHRoZSBnaXZlbiBwYXRoLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdGFyZ2V0ICAgICAtIFRhcmdldCBub2RlLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrICAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KSB7XG4gIGxldCBpdGVyYXRvciA9IEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgZGlyZWN0aW9uICE9PSAnb3V0JyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEuaW5cbiAgICApXG4gICAgICBpdGVyYXRvciA9IGNoYWluKGl0ZXJhdG9yLCBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLmluLCB0YXJnZXQpKTtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLm91dCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGRpcmVjdGlvbiAhPT0gJ2luJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEub3V0XG4gICAgKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3JGb3JLZXkoc291cmNlRGF0YS5vdXQsIHRhcmdldCkpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldClcbiAgICAgICk7XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3I7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGFuIGVkZ2UgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXJyYXlDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgY2VydGFpbiBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMDogUmV0dXJuIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqXG4gICAqIEFyaXR5IDE6IFJldHVybiBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlICAgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQXJpdHkgMjogUmV0dXJuIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHthcnJheXxudW1iZXJ9IC0gVGhlIGVkZ2VzIG9yIHRoZSBudW1iZXIgb2YgZWRnZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNyZWF0ZUVkZ2VBcnJheSh0aGlzLCB0eXBlKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXNcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBub2RlRGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUFycmF5Rm9yUGF0aChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBzb3VyY2VEYXRhLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDAsIDEgb3IgMiBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBhIGVkZ2UgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZm9yRWFjaE5hbWUgPSAnZm9yRWFjaCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgYnkgYXBwbHlpbmcgdGhlIGdpdmVuXG4gICAqIGNhbGxiYWNrLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpIHJldHVybjtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjYWxsYmFjayA9IHNvdXJjZTtcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZSh0aGlzLCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgY2FsbGJhY2sgPSB0YXJnZXQ7XG5cbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke2ZvckVhY2hOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciBhIG5vZGUncyBlZGdlc1xuICAgICAgLy8gVE9ETzogbWF5YmUgYXR0YWNoIHRoZSBzdWIgbWV0aG9kIHRvIHRoZSBpbnN0YW5jZSBkeW5hbWljYWxseT9cbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvck5vZGUoXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIG5vZGVEYXRhLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7Zm9yRWFjaE5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvclBhdGgoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgc291cmNlRGF0YSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDEsIDIgb3IgMyBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBtYXBwaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGJ5IGFwcGx5aW5nIHRoZSBnaXZlblxuICAgKiBjYWxsYmFjay5cbiAgICpcbiAgICogQXJpdHkgMTogTWFwIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogTWFwIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogTWFwIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIGNvbnN0IG1hcE5hbWUgPSAnbWFwJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG5cbiAgQ2xhc3MucHJvdG90eXBlW21hcE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGxldCByZXN1bHQ7XG5cbiAgICAvLyBXZSBrbm93IHRoZSByZXN1bHQgbGVuZ3RoIGJlZm9yZWhhbmRcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykgbGVuZ3RoICs9IHRoaXMudW5kaXJlY3RlZFNpemU7XG4gICAgICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSBsZW5ndGggKz0gdGhpcy5kaXJlY3RlZFNpemU7XG5cbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG4gICAgICBsZXQgaSA9IDA7XG5cbiAgICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgcmVzdWx0IGxlbmd0aCBiZWZvcmVoYW5kXG4gICAgLy8gVE9ETzogd2UgY2FuIGluIHNvbWUgaW5zdGFuY2VzIG9mIHNpbXBsZSBncmFwaHMsIGtub3dpbmcgZGVncmVlXG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVcbiAgICogZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEZpbHRlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogRmlsdGVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogRmlsdGVyIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBmaWx0ZXJOYW1lID0gJ2ZpbHRlcicgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtmaWx0ZXJOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgaWYgKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKSByZXN1bHQucHVzaChlKTtcbiAgICB9KTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgdXNpbmcgdGhlIHByb3ZpZGVkIGFjY3VtdWxhdG9yXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBSZWR1Y2UgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDI6IFJlZHVjZSBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDM6IFJlZHVjZSB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgICAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgcmVkdWNlTmFtZSA9ICdyZWR1Y2UnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbcmVkdWNlTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMiB8fCBhcmdzLmxlbmd0aCA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoZXhwZWN0aW5nIDIsIDMgb3IgNCBhbmQgZ290ICR7YXJncy5sZW5ndGh9KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMl0gIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IG1pc3NpbmcgaW5pdGlhbCB2YWx1ZS4gWW91IG11c3QgcHJvdmlkZSBpdCBiZWNhdXNlIHRoZSBjYWxsYmFjayB0YWtlcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGFuZCB3ZSBjYW5ub3QgaW5mZXIgdGhlIGluaXRpYWwgdmFsdWUgZnJvbSB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhcyB5b3UgY291bGQgd2l0aCBhIHNpbXBsZSBhcnJheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgaW5pdGlhbFZhbHVlO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICBpbml0aWFsVmFsdWUgPSBhcmdzWzFdO1xuICAgICAgYXJncyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbMl07XG4gICAgICBhcmdzID0gW2FyZ3NbMF1dO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1syXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbM107XG4gICAgICBhcmdzID0gW2FyZ3NbMF0sIGFyZ3NbMV1dO1xuICAgIH1cblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBicmVha2FibGUgZWRnZSBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoXG4gKiBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZmluZEVkZ2VOYW1lID0gJ2ZpbmQnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIG1hdGNoXG4gICAqIG9uZSBvZiB0aGVtIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbZmluZEVkZ2VOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY2FsbGJhY2sgPSBzb3VyY2U7XG4gICAgICByZXR1cm4gZmluZEVkZ2UodGhpcywgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIGNhbGxiYWNrID0gdGFyZ2V0O1xuXG4gICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAodHlwZW9mIG5vZGVEYXRhID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICAvLyBUT0RPOiBtYXliZSBhdHRhY2ggdGhlIHN1YiBtZXRob2QgdG8gdGhlIGluc3RhbmNlIGR5bmFtaWNhbGx5P1xuICAgICAgcmV0dXJuIGZpbmRFZGdlRm9yTm9kZShcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgdHlwZSA9PT0gJ21peGVkJyA/IHRoaXMudHlwZSA6IHR5cGUsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbm9kZURhdGEsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gZmluZEVkZ2VGb3JQYXRoKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIHNvdXJjZURhdGEsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7ZmluZEVkZ2VOYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMSwgMiBvciAzIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFueSBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtzb21lTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuXG4gICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZEVkZ2VOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFsbCBvZiB0aGVtIG1hdGNoZSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtldmVyeU5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgcmV0dXJuICFjYWxsYmFjayhlLCBlYSwgcywgdCwgc2EsIHRhLCB1KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kRWRnZU5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYW4gZWRnZSBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlSXRlcmF0b3JDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZTogb3JpZ2luYWxOYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgbmFtZSA9IG9yaWdpbmFsTmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIGVkZ2VzLlxuICAgKlxuICAgKiBBcml0eSAwOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMTogSXRlcmF0ZSBvdmVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgICAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgIHNvdXJjZSAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gICAqXG4gICAqIEByZXR1cm4ge2FycmF5fG51bWJlcn0gLSBUaGUgZWRnZXMgb3IgdGhlIG51bWJlciBvZiBlZGdlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3IodGhpcywgdHlwZSk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG5cbiAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUl0ZXJhdG9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtuYW1lfTogIGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIHNvdXJjZSBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMCwgMSBvciAyIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGV2ZXJ5IGVkZ2UgaXRlcmF0aW9uIG1ldGhvZCB0byB0aGUgR3JhcGggY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gR3JhcGggLSBHcmFwaCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgRURHRVNfSVRFUkFUSU9OLmZvckVhY2goZGVzY3JpcHRpb24gPT4ge1xuICAgIGF0dGFjaEVkZ2VBcnJheUNyZWF0b3IoR3JhcGgsIGRlc2NyaXB0aW9uKTtcbiAgICBhdHRhY2hGb3JFYWNoRWRnZShHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmRFZGdlKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gICAgYXR0YWNoRWRnZUl0ZXJhdG9yQ3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTmVpZ2hib3IgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlclxuICogbmVpZ2hib3JzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge05vdEZvdW5kR3JhcGhFcnJvciwgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IE5FSUdIQk9SU19JVEVSQVRJT04gPSBbXG4gIHtcbiAgICBuYW1lOiAnbmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnaW5OZWlnaGJvcnMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0TmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdpbmJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ2luJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ291dGJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZE5laWdoYm9ycycsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ3VuZGlyZWN0ZWROZWlnaGJvcnMnLFxuICAgIHR5cGU6ICd1bmRpcmVjdGVkJ1xuICB9XG5dO1xuXG4vKipcbiAqIEZ1bmN0aW9uIG1lcmdpbmcgbmVpZ2hib3JzIGludG8gdGhlIGdpdmVuIHNldCBpdGVyYXRpbmcgb3ZlciB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QmFzaWNTZXR9IG5laWdoYm9ycyAtIE5laWdoYm9ycyBzZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAgLSBUYXJnZXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBtZXJnZShuZWlnaGJvcnMsIG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IG5laWdoYm9yIGluIG9iamVjdCkgbmVpZ2hib3JzLmFkZChuZWlnaGJvcik7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgcmVsZXZhbnQgbmVpZ2hib3JzIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICBkaXJlY3Rpb24gLSBEaXJlY3Rpb24uXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICAgICAgIC0gVGhlIGxpc3Qgb2YgbmVpZ2hib3JzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVOZWlnaGJvckFycmF5Rm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIE9iamVjdC5rZXlzKG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gT2JqZWN0LmtleXMobm9kZURhdGFbZGlyZWN0aW9uXSk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IG5laWdoYm9ycyA9IG5ldyBTZXQoKTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIG1lcmdlKG5laWdoYm9ycywgbm9kZURhdGEuaW4pO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLm91dCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRha2UobmVpZ2hib3JzLnZhbHVlcygpLCBuZWlnaGJvcnMuc2l6ZSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdpdmVuIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYVxuICogY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlLFxuICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgIGNvbnN0IG5laWdoYm9yRGF0YSA9IHNvdXJjZURhdGEgPT09IG5vZGVEYXRhID8gdGFyZ2V0RGF0YSA6IHNvdXJjZURhdGE7XG5cbiAgICBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgb2JqZWN0LCBjYWxsYmFjaykge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNhbGxiYWNrKG5laWdoYm9yRGF0YS5rZXksIG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBnaXZlbiBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbSB1c2luZyBhIHByZWRpY2F0ZWQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmaW5kSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICAgIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBuZWlnaGJvckRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBvYmplY3QsIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBsZXQgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNvbnN0IHNob3VsZEJyZWFrID0gY2FsbGJhY2sobmVpZ2hib3JEYXRhLmtleSwgbmVpZ2hib3JEYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gbmVpZ2hib3JEYXRhLmtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaE5laWdoYm9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICAvLyBJZiB3ZSB3YW50IG9ubHkgdW5kaXJlY3RlZCBvciBpbiBvciBvdXQsIHdlIGNhbiByb2xsIHNvbWUgb3B0aW1pemF0aW9uc1xuICBpZiAodHlwZSAhPT0gJ21peGVkJykge1xuICAgIGlmICh0eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YVtkaXJlY3Rpb25dLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbiwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5vdXQsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvckVhY2hJbk9iamVjdE9uY2UodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTmVpZ2hib3IodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSwgY2FsbGJhY2spIHtcbiAgLy8gSWYgd2Ugd2FudCBvbmx5IHVuZGlyZWN0ZWQgb3IgaW4gb3Igb3V0LCB3ZSBjYW4gcm9sbCBzb21lIG9wdGltaXphdGlvbnNcbiAgaWYgKHR5cGUgIT09ICdtaXhlZCcpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGFbZGlyZWN0aW9uXSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gRWxzZSB3ZSBuZWVkIHRvIGtlZXAgYSBzZXQgb2YgbmVpZ2hib3JzIG5vdCB0byByZXR1cm4gZHVwbGljYXRlc1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEub3V0LCBjYWxsYmFjayk7XG5cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm91bmQgPSBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gbm9kZSdzIHJlbGV2YW50IG5laWdoYm9ycy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBuZWlnaGJvcnMuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gRGlyZWN0aW9uLlxuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgb2JqZWN0KSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgIGwgPSBrZXlzLmxlbmd0aDtcblxuICBsZXQgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrZXlzW2krK11dO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiB7bmVpZ2hib3I6IG5laWdoYm9yRGF0YS5rZXksIGF0dHJpYnV0ZXM6IG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzfVxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG9iamVjdCkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICBsID0ga2V5cy5sZW5ndGg7XG5cbiAgbGV0IGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tleXNbaSsrXV07XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZSxcbiAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5laWdoYm9yRGF0YS5rZXkpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgdmlzaXRlZC5hZGQobmVpZ2hib3JEYXRhLmtleSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZToge25laWdoYm9yOiBuZWlnaGJvckRhdGEua2V5LCBhdHRyaWJ1dGVzOiBuZWlnaGJvckRhdGEuYXR0cmlidXRlc31cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcih0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gY3JlYXRlT2JqZWN0SXRlcmF0b3Iobm9kZURhdGEsIG5vZGVEYXRhW2RpcmVjdGlvbl0pO1xuICB9XG5cbiAgbGV0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgICBpdGVyYXRvcixcbiAgICAgICAgY3JlYXRlRGVkdXBlZE9iamVjdEl0ZXJhdG9yKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLm91dClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgaXRlcmF0b3IsXG4gICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihDbGFzcywgZGVzY3JpcHRpb24pIHtcbiAgY29uc3Qge25hbWUsIHR5cGUsIGRpcmVjdGlvbn0gPSBkZXNjcmlwdGlvbjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5IG9mIGNlcnRhaW4gbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgbm9kZSAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEByZXR1cm4ge2FycmF5fSAtIFRoZSBuZWlnaGJvcnMgb2YgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIG5vZGUgaXMgbm90IGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtuYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JBcnJheUZvck5vZGUoXG4gICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIG5vZGVEYXRhXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGZvckVhY2hOYW1lID0gJ2ZvckVhY2gnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgZm9yRWFjaE5laWdoYm9yRm9yTm9kZShcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG1hcHBpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBtYXBOYW1lID0gJ21hcCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVttYXBOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIFRPRE86IG9wdGltaXplIHdoZW4gc2l6ZSBpcyBrbm93biBiZWZvcmVoYW5kXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2sobiwgYSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYSBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZmlsdGVyTmFtZSA9ICdmaWx0ZXInICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbZmlsdGVyTmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICBpZiAoY2FsbGJhY2sobiwgYSkpIHJlc3VsdC5wdXNoKG4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCByZWR1Y2VOYW1lID0gJ3JlZHVjZScgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtyZWR1Y2VOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtyZWR1Y2VOYW1lfTogbWlzc2luZyBpbml0aWFsIHZhbHVlLiBZb3UgbXVzdCBwcm92aWRlIGl0IGJlY2F1c2UgdGhlIGNhbGxiYWNrIHRha2VzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgYW5kIHdlIGNhbm5vdCBpbmZlciB0aGUgaW5pdGlhbCB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFzIHlvdSBjb3VsZCB3aXRoIGEgc2ltcGxlIGFycmF5LmBcbiAgICAgICk7XG5cbiAgICBsZXQgYWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbiwgYSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGEgYnJlYWthYmxlIG5laWdoYm9ycyBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlXG4gKiBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGNhcGl0YWxpemVkU2luZ3VsYXIgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICBjb25zdCBmaW5kTmFtZSA9ICdmaW5kJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZpbmROYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmaW5kTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgcmV0dXJuIGZpbmROZWlnaGJvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIGZpbmQgaWYgYW55IG9mIHRoZW1cbiAgICogbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW3NvbWVOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kTmFtZV0obm9kZSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdG8gZmluZCBpZiBhbGwgb2YgdGhlbVxuICAgKiBtYXRjaGUgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW2V2ZXJ5TmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICByZXR1cm4gIWNhbGxiYWNrKG4sIGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoTmVpZ2hib3JJdGVyYXRvckNyZWF0b3IoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgaXRlcmF0b3JOYW1lID0gbmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtpdGVyYXRvck5hbWVdID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7aXRlcmF0b3JOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGFcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBldmVyeSBuZWlnaGJvciBpdGVyYXRpb24gbWV0aG9kIHRvIHRoZSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIEdyYXBoIGNsYXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgTkVJR0hCT1JTX0lURVJBVElPTi5mb3JFYWNoKGRlc2NyaXB0aW9uID0+IHtcbiAgICBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZvckVhY2hOZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmROZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaE5laWdoYm9ySXRlcmF0b3JDcmVhdG9yKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogR3JhcGhvbG9neSBBZGphY2VuY3kgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEF0dGFjaGluZyBzb21lIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFcbiAqIGdyYXBoJ3MgYWRqYWNlbmN5LlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBzaW1wbGUgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoXG4gIGJyZWFrYWJsZSxcbiAgYXNzeW1ldHJpYyxcbiAgZGlzY29ubmVjdGVkTm9kZXMsXG4gIGdyYXBoLFxuICBjYWxsYmFja1xuKSB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX25vZGVzLnZhbHVlcygpO1xuXG4gIGNvbnN0IHR5cGUgPSBncmFwaC50eXBlO1xuXG4gIGxldCBzdGVwLCBzb3VyY2VEYXRhLCBuZWlnaGJvciwgYWRqLCBlZGdlRGF0YSwgdGFyZ2V0RGF0YSwgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBoYXNFZGdlcyA9IHRydWU7XG4gICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS5rZXksXG4gICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBhZGogPSBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGlmIChhc3N5bWV0cmljICYmIHNvdXJjZURhdGEua2V5ID4gbmVpZ2hib3IpIGNvbnRpbnVlO1xuXG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgIGhhc0VkZ2VzID0gdHJ1ZTtcbiAgICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICB0YXJnZXREYXRhLmtleSxcbiAgICAgICAgICBzb3VyY2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYnJlYWthYmxlICYmIHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbXVsdGkgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lNdWx0aShcbiAgYnJlYWthYmxlLFxuICBhc3N5bWV0cmljLFxuICBkaXNjb25uZWN0ZWROb2RlcyxcbiAgZ3JhcGgsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbiAgbGV0IHN0ZXA7XG4gIGxldCBzb3VyY2VEYXRhO1xuICBsZXQgbmVpZ2hib3I7XG4gIGxldCBjb250YWluZXI7XG4gIGxldCBjb250YWluZXJTdGVwO1xuICBsZXQgYWRqO1xuICBsZXQgZWRnZURhdGE7XG4gIGxldCB0YXJnZXREYXRhO1xuICBsZXQgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGFkaltuZWlnaGJvcl0udmFsdWVzKCk7XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICgoY29udGFpbmVyU3RlcCA9IGNvbnRhaW5lci5uZXh0KCkpLCBjb250YWluZXJTdGVwLmRvbmUgIT09IHRydWUpXG4gICAgICAgICkge1xuICAgICAgICAgIGVkZ2VEYXRhID0gY29udGFpbmVyU3RlcC52YWx1ZTtcbiAgICAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcblxuICAgICAgZm9yIChuZWlnaGJvciBpbiBhZGopIHtcbiAgICAgICAgaWYgKGFzc3ltZXRyaWMgJiYgc291cmNlRGF0YS5rZXkgPiBuZWlnaGJvcikgY29udGludWU7XG5cbiAgICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgKChjb250YWluZXJTdGVwID0gY29udGFpbmVyLm5leHQoKSksIGNvbnRhaW5lclN0ZXAuZG9uZSAhPT0gdHJ1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZWRnZURhdGEgPSBjb250YWluZXJTdGVwLnZhbHVlO1xuICAgICAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWRqYWNlbmN5SXRlcmF0b3JTaW1wbGUoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBhZGosXG4vLyAgICAgb2Zmc2V0O1xuXG4vLyAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbi8vICAgICBsZXQgc3RlcDtcblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ291dGVyJykge1xuLy8gICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuLy8gICAgICAgaWYgKHN0ZXAuZG9uZSA9PT0gdHJ1ZSkgcmV0dXJuIHN0ZXA7XG5cbi8vICAgICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4vLyAgICAgICBzdGF0ZSA9ICdkaXJlY3RlZCc7XG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG4vLyAgICAgICBuZWlnaGJvcnMgPSBPYmplY3Qua2V5cyhzb3VyY2VEYXRhLm91dCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEudW5kaXJlY3RlZCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItdW5kaXJlY3RlZCc7XG4vLyAgICAgfVxuXG4vLyAgICAgLy8gSW5uZXJcbi8vICAgICBpZiAob2Zmc2V0ID49IG5laWdoYm9ycy5sZW5ndGgpIHtcbi8vICAgICAgIGlmIChzdGF0ZSA9PT0gJ2lubmVyLXVuZGlyZWN0ZWQnKSBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICBlbHNlIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGNvbnN0IG5laWdoYm9yID0gbmVpZ2hib3JzW29mZnNldCsrXTtcbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IGFkaltuZWlnaGJvcl07XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2VLZXk6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkamFjZW5jeUl0ZXJhdG9yTXVsdGkoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBjb250YWluZXIgPSBudWxsLFxuLy8gICAgIGFkaixcbi8vICAgICBvZmZzZXQ7XG5cbi8vICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuLy8gICAgIGxldCBzdGVwO1xuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnb3V0ZXInKSB7XG4vLyAgICAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4vLyAgICAgICBpZiAoc3RlcC5kb25lID09PSB0cnVlKSByZXR1cm4gc3RlcDtcblxuLy8gICAgICAgc291cmNlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbi8vICAgICAgIHN0YXRlID0gJ2RpcmVjdGVkJztcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuLy8gICAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICBhZGogPSBzb3VyY2VEYXRhLm91dDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEub3V0KTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci1kaXJlY3RlZCc7XG5cbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAndW5kaXJlY3RlZCcpIHtcbi8vICAgICAgIGlmICh0eXBlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ291dGVyJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS51bmRpcmVjdGVkO1xuLy8gICAgICAgbmVpZ2hib3JzID0gT2JqZWN0LmtleXMoc291cmNlRGF0YS51bmRpcmVjdGVkKTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci11bmRpcmVjdGVkJztcbi8vICAgICB9XG5cbi8vICAgICAvLyBJbm5lclxuLy8gICAgIGlmICghY29udGFpbmVyICYmIG9mZnNldCA+PSBuZWlnaGJvcnMubGVuZ3RoKSB7XG4vLyAgICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJykgc3RhdGUgPSAnb3V0ZXInO1xuLy8gICAgICAgZWxzZSBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcblxuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBpZiAoIWNvbnRhaW5lcikge1xuLy8gICAgICAgY29uc3QgbmVpZ2hib3IgPSBuZWlnaGJvcnNbb2Zmc2V0KytdO1xuLy8gICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgc3RlcCA9IGNvbnRhaW5lci5uZXh0KCk7XG5cbi8vICAgICBpZiAoc3RlcC5kb25lKSB7XG4vLyAgICAgICBjb250YWluZXIgPSBudWxsO1xuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgU2VyaWFsaXphdGlvbiBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQ29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byB2YWxpZGF0ZSBpbXBvcnQtZXhwb3J0IGZvcm1hdHMgJiB0byBvdXB1dFxuICogdGhlbSBmcm9tIGludGVybmFsIGdyYXBoIGRhdGEuXG4gKlxuICogU2VyaWFsaXplZCBOb2RlOlxuICoge2tleSwgP2F0dHJpYnV0ZXN9XG4gKlxuICogU2VyaWFsaXplZCBFZGdlOlxuICoge2tleT8sIHNvdXJjZSwgdGFyZ2V0LCBhdHRyaWJ1dGVzPywgdW5kaXJlY3RlZD99XG4gKlxuICogU2VyaWFsaXplZCBHcmFwaDpcbiAqIHtub2Rlc1tdLCBlZGdlcz9bXX1cbiAqL1xuaW1wb3J0IHthc3NpZ24sIGlzUGxhaW5PYmplY3QsIGlzRW1wdHl9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgbm9kZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIG5vZGUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVOb2RlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge2tleX07XG5cbiAgaWYgKCFpc0VtcHR5KGRhdGEuYXR0cmlidXRlcykpXG4gICAgc2VyaWFsaXplZC5hdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgZWRnZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIGVkZ2UuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBlZGdlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgIGtleSxcbiAgICBzb3VyY2U6IGRhdGEuc291cmNlLmtleSxcbiAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleVxuICB9O1xuXG4gIGlmICghaXNFbXB0eShkYXRhLmF0dHJpYnV0ZXMpKVxuICAgIHNlcmlhbGl6ZWQuYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICBpZiAoZGF0YS51bmRpcmVjdGVkKSBzZXJpYWxpemVkLnVuZGlyZWN0ZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHNlcmlhbGl6ZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHttaXhlZH0gdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VyaWFsaXplZE5vZGUodmFsdWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgcmV0dXJuICdub3Qtb2JqZWN0JztcblxuICBpZiAoISgna2V5JyBpbiB2YWx1ZSkpIHJldHVybiAnbm8ta2V5JztcblxuICBpZiAoXG4gICAgJ2F0dHJpYnV0ZXMnIGluIHZhbHVlICYmXG4gICAgKCFpc1BsYWluT2JqZWN0KHZhbHVlLmF0dHJpYnV0ZXMpIHx8IHZhbHVlLmF0dHJpYnV0ZXMgPT09IG51bGwpXG4gIClcbiAgICByZXR1cm4gJ2ludmFsaWQtYXR0cmlidXRlcyc7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc2VyaWFsaXplZCBlZGdlLlxuICpcbiAqIEBwYXJhbSAge21peGVkfSB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZXJpYWxpemVkRWRnZSh2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gJ25vdC1vYmplY3QnO1xuXG4gIGlmICghKCdzb3VyY2UnIGluIHZhbHVlKSkgcmV0dXJuICduby1zb3VyY2UnO1xuXG4gIGlmICghKCd0YXJnZXQnIGluIHZhbHVlKSkgcmV0dXJuICduby10YXJnZXQnO1xuXG4gIGlmIChcbiAgICAnYXR0cmlidXRlcycgaW4gdmFsdWUgJiZcbiAgICAoIWlzUGxhaW5PYmplY3QodmFsdWUuYXR0cmlidXRlcykgfHwgdmFsdWUuYXR0cmlidXRlcyA9PT0gbnVsbClcbiAgKVxuICAgIHJldHVybiAnaW52YWxpZC1hdHRyaWJ1dGVzJztcblxuICBpZiAoJ3VuZGlyZWN0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51bmRpcmVjdGVkICE9PSAnYm9vbGVhbicpXG4gICAgcmV0dXJuICdpbnZhbGlkLXVuZGlyZWN0ZWQnO1xuXG4gIHJldHVybiBudWxsO1xufVxuIiwgIi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuLyoqXG4gKiBHcmFwaG9sb2d5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBncmFwaG9sb2d5IHNwZWNzLlxuICovXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBJdGVyYXRvciBmcm9tICdvYmxpdGVyYXRvci9pdGVyYXRvcic7XG5pbXBvcnQgdGFrZSBmcm9tICdvYmxpdGVyYXRvci90YWtlJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuaW1wb3J0IHtcbiAgTWl4ZWROb2RlRGF0YSxcbiAgRGlyZWN0ZWROb2RlRGF0YSxcbiAgVW5kaXJlY3RlZE5vZGVEYXRhLFxuICBFZGdlRGF0YVxufSBmcm9tICcuL2RhdGEnO1xuXG5pbXBvcnQge1xuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleCxcbiAgY2xlYXJFZGdlRnJvbVN0cnVjdHVyZUluZGV4LFxuICBjbGVhclN0cnVjdHVyZUluZGV4LFxuICB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpXG59IGZyb20gJy4vaW5kaWNlcyc7XG5cbmltcG9ydCBhdHRhY2hOb2RlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL25vZGVzJztcbmltcG9ydCBhdHRhY2hFZGdlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL2VkZ2VzJztcbmltcG9ydCBhdHRhY2hFZGdlSXRlcmF0aW9uTWV0aG9kcyBmcm9tICcuL2l0ZXJhdGlvbi9lZGdlcyc7XG5pbXBvcnQgYXR0YWNoTmVpZ2hib3JJdGVyYXRpb25NZXRob2RzIGZyb20gJy4vaXRlcmF0aW9uL25laWdoYm9ycyc7XG5pbXBvcnQge1xuICBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlLFxuICBmb3JFYWNoQWRqYWNlbmN5TXVsdGlcbn0gZnJvbSAnLi9pdGVyYXRpb24vYWRqYWNlbmN5JztcblxuaW1wb3J0IHtcbiAgc2VyaWFsaXplTm9kZSxcbiAgc2VyaWFsaXplRWRnZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkTm9kZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkRWRnZVxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5pbXBvcnQge1xuICBhc3NpZ24sXG4gIGdldE1hdGNoaW5nRWRnZSxcbiAgaXNHcmFwaCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgcHJpdmF0ZVByb3BlcnR5LFxuICByZWFkT25seVByb3BlcnR5LFxuICBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSxcbiAgdmFsaWRhdGVIaW50c1xufSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDb25zdGFudHMuXG4gKi9cbmNvbnN0IElOU1RBTkNFX0lEID0gaW5jcmVtZW50YWxJZFN0YXJ0aW5nRnJvbVJhbmRvbUJ5dGUoKTtcblxuLyoqXG4gKiBFbnVtcy5cbiAqL1xuY29uc3QgVFlQRVMgPSBuZXcgU2V0KFsnZGlyZWN0ZWQnLCAndW5kaXJlY3RlZCcsICdtaXhlZCddKTtcblxuY29uc3QgRU1JVFRFUl9QUk9QUyA9IG5ldyBTZXQoW1xuICAnZG9tYWluJyxcbiAgJ19ldmVudHMnLFxuICAnX2V2ZW50c0NvdW50JyxcbiAgJ19tYXhMaXN0ZW5lcnMnXG5dKTtcblxuY29uc3QgRURHRV9BRERfTUVUSE9EUyA9IFtcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZVxuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifURpcmVjdGVkRWRnZWAsXG4gICAgZ2VuZXJhdGVLZXk6IHRydWUsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifVVuZGlyZWN0ZWRFZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZSxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlV2l0aEtleWBcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1EaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiB2ZXJiID0+IGAke3ZlcmJ9VW5kaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRTID0ge1xuICBhbGxvd1NlbGZMb29wczogdHJ1ZSxcbiAgbXVsdGk6IGZhbHNlLFxuICB0eXBlOiAnbWl4ZWQnXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBHcmFwaCBjbGFzcyBmb3IgdmFyaW91cyBtZXRob2RzLlxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gYWRkIGEgbm9kZSB0byB0aGUgZ2l2ZW4gZ3JhcGhcbiAqXG4gKiBAcGFyYW0gIHtHcmFwaH0gICBncmFwaCAgICAgICAgICAgLSBUYXJnZXQgZ3JhcGguXG4gKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAgICAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSAge29iamVjdH0gIFthdHRyaWJ1dGVzXSAgICAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJuIHtOb2RlRGF0YX0gICAgICAgICAgICAgICAgLSBDcmVhdGVkIG5vZGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gYWRkTm9kZShncmFwaCwgbm9kZSwgYXR0cmlidXRlcykge1xuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguYWRkTm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBTdHJpbmcgY29lcmNpb25cbiAgbm9kZSA9ICcnICsgbm9kZTtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKGdyYXBoLl9ub2Rlcy5oYXMobm9kZSkpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5hZGROb2RlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBhbHJlYWR5IGV4aXN0IGluIHRoZSBncmFwaC5gXG4gICAgKTtcblxuICBjb25zdCBkYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Mobm9kZSwgYXR0cmlidXRlcyk7XG5cbiAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgLy8gRW1pdHRpbmdcbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgdGhlIGFib3ZlIGJ1dCB3aXRob3V0IHNhbml0eSBjaGVja3MgYmVjYXVzZSB3ZSBjYWxsIHRoaXMgaW4gY29udGV4dHNcbiAqIHdoZXJlIG5lY2Vzc2FyeSBjaGVja3Mgd2VyZSBhbHJlYWR5IGRvbmUuXG4gKi9cbmZ1bmN0aW9uIHVuc2FmZUFkZE5vZGUoZ3JhcGgsIG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3QgZGF0YSA9IG5ldyBncmFwaC5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHJldHVybiB7YW55fSAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGVkZ2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgb2YgdGhlIHdyb25nIHR5cGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYW4gb2JqZWN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGFscmVhZHkgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIGFkZEVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzXG4pIHtcbiAgLy8gQ2hlY2tpbmcgdmFsaWRpdHkgb2Ygb3BlcmF0aW9uXG4gIGlmICghdW5kaXJlY3RlZCAmJiBncmFwaC50eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhIGRpcmVjdGVkIGVkZ2UgdG8gYW4gdW5kaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGRVbmRpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmICh1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICdkaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhbiB1bmRpcmVjdGVkIGVkZ2UgdG8gYSBkaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGREaXJlY3RlZEVkZ2UgaW5zdGVhZC5gXG4gICAgKTtcblxuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBDb2VyY2lvbiBvZiBzb3VyY2UgJiB0YXJnZXQ6XG4gIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICB0YXJnZXQgPSAnJyArIHRhcmdldDtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpLFxuICAgIHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG5cbiAgaWYgKCFzb3VyY2VEYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogc291cmNlIG5vZGUgXCIke3NvdXJjZX1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgaWYgKCF0YXJnZXREYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdGFyZ2V0IG5vZGUgXCIke3RhcmdldH1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgLy8gTXVzdCB0aGUgZ3JhcGggZ2VuZXJhdGUgYW4gaWQgZm9yIHRoaXMgZWRnZT9cbiAgY29uc3QgZXZlbnREYXRhID0ge1xuICAgIGtleTogbnVsbCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgYXR0cmlidXRlc1xuICB9O1xuXG4gIGlmIChtdXN0R2VuZXJhdGVLZXkpIHtcbiAgICAvLyBOT1RFOiBpbiB0aGlzIGNhc2Ugd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeVxuICAgIC8vIGV4aXN0IGFuZCBpcyBhbHJlYWR5IGNvcnJlY3RseSBjYXN0ZWQgYXMgYSBzdHJpbmdcbiAgICBlZGdlID0gZ3JhcGguX2VkZ2VLZXlHZW5lcmF0b3IoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2lvbiBvZiBlZGdlIGtleVxuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICAvLyBIZXJlLCB3ZSBoYXZlIGEga2V5IGNvbGxpc2lvblxuICAgIGlmIChncmFwaC5fZWRnZXMuaGFzKGVkZ2UpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bmFtZX06IHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuICB9XG5cbiAgLy8gSGVyZSwgd2UgbWlnaHQgaGF2ZSBhIHNvdXJjZSAvIHRhcmdldCBjb2xsaXNpb25cbiAgaWYgKFxuICAgICFncmFwaC5tdWx0aSAmJlxuICAgICh1bmRpcmVjdGVkXG4gICAgICA/IHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgIDogdHlwZW9mIHNvdXJjZURhdGEub3V0W3RhcmdldF0gIT09ICd1bmRlZmluZWQnKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IGFuIGVkZ2UgbGlua2luZyBcIiR7c291cmNlfVwiIHRvIFwiJHt0YXJnZXR9XCIgYWxyZWFkeSBleGlzdHMuIElmIHlvdSByZWFsbHkgd2FudCB0byBhZGQgbXVsdGlwbGUgZWRnZXMgbGlua2luZyB0aG9zZSBub2RlcywgeW91IHNob3VsZCBjcmVhdGUgYSBtdWx0aSBncmFwaCBieSB1c2luZyB0aGUgJ211bHRpJyBvcHRpb24uYFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9yaW5nIHNvbWUgZGF0YVxuICBjb25zdCBlZGdlRGF0YSA9IG5ldyBFZGdlRGF0YShcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2UsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhLFxuICAgIGF0dHJpYnV0ZXNcbiAgKTtcblxuICAvLyBBZGRpbmcgdGhlIGVkZ2UgdG8gdGhlIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9lZGdlcy5zZXQoZWRnZSwgZWRnZURhdGEpO1xuXG4gIC8vIEluY3JlbWVudGluZyBub2RlIGRlZ3JlZSBjb3VudGVyc1xuICBpZiAoc291cmNlID09PSB0YXJnZXQpIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5kaXJlY3RlZFNlbGZMb29wcysrO1xuICAgICAgZ3JhcGguX2RpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkRGVncmVlKys7XG4gICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5vdXREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUrKztcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGluZyByZWxldmFudCBpbmRleFxuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleChcbiAgICBncmFwaCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2VEYXRhLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhXG4gICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQpIGdyYXBoLl91bmRpcmVjdGVkU2l6ZSsrO1xuICBlbHNlIGdyYXBoLl9kaXJlY3RlZFNpemUrKztcblxuICAvLyBFbWl0dGluZ1xuICBldmVudERhdGEua2V5ID0gZWRnZTtcblxuICBncmFwaC5lbWl0KCdlZGdlQWRkZWQnLCBldmVudERhdGEpO1xuXG4gIHJldHVybiBlZGdlO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2FzVXBkYXRlcl0gICAgICAgLSBBcmUgd2UgdXBkYXRpbmcgb3IgbWVyZ2luZz9cbiAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgICAgICAtIFRoZSBlZGdlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG9mIHRoZSB3cm9uZyB0eXBlLlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBtZXJnZUVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzLFxuICBhc1VwZGF0ZXJcbikge1xuICAvLyBDaGVja2luZyB2YWxpZGl0eSBvZiBvcGVyYXRpb25cbiAgaWYgKCF1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGEgZGlyZWN0ZWQgZWRnZSB0byBhbiB1bmRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZFVuZGlyZWN0ZWRFZGdlIGluc3RlYWQuYFxuICAgICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQgJiYgZ3JhcGgudHlwZSA9PT0gJ2RpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGFuIHVuZGlyZWN0ZWQgZWRnZSB0byBhIGRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZERpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKGFzVXBkYXRlcikge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgdXBkYXRlciBmdW5jdGlvbi4gRXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgYXR0cmlidXRlcy4gRXhwZWN0aW5nIGFuIG9iamVjdCBidXQgZ290IFwiJHthdHRyaWJ1dGVzfVwiYFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvZXJjaW9uIG9mIHNvdXJjZSAmIHRhcmdldDpcbiAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gIGxldCB1cGRhdGVyO1xuXG4gIGlmIChhc1VwZGF0ZXIpIHtcbiAgICB1cGRhdGVyID0gYXR0cmlidXRlcztcbiAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBsZXQgc291cmNlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQoc291cmNlKTtcbiAgbGV0IHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG4gIGxldCBlZGdlRGF0YTtcblxuICAvLyBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBkdXBsaWNhdGU/XG4gIGxldCBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YTtcblxuICBpZiAoIW11c3RHZW5lcmF0ZUtleSkge1xuICAgIGVkZ2VEYXRhID0gZ3JhcGguX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmIChlZGdlRGF0YSkge1xuICAgICAgLy8gSGVyZSwgd2UgbmVlZCB0byBlbnN1cmUsIGlmIHRoZSB1c2VyIGdhdmUgYSBrZXksIHRoYXQgc291cmNlICYgdGFyZ2V0XG4gICAgICAvLyBhcmUgY29oZXJlbnRcbiAgICAgIGlmIChcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSAhPT0gc291cmNlIHx8XG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXkgIT09IHRhcmdldCB8fFxuICAgICAgICAodW5kaXJlY3RlZCAmJlxuICAgICAgICAgIChlZGdlRGF0YS5zb3VyY2Uua2V5ICE9PSB0YXJnZXQgfHwgZWRnZURhdGEudGFyZ2V0LmtleSAhPT0gc291cmNlKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBpbmNvbnNpc3RlbmN5IGRldGVjdGVkIHdoZW4gYXR0ZW1wdGluZyB0byBtZXJnZSB0aGUgXCIke2VkZ2V9XCIgZWRnZSB3aXRoIFwiJHtzb3VyY2V9XCIgc291cmNlICYgXCIke3RhcmdldH1cIiB0YXJnZXQgdnMuIChcIiR7ZWRnZURhdGEuc291cmNlLmtleX1cIiwgXCIke2VkZ2VEYXRhLnRhcmdldC5rZXl9XCIpLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSBlZGdlRGF0YTtcbiAgICB9XG4gIH1cblxuICAvLyBIZXJlLCB3ZSBtaWdodCBoYXZlIGEgc291cmNlIC8gdGFyZ2V0IGNvbGxpc2lvblxuICBpZiAoIWFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhICYmICFncmFwaC5tdWx0aSAmJiBzb3VyY2VEYXRhKSB7XG4gICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSB1bmRpcmVjdGVkXG4gICAgICA/IHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdXG4gICAgICA6IHNvdXJjZURhdGEub3V0W3RhcmdldF07XG4gIH1cblxuICAvLyBIYW5kbGluZyBkdXBsaWNhdGVzXG4gIGlmIChhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YSkge1xuICAgIGNvbnN0IGluZm8gPSBbYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEua2V5LCBmYWxzZSwgZmFsc2UsIGZhbHNlXTtcblxuICAgIC8vIFdlIGNhbiBza2lwIHRoZSBhdHRyaWJ1dGUgbWVyZ2luZyBwYXJ0IGlmIHRoZSB1c2VyIGRpZCBub3QgcHJvdmlkZSB0aGVtXG4gICAgaWYgKGFzVXBkYXRlciA/ICF1cGRhdGVyIDogIWF0dHJpYnV0ZXMpIHJldHVybiBpbmZvO1xuXG4gICAgLy8gVXBkYXRpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBpZiAoYXNVcGRhdGVyKSB7XG4gICAgICBjb25zdCBvbGRBdHRyaWJ1dGVzID0gYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcztcbiAgICAgIGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXMgPSB1cGRhdGVyKG9sZEF0dHJpYnV0ZXMpO1xuXG4gICAgICBncmFwaC5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgICAga2V5OiBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5rZXksXG4gICAgICAgIGF0dHJpYnV0ZXM6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1lcmdpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBlbHNlIHtcbiAgICAgIGFzc2lnbihhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgZ3JhcGguZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgICBrZXk6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmtleSxcbiAgICAgICAgYXR0cmlidXRlczogYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcyB8fCB7fTtcblxuICBpZiAoYXNVcGRhdGVyICYmIHVwZGF0ZXIpIGF0dHJpYnV0ZXMgPSB1cGRhdGVyKGF0dHJpYnV0ZXMpO1xuXG4gIC8vIE11c3QgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkIGZvciB0aGlzIGVkZ2U/XG4gIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICBrZXk6IG51bGwsXG4gICAgdW5kaXJlY3RlZCxcbiAgICBzb3VyY2UsXG4gICAgdGFyZ2V0LFxuICAgIGF0dHJpYnV0ZXNcbiAgfTtcblxuICBpZiAobXVzdEdlbmVyYXRlS2V5KSB7XG4gICAgLy8gTk9URTogaW4gdGhpcyBjYXNlIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUga2V5IGRvZXMgbm90IGFscmVhZHlcbiAgICAvLyBleGlzdCBhbmQgaXMgYWxyZWFkeSBjb3JyZWN0bHkgY2FzdGVkIGFzIGEgc3RyaW5nXG4gICAgZWRnZSA9IGdyYXBoLl9lZGdlS2V5R2VuZXJhdG9yKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNpb24gb2YgZWRnZSBrZXlcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgLy8gSGVyZSwgd2UgaGF2ZSBhIGtleSBjb2xsaXNpb25cbiAgICBpZiAoZ3JhcGguX2VkZ2VzLmhhcyhlZGdlKSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke25hbWV9OiB0aGUgXCIke2VkZ2V9XCIgZWRnZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcbiAgfVxuXG4gIGxldCBzb3VyY2VXYXNBZGRlZCA9IGZhbHNlO1xuICBsZXQgdGFyZ2V0V2FzQWRkZWQgPSBmYWxzZTtcblxuICBpZiAoIXNvdXJjZURhdGEpIHtcbiAgICBzb3VyY2VEYXRhID0gdW5zYWZlQWRkTm9kZShncmFwaCwgc291cmNlLCB7fSk7XG4gICAgc291cmNlV2FzQWRkZWQgPSB0cnVlO1xuXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0KSB7XG4gICAgICB0YXJnZXREYXRhID0gc291cmNlRGF0YTtcbiAgICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0YXJnZXREYXRhKSB7XG4gICAgdGFyZ2V0RGF0YSA9IHVuc2FmZUFkZE5vZGUoZ3JhcGgsIHRhcmdldCwge30pO1xuICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFN0b3Jpbmcgc29tZSBkYXRhXG4gIGVkZ2VEYXRhID0gbmV3IEVkZ2VEYXRhKHVuZGlyZWN0ZWQsIGVkZ2UsIHNvdXJjZURhdGEsIHRhcmdldERhdGEsIGF0dHJpYnV0ZXMpO1xuXG4gIC8vIEFkZGluZyB0aGUgZWRnZSB0byB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJcbiAgZ3JhcGguX2VkZ2VzLnNldChlZGdlLCBlZGdlRGF0YSk7XG5cbiAgLy8gSW5jcmVtZW50aW5nIG5vZGUgZGVncmVlIGNvdW50ZXJzXG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMrKztcbiAgICAgIGdyYXBoLl91bmRpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fZGlyZWN0ZWRTZWxmTG9vcENvdW50Kys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEudW5kaXJlY3RlZERlZ3JlZSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLm91dERlZ3JlZSsrO1xuICAgICAgdGFyZ2V0RGF0YS5pbkRlZ3JlZSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0aW5nIHJlbGV2YW50IGluZGV4XG4gIHVwZGF0ZVN0cnVjdHVyZUluZGV4KFxuICAgIGdyYXBoLFxuICAgIHVuZGlyZWN0ZWQsXG4gICAgZWRnZURhdGEsXG4gICAgc291cmNlLFxuICAgIHRhcmdldCxcbiAgICBzb3VyY2VEYXRhLFxuICAgIHRhcmdldERhdGFcbiAgKTtcblxuICBpZiAodW5kaXJlY3RlZCkgZ3JhcGguX3VuZGlyZWN0ZWRTaXplKys7XG4gIGVsc2UgZ3JhcGguX2RpcmVjdGVkU2l6ZSsrO1xuXG4gIC8vIEVtaXR0aW5nXG4gIGV2ZW50RGF0YS5rZXkgPSBlZGdlO1xuXG4gIGdyYXBoLmVtaXQoJ2VkZ2VBZGRlZCcsIGV2ZW50RGF0YSk7XG5cbiAgcmV0dXJuIFtlZGdlLCB0cnVlLCBzb3VyY2VXYXNBZGRlZCwgdGFyZ2V0V2FzQWRkZWRdO1xufVxuXG4vKipcbiAqIEdyYXBoIGNsYXNzXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbb3B0aW9uc10gLSBPcHRpb25zOlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbYWxsb3dTZWxmTG9vcHNdIC0gQWxsb3cgc2VsZiBsb29wcz9cbiAqIEBwYXJhbSAge3N0cmluZ30gICAgW3R5cGVdICAgICAgICAgICAtIFR5cGUgb2YgdGhlIGdyYXBoLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbWFwXSAgICAgICAgICAgIC0gQWxsb3cgcmVmZXJlbmNlcyBhcyBrZXlzP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbXVsdGldICAgICAgICAgIC0gQWxsb3cgcGFyYWxsZWwgZWRnZXM/XG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgYXJndW1lbnRzIGFyZSBub3QgdmFsaWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXBoIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLy0tIFNvbHZpbmcgb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRTLCBvcHRpb25zKTtcblxuICAgIC8vIEVuZm9yY2luZyBvcHRpb25zIHZhbGlkaXR5XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm11bHRpICE9PSAnYm9vbGVhbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5jb25zdHJ1Y3RvcjogaW52YWxpZCAnbXVsdGknIG9wdGlvbi4gRXhwZWN0aW5nIGEgYm9vbGVhbiBidXQgZ290IFwiJHtvcHRpb25zLm11bHRpfVwiLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIVRZUEVTLmhhcyhvcHRpb25zLnR5cGUpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ3R5cGUnIG9wdGlvbi4gU2hvdWxkIGJlIG9uZSBvZiBcIm1peGVkXCIsIFwiZGlyZWN0ZWRcIiBvciBcInVuZGlyZWN0ZWRcIiBidXQgZ290IFwiJHtvcHRpb25zLnR5cGV9XCIuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbGxvd1NlbGZMb29wcyAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ2FsbG93U2VsZkxvb3BzJyBvcHRpb24uIEV4cGVjdGluZyBhIGJvb2xlYW4gYnV0IGdvdCBcIiR7b3B0aW9ucy5hbGxvd1NlbGZMb29wc31cIi5gXG4gICAgICApO1xuXG4gICAgLy8tLSBQcml2YXRlIHByb3BlcnRpZXNcblxuICAgIC8vIFV0aWxpdGllc1xuICAgIGNvbnN0IE5vZGVEYXRhQ2xhc3MgPVxuICAgICAgb3B0aW9ucy50eXBlID09PSAnbWl4ZWQnXG4gICAgICAgID8gTWl4ZWROb2RlRGF0YVxuICAgICAgICA6IG9wdGlvbnMudHlwZSA9PT0gJ2RpcmVjdGVkJ1xuICAgICAgICA/IERpcmVjdGVkTm9kZURhdGFcbiAgICAgICAgOiBVbmRpcmVjdGVkTm9kZURhdGE7XG5cbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBOb2RlRGF0YUNsYXNzKTtcblxuICAgIC8vIEludGVybmFsIGVkZ2Uga2V5IGdlbmVyYXRvclxuXG4gICAgLy8gTk9URTogdGhpcyBpbnRlcm5hbCBnZW5lcmF0b3IgcHJvZHVjZSBrZXlzIHRoYXQgYXJlIHN0cmluZ3NcbiAgICAvLyBjb21wb3NlZCBvZiBhIHdlaXJkIHByZWZpeCwgYW4gaW5jcmVtZW50YWwgaW5zdGFuY2UgaWQgc3RhcnRpbmcgZnJvbVxuICAgIC8vIGEgcmFuZG9tIGJ5dGUgYW5kIGZpbmFsbHkgYW4gaW50ZXJuYWwgaW5zdGFuY2UgaW5jcmVtZW50YWwgaWQuXG4gICAgLy8gQWxsIHRoaXMgdG8gYXZvaWQgaW50cmEtZnJhbWUgYW5kIGNyb3NzLWZyYW1lIGFkdmVyc2FyaWFsIGlucHV0c1xuICAgIC8vIHRoYXQgY2FuIGZvcmNlIGEgc2luZ2xlICMuYWRkRWRnZSBjYWxsIHRvIGRlZ2VuZXJhdGUgaW50byBhIE8obilcbiAgICAvLyBhdmFpbGFibGUga2V5IHNlYXJjaCBsb29wLlxuXG4gICAgLy8gSXQgYWxzbyBlbnN1cmVzIHRoYXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZWRnZSBrZXlzIGFyZSB1bmxpa2VseVxuICAgIC8vIHRvIHByb2R1Y2UgY29sbGlzaW9ucyB3aXRoIGFyYml0cmFyeSBrZXlzIGdpdmVuIGJ5IHVzZXJzLlxuICAgIGNvbnN0IGluc3RhbmNlSWQgPSBJTlNUQU5DRV9JRCgpO1xuICAgIGxldCBlZGdlSWQgPSAwO1xuXG4gICAgY29uc3QgZWRnZUtleUdlbmVyYXRvciA9ICgpID0+IHtcbiAgICAgIGxldCBhdmFpbGFibGVFZGdlS2V5O1xuXG4gICAgICBkbyB7XG4gICAgICAgIGF2YWlsYWJsZUVkZ2VLZXkgPSAnZ2VpZF8nICsgaW5zdGFuY2VJZCArICdfJyArIGVkZ2VJZCsrO1xuICAgICAgfSB3aGlsZSAodGhpcy5fZWRnZXMuaGFzKGF2YWlsYWJsZUVkZ2VLZXkpKTtcblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZUVkZ2VLZXk7XG4gICAgfTtcblxuICAgIC8vIEluZGV4ZXNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19hdHRyaWJ1dGVzJywge30pO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX25vZGVzJywgbmV3IE1hcCgpKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19lZGdlcycsIG5ldyBNYXAoKSk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfZGlyZWN0ZWRTaXplJywgMCk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfdW5kaXJlY3RlZFNpemUnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19kaXJlY3RlZFNlbGZMb29wQ291bnQnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ191bmRpcmVjdGVkU2VsZkxvb3BDb3VudCcsIDApO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX2VkZ2VLZXlHZW5lcmF0b3InLCBlZGdlS2V5R2VuZXJhdG9yKTtcblxuICAgIC8vIE9wdGlvbnNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19vcHRpb25zJywgb3B0aW9ucyk7XG5cbiAgICAvLyBFbWl0dGVyIHByb3BlcnRpZXNcbiAgICBFTUlUVEVSX1BST1BTLmZvckVhY2gocHJvcCA9PiBwcml2YXRlUHJvcGVydHkodGhpcywgcHJvcCwgdGhpc1twcm9wXSkpO1xuXG4gICAgLy8tLSBQcm9wZXJ0aWVzIHJlYWRlcnNcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdvcmRlcicsICgpID0+IHRoaXMuX25vZGVzLnNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3NpemUnLCAoKSA9PiB0aGlzLl9lZGdlcy5zaXplKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdkaXJlY3RlZFNpemUnLCAoKSA9PiB0aGlzLl9kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3VuZGlyZWN0ZWRTaXplJywgKCkgPT4gdGhpcy5fdW5kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3NlbGZMb29wQ291bnQnLFxuICAgICAgKCkgPT4gdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50ICsgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ2RpcmVjdGVkU2VsZkxvb3BDb3VudCcsXG4gICAgICAoKSA9PiB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50JyxcbiAgICAgICgpID0+IHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50XG4gICAgKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdtdWx0aScsIHRoaXMuX29wdGlvbnMubXVsdGkpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3R5cGUnLCB0aGlzLl9vcHRpb25zLnR5cGUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ2FsbG93U2VsZkxvb3BzJywgdGhpcy5fb3B0aW9ucy5hbGxvd1NlbGZMb29wcyk7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnaW1wbGVtZW50YXRpb24nLCAoKSA9PiAnZ3JhcGhvbG9neScpO1xuICB9XG5cbiAgX3Jlc2V0SW5zdGFuY2VDb3VudGVycygpIHtcbiAgICB0aGlzLl9kaXJlY3RlZFNpemUgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTaXplID0gMDtcbiAgICB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnQgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50ID0gMDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBSZWFkXG4gICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzLmhhcygnJyArIG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZGlyZWN0ZWQgZWRnZSBpcyBmb3VuZCBpbiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIEFyaXR5IDE6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBhcmd1bWVudHMgYXJlIGludmFsaWQuXG4gICAqL1xuICBoYXNEaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3QgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIHJldHVybiAhIWVkZ2VEYXRhICYmICFlZGdlRGF0YS51bmRpcmVjdGVkO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGNvbnN0IGVkZ2VzID0gbm9kZURhdGEub3V0W3RhcmdldF07XG5cbiAgICAgIGlmICghZWRnZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHRoaXMubXVsdGkgPyAhIWVkZ2VzLnNpemUgOiB0cnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5oYXNEaXJlY3RlZEVkZ2U6IGludmFsaWQgYXJpdHkgKCR7YXJndW1lbnRzLmxlbmd0aH0sIGluc3RlYWQgb2YgMSBvciAyKS4gWW91IGNhbiBlaXRoZXIgYXNrIGZvciBhbiBlZGdlIGlkIG9yIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGVkZ2UgYmV0d2VlbiBhIHNvdXJjZSAmIGEgdGFyZ2V0LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gdW5kaXJlY3RlZCBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc1VuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgICAgcmV0dXJuICEhZWRnZURhdGEgJiYgZWRnZURhdGEudW5kaXJlY3RlZDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICAgIC8vIElmIHRoZSBub2RlIHNvdXJjZSBvciB0aGUgdGFyZ2V0IGlzIG5vdCBpbiB0aGUgZ3JhcGggd2UgYnJlYWtcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghbm9kZURhdGEpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSXMgdGhlcmUgYSBkaXJlY3RlZCBlZGdlIHBvaW50aW5nIHRvd2FyZCB0YXJnZXQ/XG4gICAgICBjb25zdCBlZGdlcyA9IG5vZGVEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XTtcblxuICAgICAgaWYgKCFlZGdlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5tdWx0aSA/ICEhZWRnZXMuc2l6ZSA6IHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLmhhc0RpcmVjdGVkRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc0VkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZWRnZXMuaGFzKGVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGxldCBlZGdlcyA9IHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIG5vZGVEYXRhLm91dFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKVxuICAgICAgICBlZGdlcyA9XG4gICAgICAgICAgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgbm9kZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLm11bHRpID8gISFlZGdlcy5zaXplIDogdHJ1ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguaGFzRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSBkaXJlY3RlZCBmYXNoaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9IHNvdXJjZSAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKiBAcGFyYW0gIHthbnl9IHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBncmFwaCBpcyBtdWx0aS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybjtcblxuICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZGlyZWN0ZWRFZGdlOiB0aGlzIG1ldGhvZCBpcyBpcnJlbGV2YW50IHdpdGggbXVsdGlncmFwaHMgc2luY2UgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXQuIFNlZSAjLmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IChzb3VyY2VEYXRhLm91dCAmJiBzb3VyY2VEYXRhLm91dFt0YXJnZXRdKSB8fCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZWRnZURhdGEpIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSB1bmRpcmVjdGVkIGZhc2hpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG11bHRpLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHNvdXJjZSBvciB0YXJnZXQgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIHVuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RpcmVjdGVkJykgcmV0dXJuO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51bmRpcmVjdGVkRWRnZTogdGhpcyBtZXRob2QgaXMgaXJyZWxldmFudCB3aXRoIG11bHRpZ3JhcGhzIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0LiBTZWUgIy51bmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZEVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSkgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGVkZ2UgbWF0Y2hpbmcgc291cmNlICYgdGFyZ2V0IGluIGEgbWl4ZWQgZmFzaGlvbi5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUaGUgZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHJldHVybiB7YW55fHVuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZWRnZShzb3VyY2UsIHRhcmdldCkge1xuICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmVkZ2U6IHRoaXMgbWV0aG9kIGlzIGlycmVsZXZhbnQgd2l0aCBtdWx0aWdyYXBocyBzaW5jZSB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSBlZGdlcyBiZXR3ZWVuIHNvdXJjZSAmIHRhcmdldC4gU2VlICMuZWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEub3V0ICYmIHNvdXJjZURhdGEub3V0W3RhcmdldF0pIHx8XG4gICAgICAoc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIGRpcmVjdGVkIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlRGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVEaXJlY3RlZE5laWdoYm9yczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS5pbiB8fCBuZWlnaGJvciBpbiBub2RlRGF0YS5vdXQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0IG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlT3V0TmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlT3V0TmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIG5laWdoYm9yIGluIG5vZGVEYXRhLm91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbiBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZUluTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlSW5OZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbmVpZ2hib3IgaW4gbm9kZURhdGEuaW47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgdW5kaXJlY3RlZCBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZVVuZGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVVbmRpcmVjdGVkTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLmluIHx8IG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbmJvdW5kIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlSW5ib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZUluYm91bmROZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgICBpZiAobmVpZ2hib3IgaW4gbm9kZURhdGEuaW4pIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGlmIChuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0Ym91bmQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBuZWlnaGJvciAtIFRoZSBuZWlnaGJvcidzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBhcmVPdXRib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZU91dGJvdW5kTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpbkRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIG91dCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5vdXREZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5vdXREZWdyZWUgKyBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBkaXJlY3RlZERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgY29uc3QgbG9vcHMgPSBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIGNvbnN0IGluRGVncmVlID0gbm9kZURhdGEuaW5EZWdyZWUgKyBsb29wcztcbiAgICBjb25zdCBvdXREZWdyZWUgPSBub2RlRGF0YS5vdXREZWdyZWUgKyBsb29wcztcblxuICAgIHJldHVybiBpbkRlZ3JlZSArIG91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgdW5kaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IGxvb3BzID0gbm9kZURhdGEudW5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIHJldHVybiBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlICsgbG9vcHMgKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyBkaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgbGV0IGRlZ3JlZSA9IDA7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBkZWdyZWUgKz0gbm9kZURhdGEudW5kaXJlY3RlZERlZ3JlZSArIG5vZGVEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9XG4gICAgICAgIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGluIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGluRGVncmVlV2l0aG91dFNlbGZMb29wcyhub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZVdpdGhvdXRTZWxmTG9vcHM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5pbkRlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3Mgb3V0IGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgub3V0RGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLm91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlIHdpdGhvdXQgY29uc2lkZXJpbmcgc2VsZiBsb29wcy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgIC0gVGhlIG5vZGUncyBpbiBkZWdyZWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyB1bmRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLnVuZGlyZWN0ZWREZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBsZXQgZGVncmVlID0gMDtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGRlZ3JlZSArPSBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9IG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHNvdXJjZShlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguc291cmNlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHRhcmdldChlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudGFyZ2V0OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnRhcmdldC5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIGV4dHJlbWl0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHthcnJheX0gICAgICAtIFRoZSBlZGdlJ3MgZXh0cmVtaXRpZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZXh0cmVtaXRpZXMoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZWRnZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZXh0cmVtaXRpZXM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIFtlZGdlRGF0YS5zb3VyY2Uua2V5LCBlZGdlRGF0YS50YXJnZXQua2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG5vZGUgJiBhbiBlZGdlLCByZXR1cm5zIHRoZSBvdGhlciBleHRyZW1pdHkgb2YgdGhlIGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgIC0gVGhlIHJlbGF0ZWQgbm9kZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGggb3IgaWYgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgIGVkZ2UgJiBub2RlIGFyZSBub3QgcmVsYXRlZC5cbiAgICovXG4gIG9wcG9zaXRlKG5vZGUsIGVkZ2UpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLm9wcG9zaXRlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGRhdGEuc291cmNlLmtleTtcbiAgICBjb25zdCB0YXJnZXQgPSBkYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZSA9PT0gc291cmNlKSByZXR1cm4gdGFyZ2V0O1xuICAgIGlmIChub2RlID09PSB0YXJnZXQpIHJldHVybiBzb3VyY2U7XG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLm9wcG9zaXRlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIFwiJHtlZGdlfVwiIGVkZ2UgKCR7c291cmNlfSwgJHt0YXJnZXR9KS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaGFzIHRoZSBnaXZlbiBub2RlIGFzIGV4dHJlbWl0eS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgLSBUaGUgcmVsYXRlZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGVpdGhlciB0aGUgbm9kZSBvciB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBoYXNFeHRyZW1pdHkoZWRnZSwgbm9kZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguaGFzRXh0cmVtaXR5OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXkgPT09IG5vZGUgfHwgZGF0YS50YXJnZXQua2V5ID09PSBub2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyB1bmRpcmVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgaXNVbmRpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc1VuZGlyZWN0ZWQ6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEudW5kaXJlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaXMgZGlyZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpc0RpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc0RpcmVjdGVkOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiAhZGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyBhIHNlbGYgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGlzU2VsZkxvb3AoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmlzU2VsZkxvb3A6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuc291cmNlID09PSBkYXRhLnRhcmdldDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBNdXRhdGlvblxuICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgdG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBleGlzdC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAgICovXG4gIGFkZE5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gYWRkTm9kZSh0aGlzLCBub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiBub2RlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gbWVyZ2UgYSBub2RlIGludG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqL1xuICBtZXJnZU5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGlmIChhdHRyaWJ1dGVzICYmICFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgubWVyZ2VOb2RlOiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhbiBvYmplY3QgYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICk7XG5cbiAgICAvLyBTdHJpbmcgY29lcmNpb25cbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9O1xuXG4gICAgLy8gSWYgdGhlIG5vZGUgYWxyZWFkeSBleGlzdHMsIHdlIG1lcmdlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgYXNzaWduKGRhdGEuYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgICAgICBrZXk6IG5vZGUsXG4gICAgICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW25vZGUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBkYXRhID0gbmV3IHRoaXMuTm9kZURhdGFDbGFzcyhub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEFkZGluZyB0aGUgbm9kZSB0byBpbnRlcm5hbCByZWdpc3RlclxuICAgIHRoaXMuX25vZGVzLnNldChub2RlLCBkYXRhKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQWRkZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW25vZGUsIHRydWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGdyYXBoIG9yIGVsc2UgdG9cbiAgICogdXBkYXRlIGl0cyBhdHRyaWJ1dGVzIHVzaW5nIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgLSBUaGUgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IFt1cGRhdGVyXSAtIE9wdGlvbmFsIHVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgLSBUaGUgbm9kZS5cbiAgICovXG4gIHVwZGF0ZU5vZGUobm9kZSwgdXBkYXRlcikge1xuICAgIGlmICh1cGRhdGVyICYmIHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudXBkYXRlTm9kZTogaW52YWxpZCB1cGRhdGVyIGZ1bmN0aW9uLiBFeHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290IFwiJHt1cGRhdGVyfVwiYFxuICAgICAgKTtcblxuICAgIC8vIFN0cmluZyBjb2VyY2lvblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBhbHJlYWR5IGV4aXN0cywgd2UgdXBkYXRlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHVwZGF0ZXIpIHtcbiAgICAgICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IGRhdGEuYXR0cmlidXRlcztcbiAgICAgICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihvbGRBdHRyaWJ1dGVzKTtcblxuICAgICAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICAgICAga2V5OiBub2RlLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbm9kZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB1cGRhdGVyID8gdXBkYXRlcih7fSkgOiB7fTtcblxuICAgIGRhdGEgPSBuZXcgdGhpcy5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gICAgdGhpcy5fbm9kZXMuc2V0KG5vZGUsIGRhdGEpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBZGRlZCcsIHtcbiAgICAgIGtleTogbm9kZSxcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiBbbm9kZSwgdHJ1ZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBub2RlICYgYWxsIGl0cyBhdHRhY2hlZCBlZGdlcyBmcm9tIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICBub2RlIC0gVGhlIG5vZGUuXG4gICAqIEByZXR1cm4ge0dyYXBofVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkcm9wTm9kZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kcm9wTm9kZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBSZW1vdmluZyBhdHRhY2hlZCBlZGdlc1xuICAgIC8vIFRPRE86IHdlIGNvdWxkIGRvIGZhc3RlclxuICAgIHRoaXMuZm9yRWFjaEVkZ2Uobm9kZSwgZWRnZSA9PiB7XG4gICAgICB0aGlzLmRyb3BFZGdlKGVkZ2UpO1xuICAgIH0pO1xuXG4gICAgLy8gRHJvcHBpbmcgdGhlIG5vZGUgZnJvbSB0aGUgcmVnaXN0ZXJcbiAgICB0aGlzLl9ub2Rlcy5kZWxldGUobm9kZSk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZURyb3BwZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzOiBub2RlRGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBBcml0eSAxOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVkZ2UgLSBUaGUgZWRnZS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICB0YXJnZXQgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIGRyb3BFZGdlKGVkZ2UpIHtcbiAgICBsZXQgZWRnZURhdGE7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgYXJndW1lbnRzWzBdLFxuICAgICAgICB0YXJnZXQgPSAnJyArIGFyZ3VtZW50c1sxXTtcblxuICAgICAgZWRnZURhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHRoaXMudHlwZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiAtPiBcIiR7dGFyZ2V0fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgICAgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIERyb3BwaW5nIHRoZSBlZGdlIGZyb20gdGhlIHJlZ2lzdGVyXG4gICAgdGhpcy5fZWRnZXMuZGVsZXRlKGVkZ2VEYXRhLmtleSk7XG5cbiAgICAvLyBVcGRhdGluZyByZWxhdGVkIGRlZ3JlZXNcbiAgICBjb25zdCB7c291cmNlOiBzb3VyY2VEYXRhLCB0YXJnZXQ6IHRhcmdldERhdGEsIGF0dHJpYnV0ZXN9ID0gZWRnZURhdGE7XG5cbiAgICBjb25zdCB1bmRpcmVjdGVkID0gZWRnZURhdGEudW5kaXJlY3RlZDtcblxuICAgIGlmIChzb3VyY2VEYXRhID09PSB0YXJnZXREYXRhKSB7XG4gICAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50LS07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICAgIHNvdXJjZURhdGEudW5kaXJlY3RlZERlZ3JlZS0tO1xuICAgICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEub3V0RGVncmVlLS07XG4gICAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUtLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhcmluZyBpbmRleFxuICAgIGNsZWFyRWRnZUZyb21TdHJ1Y3R1cmVJbmRleCh0aGlzLCB1bmRpcmVjdGVkLCBlZGdlRGF0YSk7XG5cbiAgICBpZiAodW5kaXJlY3RlZCkgdGhpcy5fdW5kaXJlY3RlZFNpemUtLTtcbiAgICBlbHNlIHRoaXMuX2RpcmVjdGVkU2l6ZS0tO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VEcm9wcGVkJywge1xuICAgICAga2V5OiBlZGdlLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHNvdXJjZTogc291cmNlRGF0YS5rZXksXG4gICAgICB0YXJnZXQ6IHRhcmdldERhdGEua2V5LFxuICAgICAgdW5kaXJlY3RlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gcmVtb3ZlIGV2ZXJ5IGVkZ2UgJiBldmVyeSBub2RlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyaW5nIG5vZGVzXG4gICAgdGhpcy5fbm9kZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHJlbW92ZSBldmVyeSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyRWRnZXMoKSB7XG4gICAgY2xlYXJTdHJ1Y3R1cmVJbmRleCh0aGlzKTtcblxuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZXNDbGVhcmVkJyk7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ3JhcGggaGFzIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0F0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHNldHRpbmcgYSB2YWx1ZSBmb3IgdGhlIGRlc2lyZWQgZ3JhcGgncyBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFZhbHVlIGZvciB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdhdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2luZyBhIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgZGVzaXJlZCBncmFwaCdzIGF0dHJpYnV0ZSdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IHVwZGF0ZXIgLSBGdW5jdGlvbiB1c2UgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZS5cbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqL1xuICB1cGRhdGVBdHRyaWJ1dGUobmFtZSwgdXBkYXRlcikge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUF0dHJpYnV0ZTogdXBkYXRlciBzaG91bGQgYmUgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlc1tuYW1lXSA9IHVwZGF0ZXIodmFsdWUpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2F0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlbW92aW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmVwbGFjaW5nIHRoZSBncmFwaCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIE5ldyBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICByZXBsYWNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgucmVwbGFjZUF0dHJpYnV0ZXM6IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgbWVyZ2luZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBtZXJnZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1lcmdlQXR0cmlidXRlczogcHJvdmlkZWQgYXR0cmlidXRlcyBhcmUgbm90IGEgcGxhaW4gb2JqZWN0LidcbiAgICAgICk7XG5cbiAgICBhc3NpZ24odGhpcy5fYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIEZ1bmN0aW9uIHVzZWQgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiB1cGRhdGVyIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgKi9cbiAgdXBkYXRlQXR0cmlidXRlcyh1cGRhdGVyKSB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlQXR0cmlidXRlczogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IHVwZGF0ZXIodGhpcy5fYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHVwZGF0ZSBlYWNoIG5vZGUncyBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gIHVwZGF0ZXIgLSBVcGRhdGVyIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9ICAgIFtoaW50c10gLSBPcHRpb25hbCBoaW50cy5cbiAgICovXG4gIHVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlcyh1cGRhdGVyLCBoaW50cykge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlczogZXhwZWN0aW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24uJ1xuICAgICAgKTtcblxuICAgIGlmIChoaW50cyAmJiAhdmFsaWRhdGVIaW50cyhoaW50cykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoTm9kZUF0dHJpYnV0ZXM6IGludmFsaWQgaGludHMuIEV4cGVjdGluZyBhbiBvYmplY3QgaGF2aW5nIHRoZSBmb2xsb3dpbmcgc2hhcGU6IHthdHRyaWJ1dGVzPzogW3N0cmluZ119J1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgbm9kZURhdGEuYXR0cmlidXRlcyA9IHVwZGF0ZXIobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoJ2VhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBoaW50czogaGludHMgPyBoaW50cyA6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCB0byB1cGRhdGUgZWFjaCBlZGdlJ3MgYXR0cmlidXRlcyB1c2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259ICB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbiB0byB1c2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSAgICBbaGludHNdIC0gT3B0aW9uYWwgaGludHMuXG4gICAqL1xuICB1cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXModXBkYXRlciwgaGludHMpIHtcbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXM6IGV4cGVjdGluZyBhbiB1cGRhdGVyIGZ1bmN0aW9uLidcbiAgICAgICk7XG5cbiAgICBpZiAoaGludHMgJiYgIXZhbGlkYXRlSGludHMoaGludHMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlRWFjaEVkZ2VBdHRyaWJ1dGVzOiBpbnZhbGlkIGhpbnRzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGhhdmluZyB0aGUgZm9sbG93aW5nIHNoYXBlOiB7YXR0cmlidXRlcz86IFtzdHJpbmddfSdcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX2VkZ2VzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2VEYXRhLCB0YXJnZXREYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgnZWFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGhpbnRzOiBoaW50cyA/IGhpbnRzIDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEl0ZXJhdGlvbi1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQWRqYWNlbmN5RW50cnk6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMubXVsdGkpIGZvckVhY2hBZGphY2VuY3lNdWx0aShmYWxzZSwgZmFsc2UsIHRydWUsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIGFzc3ltZXRyaWMgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnkoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaEFzc3ltZXRyaWNBZGphY2VuY3lFbnRyeTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmICh0aGlzLm11bHRpKSBmb3JFYWNoQWRqYWNlbmN5TXVsdGkoZmFsc2UsIHRydWUsIGZhbHNlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnlXaXRoT3JwaGFucyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQXNzeW1ldHJpY0FkamFjZW5jeUVudHJ5V2l0aE9ycGhhbnM6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgbGlzdCBvZiB0aGUgZ3JhcGgncyBub2Rlcy5cbiAgICpcbiAgICogQHJldHVybiB7YXJyYXl9IC0gVGhlIG5vZGVzLlxuICAgKi9cbiAgbm9kZXMoKSB7XG4gICAgaWYgKHR5cGVvZiBBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ub2Rlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UodGhpcy5fbm9kZXMua2V5cygpLCB0aGlzLl9ub2Rlcy5zaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3Mgbm9kZXMgdXNpbmcgdGhlIGdpdmVuIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcywgaW5kZXgpLlxuICAgKi9cbiAgZm9yRWFjaE5vZGUoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIG5vZGVEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpdGVyYXRpbmcgYXR0ZW1wdGluZyB0byBmaW5kIGEgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaW5kTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maW5kTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIG5vZGVEYXRhLmtleTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIG1hcHBpbmcgbm9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBDYWxsYmFjayAoa2V5LCBhdHRyaWJ1dGVzKS5cbiAgICovXG4gIG1hcE5vZGVzKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1hcE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMub3JkZXIpO1xuICAgIGxldCBpID0gMDtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG4gICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgc29tZSBub2RlIHZlcmlmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBzb21lTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5zb21lTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciBhbGwgbm9kZSB2ZXJpZnkgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIChrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgZXZlcnlOb2RlKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmV2ZXJ5Tm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcykpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgZmlsdGVyaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaWx0ZXJOb2RlcyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maWx0ZXJOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIGlmIChjYWxsYmFjayhub2RlRGF0YS5rZXksIG5vZGVEYXRhLmF0dHJpYnV0ZXMpKVxuICAgICAgICByZXN1bHQucHVzaChub2RlRGF0YS5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlZHVjaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGFjY3VtdWxhdG9yLCBrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgcmVkdWNlTm9kZXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5yZWR1Y2VOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMilcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnJlZHVjZU5vZGVzOiBtaXNzaW5nIGluaXRpYWwgdmFsdWUuIFlvdSBtdXN0IHByb3ZpZGUgaXQgYmVjYXVzZSB0aGUgY2FsbGJhY2sgdGFrZXMgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBhbmQgd2UgY2Fubm90IGluZmVyIHRoZSBpbml0aWFsIHZhbHVlIGZyb20gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgYXMgeW91IGNvdWxkIHdpdGggYSBzaW1wbGUgYXJyYXkuJ1xuICAgICAgKTtcblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIG5vZGUgZW50cmllcy5cbiAgICpcbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqL1xuICBub2RlRW50cmllcygpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcigoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICBpZiAoc3RlcC5kb25lKSByZXR1cm4gc3RlcDtcblxuICAgICAgY29uc3QgZGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7bm9kZTogZGF0YS5rZXksIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc30sXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIFNlcmlhbGl6YXRpb25cbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgZXhwb3J0aW5nIHRoZSB0YXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7YXJyYXl9ICAgICAgLSBUaGUgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIGV4cG9ydE5vZGUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmV4cG9ydE5vZGU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZU5vZGUobm9kZSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGV4cG9ydGluZyB0aGUgdGFyZ2V0IGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGFyZ2V0IGVkZ2UuXG4gICAqIEByZXR1cm4ge2FycmF5fSAgICAgIC0gVGhlIHNlcmlhbGl6ZWQgZWRnZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpcyBub3QgZm91bmQuXG4gICAqL1xuICBleHBvcnRFZGdlKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5leHBvcnRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBzZXJpYWxpemVFZGdlKGVkZ2UsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGV4cG9ydCB0aGUgd2hvbGUgZ3JhcGguXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICovXG4gIGV4cG9ydCgpIHtcbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheSh0aGlzLl9ub2Rlcy5zaXplKTtcblxuICAgIGxldCBpID0gMDtcblxuICAgIHRoaXMuX25vZGVzLmZvckVhY2goKGRhdGEsIGtleSkgPT4ge1xuICAgICAgbm9kZXNbaSsrXSA9IHNlcmlhbGl6ZU5vZGUoa2V5LCBkYXRhKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVkZ2VzID0gbmV3IEFycmF5KHRoaXMuX2VkZ2VzLnNpemUpO1xuXG4gICAgaSA9IDA7XG5cbiAgICB0aGlzLl9lZGdlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIGVkZ2VzW2krK10gPSBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczogdGhpcy5nZXRBdHRyaWJ1dGVzKCksXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIG11bHRpOiB0aGlzLm11bHRpLFxuICAgICAgICBhbGxvd1NlbGZMb29wczogdGhpcy5hbGxvd1NlbGZMb29wc1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gbm9kZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnROb2RlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWROb2RlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnROb2RlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgbm9kZS4gQSBzZXJpYWxpemVkIG5vZGUgc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcImtleVwiIHByb3BlcnR5LidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ25vLWtleScpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogbm8ga2V5IHByb3ZpZGVkLidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ2ludmFsaWQtYXR0cmlidXRlcycpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCwgbnVsbCBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIG5vZGVcbiAgICBjb25zdCB7a2V5LCBhdHRyaWJ1dGVzID0ge319ID0gZGF0YTtcblxuICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZU5vZGUoa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICBlbHNlIHRoaXMuYWRkTm9kZShrZXksIGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBlZGdlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICBkYXRhICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gZWRnZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnRFZGdlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWRFZGdlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgZWRnZS4gQSBzZXJpYWxpemVkIGVkZ2Ugc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcInNvdXJjZVwiICYgXCJ0YXJnZXRcIiBwcm9wZXJ0eS4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICduby1zb3VyY2UnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IG1pc3Npbmcgc291Y2UuJ1xuICAgICAgICApO1xuICAgICAgaWYgKGVycm9yID09PSAnbm8tdGFyZ2V0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBtaXNzaW5nIHRhcmdldC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLWF0dHJpYnV0ZXMnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgYXR0cmlidXRlcy4gQXR0cmlidXRlcyBzaG91bGQgYmUgYSBwbGFpbiBvYmplY3QsIG51bGwgb3Igb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLXVuZGlyZWN0ZWQnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgdW5kaXJlY3RlZC4gVW5kaXJlY3RlZCBzaG91bGQgYmUgYm9vbGVhbiBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIGVkZ2VcbiAgICBjb25zdCB7c291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMgPSB7fSwgdW5kaXJlY3RlZCA9IGZhbHNlfSA9IGRhdGE7XG5cbiAgICBsZXQgbWV0aG9kO1xuXG4gICAgaWYgKCdrZXknIGluIGRhdGEpIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlV2l0aEtleVxuICAgICAgICAgIDogdGhpcy5tZXJnZURpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB1bmRpcmVjdGVkXG4gICAgICAgID8gdGhpcy5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZVdpdGhLZXk7XG5cbiAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGRhdGEua2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlXG4gICAgICAgICAgOiB0aGlzLm1lcmdlRGlyZWN0ZWRFZGdlXG4gICAgICAgIDogdW5kaXJlY3RlZFxuICAgICAgICA/IHRoaXMuYWRkVW5kaXJlY3RlZEVkZ2VcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZTtcblxuICAgICAgbWV0aG9kLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGltcG9ydCBhIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdHxHcmFwaH0gZGF0YSAgLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICBtZXJnZSAtIFdoZXRoZXIgdG8gbWVyZ2UgZGF0YS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICovXG4gIGltcG9ydChkYXRhLCBtZXJnZSA9IGZhbHNlKSB7XG4gICAgLy8gSW1wb3J0aW5nIGEgR3JhcGggaW5zdGFuY2VcbiAgICBpZiAoaXNHcmFwaChkYXRhKSkge1xuICAgICAgdGhpcy5pbXBvcnQoZGF0YS5leHBvcnQoKSwgbWVyZ2UpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSW1wb3J0aW5nIGEgc2VyaWFsaXplZCBncmFwaFxuICAgIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmltcG9ydDogaW52YWxpZCBhcmd1bWVudC4gRXhwZWN0aW5nIGEgc2VyaWFsaXplZCBncmFwaCBvciwgYWx0ZXJuYXRpdmVseSwgYSBHcmFwaCBpbnN0YW5jZS4nXG4gICAgICApO1xuXG4gICAgaWYgKGRhdGEuYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEuYXR0cmlidXRlcykpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhIHBsYWluIG9iamVjdC4nXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKTtcbiAgICAgIGVsc2UgdGhpcy5yZXBsYWNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIGxldCBpLCBsLCBsaXN0O1xuXG4gICAgaWYgKGRhdGEubm9kZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLm5vZGVzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIG5vZGVzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0Tm9kZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZWRnZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLmVkZ2VzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGVkZ2VzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0RWRnZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogVXRpbHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIGEgbnVsbCBjb3B5IG9mIHRoZSBncmFwaCwgaS5lLiBhIGdyYXBoIHdpdGhvdXQgbm9kZXNcbiAgICogJiBlZGdlcyBidXQgd2l0aCB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHRvIG1lcmdlIHdpdGggdGhlIGN1cnJlbnQgb25lcy5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgIC0gVGhlIG51bGwgY29weS5cbiAgICovXG4gIG51bGxDb3B5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBHcmFwaChhc3NpZ24oe30sIHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpKTtcbiAgICBncmFwaC5yZXBsYWNlQXR0cmlidXRlcyhhc3NpZ24oe30sIHRoaXMuZ2V0QXR0cmlidXRlcygpKSk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgYW4gZW1wdHkgY29weSBvZiB0aGUgZ3JhcGgsIGkuZS4gYSBncmFwaCB3aXRob3V0IGVkZ2VzIGJ1dFxuICAgKiB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbWVyZ2Ugd2l0aCB0aGUgY3VycmVudCBvbmVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBUaGUgZW1wdHkgY29weS5cbiAgICovXG4gIGVtcHR5Q29weShvcHRpb25zKSB7XG4gICAgY29uc3QgZ3JhcGggPSB0aGlzLm51bGxDb3B5KG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fbm9kZXMuZm9yRWFjaCgobm9kZURhdGEsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG5cbiAgICAgIC8vIE5PVEU6IG5vIG5lZWQgdG8gZW1pdCBldmVudHMgc2luY2UgdXNlciBjYW5ub3QgYWNjZXNzIHRoZSBpbnN0YW5jZSB5ZXRcbiAgICAgIG5vZGVEYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Moa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIGdyYXBoLl9ub2Rlcy5zZXQoa2V5LCBub2RlRGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBleGFjdCBjb3B5IG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICBjb3B5KCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5lbXB0eUNvcHkoKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fZWRnZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICAvLyBOT1RFOiBubyBuZWVkIHRvIGVtaXQgZXZlbnRzIHNpbmNlIHVzZXIgY2Fubm90IGFjY2VzcyB0aGUgaW5zdGFuY2UgeWV0XG4gICAgICBhZGRFZGdlKFxuICAgICAgICBncmFwaCxcbiAgICAgICAgJ2NvcHknLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZWRnZURhdGEudW5kaXJlY3RlZCxcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgICBhc3NpZ24oe30sIGVkZ2VEYXRhLmF0dHJpYnV0ZXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBncmFwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXBncmFkaW5nIHRoZSBncmFwaCB0byBhIG1peGVkIG9uZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICB1cGdyYWRlVG9NaXhlZCgpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnbWl4ZWQnKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFVwZ3JhZGluZyBub2RlIGRhdGE6XG4gICAgLy8gTk9URTogbWF5YmUgdGhpcyBjb3VsZCBsZWFkIHRvIHNvbWUgZGUtb3B0aW1pemF0aW9uIGJ5IHVzdWFsXG4gICAgLy8gSmF2YVNjcmlwdCBlbmdpbmVzIGJ1dCBJIGNhbm5vdCBiZSBzdXJlIG9mIGl0LiBBbm90aGVyIHNvbHV0aW9uXG4gICAgLy8gd291bGQgYmUgdG8gcmVpbnN0YW50aWF0ZSB0aGUgY2xhc3NlcyBidXQgdGhpcyBzdXJlbHkgaGFzIGEgcGVyZm9ybWFuY2VcbiAgICAvLyBhbmQgbWVtb3J5IGltcGFjdC5cbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKGRhdGEgPT4gZGF0YS51cGdyYWRlVG9NaXhlZCgpKTtcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy50eXBlID0gJ21peGVkJztcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICd0eXBlJywgdGhpcy5fb3B0aW9ucy50eXBlKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBNaXhlZE5vZGVEYXRhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGdyYWRpbmcgdGhlIGdyYXBoIHRvIGEgbXVsdGkgb25lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gLSBUaGUgY29weS5cbiAgICovXG4gIHVwZ3JhZGVUb011bHRpKCkge1xuICAgIGlmICh0aGlzLm11bHRpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy5tdWx0aSA9IHRydWU7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnbXVsdGknLCB0cnVlKTtcblxuICAgIC8vIFVwZ3JhZGluZyBpbmRpY2VzXG4gICAgdXBncmFkZVN0cnVjdHVyZUluZGV4VG9NdWx0aSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEtub3duIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCBieSBKYXZhU2NyaXB0IHRvIHBlcmZvcm0gSlNPTiBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IC0gVGhlIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBbb2JqZWN0IEdyYXBoXS5cbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBHcmFwaF0nO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgYnkgbm9kZSdzIGNvbnNvbGUgdG8gZGlzcGxheSBhIGN1c3RvbSBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBGb3JtYXR0ZWQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFwaC5cbiAgICovXG4gIGluc3BlY3QoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB7fTtcbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIG5vZGVzW2tleV0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBlZGdlcyA9IHt9LFxuICAgICAgbXVsdGlJbmRleCA9IHt9O1xuXG4gICAgdGhpcy5fZWRnZXMuZm9yRWFjaCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBkYXRhLnVuZGlyZWN0ZWQgPyAnLS0nIDogJy0+JztcblxuICAgICAgbGV0IGxhYmVsID0gJyc7XG5cbiAgICAgIGxldCBzb3VyY2UgPSBkYXRhLnNvdXJjZS5rZXk7XG4gICAgICBsZXQgdGFyZ2V0ID0gZGF0YS50YXJnZXQua2V5O1xuICAgICAgbGV0IHRtcDtcblxuICAgICAgaWYgKGRhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2UgPiB0YXJnZXQpIHtcbiAgICAgICAgdG1wID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSB0YXJnZXQ7XG4gICAgICAgIHRhcmdldCA9IHRtcDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzYyA9IGAoJHtzb3VyY2V9KSR7ZGlyZWN0aW9ufSgke3RhcmdldH0pYDtcblxuICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgnZ2VpZF8nKSkge1xuICAgICAgICBsYWJlbCArPSBgWyR7a2V5fV06IGA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubXVsdGkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdWx0aUluZGV4W2Rlc2NdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10rKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsICs9IGAke211bHRpSW5kZXhbZGVzY119LiBgO1xuICAgICAgfVxuXG4gICAgICBsYWJlbCArPSBkZXNjO1xuXG4gICAgICBlZGdlc1tsYWJlbF0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkdW1teSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShrKSAmJlxuICAgICAgICAhRU1JVFRFUl9QUk9QUy5oYXMoaykgJiZcbiAgICAgICAgdHlwZW9mIHRoaXNba10gIT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGsgIT09ICdzeW1ib2wnXG4gICAgICApXG4gICAgICAgIGR1bW15W2tdID0gdGhpc1trXTtcbiAgICB9XG5cbiAgICBkdW1teS5hdHRyaWJ1dGVzID0gdGhpcy5fYXR0cmlidXRlcztcbiAgICBkdW1teS5ub2RlcyA9IG5vZGVzO1xuICAgIGR1bW15LmVkZ2VzID0gZWRnZXM7XG5cbiAgICBwcml2YXRlUHJvcGVydHkoZHVtbXksICdjb25zdHJ1Y3RvcicsIHRoaXMuY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIGR1bW15O1xuICB9XG59XG5cbi8qKlxuICogQXR0YWNoaW5nIG1ldGhvZHMgdG8gdGhlIHByb3RvdHlwZS5cbiAqXG4gKiBIZXJlLCB3ZSBhcmUgYXR0YWNoaW5nIGEgd2lkZSB2YXJpZXR5IG9mIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzJ1xuICogcHJvdG90eXBlIHdoZW4gdGhvc2UgYXJlIHZlcnkgbnVtZXJvdXMgYW5kIHdoZW4gdGhlaXIgY3JlYXRpb24gaXNcbiAqIGFic3RyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBBdHRhY2hpbmcgY3VzdG9tIGluc3BlY3QgbWV0aG9kIGZvciBub2RlID49IDEwLlxuICovXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEdyYXBoLnByb3RvdHlwZVtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9XG4gICAgR3JhcGgucHJvdG90eXBlLmluc3BlY3Q7XG5cbi8qKlxuICogUmVsYXRlZCB0byBlZGdlIGFkZGl0aW9uLlxuICovXG5FREdFX0FERF9NRVRIT0RTLmZvckVhY2gobWV0aG9kID0+IHtcbiAgWydhZGQnLCAnbWVyZ2UnLCAndXBkYXRlJ10uZm9yRWFjaCh2ZXJiID0+IHtcbiAgICBjb25zdCBuYW1lID0gbWV0aG9kLm5hbWUodmVyYik7XG4gICAgY29uc3QgZm4gPSB2ZXJiID09PSAnYWRkJyA/IGFkZEVkZ2UgOiBtZXJnZUVkZ2U7XG5cbiAgICBpZiAobWV0aG9kLmdlbmVyYXRlS2V5KSB7XG4gICAgICBHcmFwaC5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIEdyYXBoLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChlZGdlLCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gZm4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgZWRnZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vKipcbiAqIEF0dHJpYnV0ZXMtcmVsYXRlZC5cbiAqL1xuYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKTtcbmF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWV0aG9kcyhHcmFwaCk7XG5cbi8qKlxuICogRWRnZSBpdGVyYXRpb24tcmVsYXRlZC5cbiAqL1xuYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuXG4vKipcbiAqIE5laWdoYm9yIGl0ZXJhdGlvbi1yZWxhdGVkLlxuICovXG5hdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBIZWxwZXIgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBCdWlsZGluZyBzb21lIGhpZ2hlci1vcmRlciBjbGFzc2VzIGluc3RhbnRpYXRpbmcgdGhlIGdyYXBoIHdpdGhcbiAqIHByZWRlZmluaXRlIG9wdGlvbnMuXG4gKi9cbmltcG9ydCB7YXNzaWdufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBHcmFwaCBmcm9tICcuL2dyYXBoJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvcnMuXG4gKi9cbmNsYXNzIERpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICdkaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgbXVsdGkgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgaWYgKGZpbmFsT3B0aW9ucy50eXBlICE9PSAnZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgVW5kaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAndW5kaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnVW5kaXJlY3RlZEdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBtdWx0aSBpbiBnaXZlbiBvcHRpb25zISdcbiAgICAgICk7XG5cbiAgICBpZiAoZmluYWxPcHRpb25zLnR5cGUgIT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ1VuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlHcmFwaCBleHRlbmRzIEdyYXBoIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGZpbmFsT3B0aW9ucyA9IGFzc2lnbih7bXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aUdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBzaW1wbGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlEaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAnZGlyZWN0ZWQnLCBtdWx0aTogdHJ1ZX0sIG9wdGlvbnMpO1xuXG4gICAgaWYgKCdtdWx0aScgaW4gZmluYWxPcHRpb25zICYmIGZpbmFsT3B0aW9ucy5tdWx0aSAhPT0gdHJ1ZSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ2RpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlVbmRpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICd1bmRpcmVjdGVkJywgbXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aVVuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnTXVsdGlVbmRpcmVjdGVkR3JhcGguZnJvbTogaW5jb25zaXN0ZW50IFwiJyArXG4gICAgICAgICAgZmluYWxPcHRpb25zLnR5cGUgK1xuICAgICAgICAgICdcIiB0eXBlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIHN1cGVyKGZpbmFsT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2hpbmcgc3RhdGljICMuZnJvbSBtZXRob2QgdG8gZWFjaCBvZiB0aGUgY29uc3RydWN0b3JzLlxuICovXG5mdW5jdGlvbiBhdHRhY2hTdGF0aWNGcm9tTWV0aG9kKENsYXNzKSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBncmFwaCBmcm9tIHNlcmlhbGl6ZWQgZGF0YSBvciBhbm90aGVyIGdyYXBoJ3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtICB7R3JhcGh8U2VyaWFsaXplZEdyYXBofSBkYXRhICAgICAgLSBIeWRyYXRhdGlvbiBkYXRhLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICAgICAgICAgICAgICAgIFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NsYXNzfVxuICAgKi9cbiAgQ2xhc3MuZnJvbSA9IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7XG4gICAgLy8gTWVyZ2luZyBnaXZlbiBvcHRpb25zIHdpdGggc2VyaWFsaXplZCBvbmVzXG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt9LCBkYXRhLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xhc3MoZmluYWxPcHRpb25zKTtcbiAgICBpbnN0YW5jZS5pbXBvcnQoZGF0YSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5cbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoR3JhcGgpO1xuYXR0YWNoU3RhdGljRnJvbU1ldGhvZChEaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoVW5kaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoTXVsdGlHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpRGlyZWN0ZWRHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpVW5kaXJlY3RlZEdyYXBoKTtcblxuR3JhcGguR3JhcGggPSBHcmFwaDtcbkdyYXBoLkRpcmVjdGVkR3JhcGggPSBEaXJlY3RlZEdyYXBoO1xuR3JhcGguVW5kaXJlY3RlZEdyYXBoID0gVW5kaXJlY3RlZEdyYXBoO1xuR3JhcGguTXVsdGlHcmFwaCA9IE11bHRpR3JhcGg7XG5HcmFwaC5NdWx0aURpcmVjdGVkR3JhcGggPSBNdWx0aURpcmVjdGVkR3JhcGg7XG5HcmFwaC5NdWx0aVVuZGlyZWN0ZWRHcmFwaCA9IE11bHRpVW5kaXJlY3RlZEdyYXBoO1xuXG5HcmFwaC5JbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciA9IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yO1xuR3JhcGguTm90Rm91bmRHcmFwaEVycm9yID0gTm90Rm91bmRHcmFwaEVycm9yO1xuR3JhcGguVXNhZ2VHcmFwaEVycm9yID0gVXNhZ2VHcmFwaEVycm9yO1xuXG5leHBvcnQge1xuICBHcmFwaCxcbiAgRGlyZWN0ZWRHcmFwaCxcbiAgVW5kaXJlY3RlZEdyYXBoLFxuICBNdWx0aUdyYXBoLFxuICBNdWx0aURpcmVjdGVkR3JhcGgsXG4gIE11bHRpVW5kaXJlY3RlZEdyYXBoXG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBpc0dyYXBoXG4gKiA9PT09PT09PT09PT09PT09PT09XG4gKlxuICogVmVyeSBzaW1wbGUgZnVuY3Rpb24gYWltaW5nIGF0IGVuc3VyaW5nIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhXG4gKiBncmFwaG9sb2d5IGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQ2hlY2tpbmcgdGhlIHZhbHVlIGlzIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUubXVsdGkgPT09ICdib29sZWFuJ1xuICApO1xufTtcbiIsICJleHBvcnRzLkFSUkFZX0JVRkZFUl9TVVBQT1JUID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJztcbmV4cG9ydHMuU1lNQk9MX1NVUFBPUlQgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEZvckVhY2ggRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZWFzaWx5IGl0ZXJhdGUgb3ZlciBtaXhlZCB2YWx1ZXMuXG4gKi9cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG4vKipcbiAqIEZ1bmN0aW9uIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFsbW9zdCBhbnkgaXRlcmFibGUgSlMgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICAgIGl0ZXJhYmxlIC0gSXRlcmFibGUgdmFsdWUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JFYWNoKGl0ZXJhYmxlLCBjYWxsYmFjaykge1xuICB2YXIgaXRlcmF0b3IsIGssIGksIGwsIHM7XG5cbiAgaWYgKCFpdGVyYWJsZSkgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBpbnZhbGlkIGl0ZXJhYmxlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nKTtcblxuICAvLyBUaGUgdGFyZ2V0IGlzIGFuIGFycmF5IG9yIGEgc3RyaW5nIG9yIGZ1bmN0aW9uIGFyZ3VtZW50c1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShpdGVyYWJsZSkgfHxcbiAgICAoQVJSQVlfQlVGRkVSX1NVUFBPUlQgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGl0ZXJhYmxlKSkgfHxcbiAgICB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXRlcmFibGUudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSdcbiAgKSB7XG4gICAgZm9yIChpID0gMCwgbCA9IGl0ZXJhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgY2FsbGJhY2soaXRlcmFibGVbaV0sIGkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaGFzIGEgIy5mb3JFYWNoIG1ldGhvZFxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYWJsZS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGlzIGl0ZXJhYmxlXG4gIGlmIChcbiAgICBTWU1CT0xfU1VQUE9SVCAmJlxuICAgIFN5bWJvbC5pdGVyYXRvciBpbiBpdGVyYWJsZSAmJlxuICAgIHR5cGVvZiBpdGVyYWJsZS5uZXh0ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIGl0ZXJhYmxlID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBpcyBhbiBpdGVyYXRvclxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKCgocyA9IGl0ZXJhdG9yLm5leHQoKSksIHMuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGNhbGxiYWNrKHMudmFsdWUsIGkpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgZm9yIChrIGluIGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICBjYWxsYmFjayhpdGVyYWJsZVtrXSwgayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBUeXBlZCBBcnJheSBIZWxwZXJzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIGhlbHBlcnMgcmVsYXRlZCB0byB0eXBlZCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGFuIHVuc2lnbmVkIGludGVnZXIgYXJyYXkgdG8gc3RvcmUgcG9pbnRlcnMsIG9uZSBtaWdodCB3YW50IHRvXG4gKiBjaG9vc2UgdGhlIG9wdGltYWwgd29yZCBzaXplIGluIHJlZ2FyZHMgdG8gdGhlIGFjdHVhbCBudW1iZXJzIG9mIHBvaW50ZXJzXG4gKiB0byBzdG9yZS5cbiAqXG4gKiBUaGlzIGhlbHBlcnMgZG9lcyBqdXN0IHRoYXQuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBzaXplIC0gRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkgdG8gbWFwLlxuICogQHJldHVybiB7VHlwZWRBcnJheX1cbiAqL1xudmFyIE1BWF84QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA4KSAtIDEsXG4gICAgTUFYXzE2QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCAxNikgLSAxLFxuICAgIE1BWF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzIpIC0gMTtcblxudmFyIE1BWF9TSUdORURfOEJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgNykgLSAxLFxuICAgIE1BWF9TSUdORURfMTZCSVRfSU5URUdFUiA9IE1hdGgucG93KDIsIDE1KSAtIDEsXG4gICAgTUFYX1NJR05FRF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzEpIC0gMTtcblxuZXhwb3J0cy5nZXRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfOEJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfMTZCSVRfSU5URUdFUilcbiAgICByZXR1cm4gVWludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF8zMkJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50MzJBcnJheTtcblxuICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdDogUG9pbnRlciBBcnJheSBvZiBzaXplID4gNDI5NDk2NzI5NSBpcyBub3Qgc3VwcG9ydGVkLicpO1xufTtcblxuZXhwb3J0cy5nZXRTaWduZWRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzhCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzE2QklUX0lOVEVHRVIpXG4gICAgcmV0dXJuIEludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF9TSUdORURfMzJCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50MzJBcnJheTtcblxuICByZXR1cm4gRmxvYXQ2NEFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIG1pbmltYWwgdHlwZSBhYmxlIHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gbnVtYmVyLlxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG5leHBvcnRzLmdldE51bWJlclR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXG4gIC8vIDw9IDMyIGJpdHMgaXRudGVnZXI/XG4gIGlmICh2YWx1ZSA9PT0gKHZhbHVlIHwgMCkpIHtcblxuICAgIC8vIE5lZ2F0aXZlXG4gICAgaWYgKE1hdGguc2lnbih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICBpZiAodmFsdWUgPD0gMTI3ICYmIHZhbHVlID49IC0xMjgpXG4gICAgICAgIHJldHVybiBJbnQ4QXJyYXk7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAzMjc2NyAmJiB2YWx1ZSA+PSAtMzI3NjgpXG4gICAgICAgIHJldHVybiBJbnQxNkFycmF5O1xuXG4gICAgICByZXR1cm4gSW50MzJBcnJheTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAyNTUpXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gICAgICBpZiAodmFsdWUgPD0gNjU1MzUpXG4gICAgICAgIHJldHVybiBVaW50MTZBcnJheTtcblxuICAgICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICAgIH1cbiAgfVxuXG4gIC8vIDUzIGJpdHMgaW50ZWdlciAmIGZsb2F0c1xuICAvLyBOT1RFOiBpdCdzIGtpbmRhIGhhcmQgdG8gdGVsbCB3aGV0aGVyIHdlIGNvdWxkIHVzZSAzMmJpdHMgb3Igbm90Li4uXG4gIHJldHVybiBGbG9hdDY0QXJyYXk7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB0aGUgbWluaW1hbCB0eXBlIGFibGUgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBhcnJheVxuICogb2YgSmF2YVNjcmlwdCBudW1iZXJzLlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgICBhcnJheSAgLSBBcnJheSB0byByZXByZXNlbnQuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gZ2V0dGVyIC0gT3B0aW9uYWwgZ2V0dGVyLlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG52YXIgVFlQRV9QUklPUklUWSA9IHtcbiAgVWludDhBcnJheTogMSxcbiAgSW50OEFycmF5OiAyLFxuICBVaW50MTZBcnJheTogMyxcbiAgSW50MTZBcnJheTogNCxcbiAgVWludDMyQXJyYXk6IDUsXG4gIEludDMyQXJyYXk6IDYsXG4gIEZsb2F0MzJBcnJheTogNyxcbiAgRmxvYXQ2NEFycmF5OiA4XG59O1xuXG4vLyBUT0RPOiBtYWtlIHRoaXMgYSBvbmUtc2hvdCBmb3Igb25lIHZhbHVlXG5leHBvcnRzLmdldE1pbmltYWxSZXByZXNlbnRhdGlvbiA9IGZ1bmN0aW9uKGFycmF5LCBnZXR0ZXIpIHtcbiAgdmFyIG1heFR5cGUgPSBudWxsLFxuICAgICAgbWF4UHJpb3JpdHkgPSAwLFxuICAgICAgcCxcbiAgICAgIHQsXG4gICAgICB2LFxuICAgICAgaSxcbiAgICAgIGw7XG5cbiAgZm9yIChpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHYgPSBnZXR0ZXIgPyBnZXR0ZXIoYXJyYXlbaV0pIDogYXJyYXlbaV07XG4gICAgdCA9IGV4cG9ydHMuZ2V0TnVtYmVyVHlwZSh2KTtcbiAgICBwID0gVFlQRV9QUklPUklUWVt0Lm5hbWVdO1xuXG4gICAgaWYgKHAgPiBtYXhQcmlvcml0eSkge1xuICAgICAgbWF4UHJpb3JpdHkgPSBwO1xuICAgICAgbWF4VHlwZSA9IHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heFR5cGU7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0cy5pc1R5cGVkQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbmNhdCBieXRlIGFycmF5cy5cbiAqXG4gKiBAcGFyYW0gIHsuLi5CeXRlQXJyYXl9XG4gKiBAcmV0dXJuIHtCeXRlQXJyYXl9XG4gKi9cbmV4cG9ydHMuY29uY2F0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsZW5ndGggPSAwLFxuICAgICAgaSxcbiAgICAgIG8sXG4gICAgICBsO1xuXG4gIGZvciAoaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgIGxlbmd0aCArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuXG4gIHZhciBhcnJheSA9IG5ldyAoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yKShsZW5ndGgpO1xuXG4gIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJyYXkuc2V0KGFyZ3VtZW50c1tpXSwgbyk7XG4gICAgbyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgYSBieXRlIGFycmF5IG9mIGluZGljZXMuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSAgICBsZW5ndGggLSBMZW5ndGggb2YgdGFyZ2V0LlxuICogQHJldHVybiB7Qnl0ZUFycmF5fVxuICovXG5leHBvcnRzLmluZGljZXMgPSBmdW5jdGlvbihsZW5ndGgpIHtcbiAgdmFyIFBvaW50ZXJBcnJheSA9IGV4cG9ydHMuZ2V0UG9pbnRlckFycmF5KGxlbmd0aCk7XG5cbiAgdmFyIGFycmF5ID0gbmV3IFBvaW50ZXJBcnJheShsZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgYXJyYXlbaV0gPSBpO1xuXG4gIHJldHVybiBhcnJheTtcbn07XG4iLCAiLyoqXG4gKiBNbmVtb25pc3QgSXRlcmFibGUgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBIYXJtb25pemVkIGl0ZXJhdGlvbiBoZWxwZXJzIG92ZXIgbWl4ZWQgaXRlcmFibGUgdGFyZ2V0cy5cbiAqL1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCdvYmxpdGVyYXRvci9mb3JlYWNoJyk7XG5cbnZhciB0eXBlZCA9IHJlcXVpcmUoJy4vdHlwZWQtYXJyYXlzLmpzJyk7XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IHN1cHBvcnRzIGFycmF5LWxpa2VcbiAqIHJhbmRvbSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodGFyZ2V0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgfHwgdHlwZWQuaXNUeXBlZEFycmF5KHRhcmdldCk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBndWVzcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3R1cmUgb3ZlciB3aGljaCB3ZSBhcmUgZ29pbmdcbiAqIHRvIGl0ZXJhdGUuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7bnVtYmVyfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ3Vlc3NMZW5ndGgodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdGFyZ2V0Lmxlbmd0aCA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5sZW5ndGg7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQuc2l6ZSA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5zaXplO1xuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbnZlcnQgYW4gaXRlcmFibGUgdG8gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgdmFyIGwgPSBndWVzc0xlbmd0aCh0YXJnZXQpO1xuXG4gIHZhciBhcnJheSA9IHR5cGVvZiBsID09PSAnbnVtYmVyJyA/IG5ldyBBcnJheShsKSA6IFtdO1xuXG4gIHZhciBpID0gMDtcblxuICAvLyBUT0RPOiB3ZSBjb3VsZCBvcHRpbWl6ZSB3aGVuIGdpdmVuIHRhcmdldCBpcyBhcnJheSBsaWtlXG4gIGZvckVhY2godGFyZ2V0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGFycmF5W2krK10gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNhbWUgYXMgYWJvdmUgYnV0IHJldHVybnMgYSBzdXBwbGVtZW50YXJ5IGluZGljZXMgYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheVdpdGhJbmRpY2VzKHRhcmdldCkge1xuICB2YXIgbCA9IGd1ZXNzTGVuZ3RoKHRhcmdldCk7XG5cbiAgdmFyIEluZGV4QXJyYXkgPSB0eXBlb2YgbCA9PT0gJ251bWJlcicgP1xuICAgIHR5cGVkLmdldFBvaW50ZXJBcnJheShsKSA6XG4gICAgQXJyYXk7XG5cbiAgdmFyIGFycmF5ID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEFycmF5KGwpIDogW107XG4gIHZhciBpbmRpY2VzID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEluZGV4QXJyYXkobCkgOiBbXTtcblxuICB2YXIgaSA9IDA7XG5cbiAgLy8gVE9ETzogd2UgY291bGQgb3B0aW1pemUgd2hlbiBnaXZlbiB0YXJnZXQgaXMgYXJyYXkgbGlrZVxuICBmb3JFYWNoKHRhcmdldCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBhcnJheVtpXSA9IHZhbHVlO1xuICAgIGluZGljZXNbaV0gPSBpKys7XG4gIH0pO1xuXG4gIHJldHVybiBbYXJyYXksIGluZGljZXNdO1xufVxuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xuZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuZXhwb3J0cy5ndWVzc0xlbmd0aCA9IGd1ZXNzTGVuZ3RoO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcbmV4cG9ydHMudG9BcnJheVdpdGhJbmRpY2VzID0gdG9BcnJheVdpdGhJbmRpY2VzO1xuIiwgIi8qKlxuICogT2JsaXRlcmF0b3IgSXRlcmF0b3IgQ2xhc3NcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIFNpbXBsZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkncyBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRvciBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHQgLSBOZXh0IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBJdGVyYXRvcihuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ibGl0ZXJhdG9yL2l0ZXJhdG9yOiBleHBlY3RpbmcgYSBmdW5jdGlvbiEnKTtcblxuICB0aGlzLm5leHQgPSBuZXh0O1xufVxuXG4vKipcbiAqIElmIHN5bWJvbHMgYXJlIHN1cHBvcnRlZCwgd2UgYWRkIGBuZXh0YCB0byBgU3ltYm9sLml0ZXJhdG9yYC5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb2YgdGhlIGdpdmVuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gIHthbnkuLi59IHZhbHVlcyAtIFZhbHVlcy5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5vZiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgbCA9IGFyZ3MubGVuZ3RoLFxuICAgIGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpID49IGwpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICByZXR1cm4ge2RvbmU6IGZhbHNlLCB2YWx1ZTogYXJnc1tpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvci5cbiAqXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3IuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpdGVyYXRvciA9IG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtkb25lOiB0cnVlfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gaW5kZXhlZCBzZXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHNlcXVlbmNlIC0gVGFyZ2V0IHNlcXVlbmNlLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmZyb21TZXF1ZW5jZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB2YXIgaSA9IDAsXG4gICAgbCA9IHNlcXVlbmNlLmxlbmd0aDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IHNlcXVlbmNlW2krK119O1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGl0ZXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkl0ZXJhdG9yLmlzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5uZXh0ID09PSAnZnVuY3Rpb24nXG4gICk7XG59O1xuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBJdGVyYXRvcjtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBGaXhlZERlcXVlXG4gKiA9PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBGaXhlZCBjYXBhY2l0eSBkb3VibGUtZW5kZWQgcXVldWUgaW1wbGVtZW50ZWQgYXMgcmluZyBkZXF1ZS5cbiAqL1xudmFyIGl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4vdXRpbHMvaXRlcmFibGVzLmpzJyksXG4gICAgSXRlcmF0b3IgPSByZXF1aXJlKCdvYmxpdGVyYXRvci9pdGVyYXRvcicpO1xuXG4vKipcbiAqIEZpeGVkRGVxdWUuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEZpeGVkRGVxdWUoQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdtbmVtb25pc3QvZml4ZWQtZGVxdWU6IGV4cGVjdGluZyBhbiBBcnJheSBjbGFzcyBhbmQgYSBjYXBhY2l0eS4nKTtcblxuICBpZiAodHlwZW9mIGNhcGFjaXR5ICE9PSAnbnVtYmVyJyB8fCBjYXBhY2l0eSA8PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlOiBgY2FwYWNpdHlgIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlci4nKTtcblxuICB0aGlzLkFycmF5Q2xhc3MgPSBBcnJheUNsYXNzO1xuICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXlDbGFzcyh0aGlzLmNhcGFjaXR5KTtcbiAgdGhpcy5jbGVhcigpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGNsZWFyIHRoZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHJldHVybiB7dW5kZWZpbmVkfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIFByb3BlcnRpZXNcbiAgdGhpcy5zdGFydCA9IDA7XG4gIHRoaXMuc2l6ZSA9IDA7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGFwcGVuZCBhIHZhbHVlIHRvIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgIGl0ZW0gLSBJdGVtIHRvIGFwcGVuZC5cbiAqIEByZXR1cm4ge251bWJlcn0gICAgICAtIFJldHVybnMgdGhlIG5ldyBzaXplIG9mIHRoZSBkZXF1ZS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gdGhpcy5jYXBhY2l0eSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5wdXNoOiBkZXF1ZSBjYXBhY2l0eSAoJyArIHRoaXMuY2FwYWNpdHkgKyAnKSBleGNlZWRlZCEnKTtcblxuICB2YXIgaW5kZXggPSAodGhpcy5zdGFydCArIHRoaXMuc2l6ZSkgJSB0aGlzLmNhcGFjaXR5O1xuXG4gIHRoaXMuaXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICByZXR1cm4gKyt0aGlzLnNpemU7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIHByZXBlbmQgYSB2YWx1ZSB0byB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBpdGVtIC0gSXRlbSB0byBwcmVwZW5kLlxuICogQHJldHVybiB7bnVtYmVyfSAgICAgIC0gUmV0dXJucyB0aGUgbmV3IHNpemUgb2YgdGhlIGRlcXVlLlxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oaXRlbSkge1xuICBpZiAodGhpcy5zaXplID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlLnVuc2hpZnQ6IGRlcXVlIGNhcGFjaXR5ICgnICsgdGhpcy5jYXBhY2l0eSArICcpIGV4Y2VlZGVkIScpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgLSAxO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSAwKVxuICAgIGluZGV4ID0gdGhpcy5jYXBhY2l0eSAtIDE7XG5cbiAgdGhpcy5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICB0aGlzLnN0YXJ0ID0gaW5kZXg7XG5cbiAgcmV0dXJuICsrdGhpcy5zaXplO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwb3AgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX0gLSBSZXR1cm5zIHRoZSBwb3BwZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IGluZGV4ID0gKHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxKSAlIHRoaXMuY2FwYWNpdHk7XG5cbiAgdGhpcy5zaXplLS07XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBzaGlmdCB0aGUgZGVxdWUuXG4gKlxuICogQHJldHVybiB7YW55fSAtIFJldHVybnMgdGhlIHNoaWZ0ZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgdmFyIGluZGV4ID0gdGhpcy5zdGFydDtcblxuICB0aGlzLnNpemUtLTtcbiAgdGhpcy5zdGFydCsrO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRoaXMuc3RhcnQgPSAwO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW2luZGV4XTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHVzZWQgdG8gcGVlayB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucGVla0ZpcnN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW3RoaXMuc3RhcnRdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwZWVrIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnBlZWtMYXN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxO1xuXG4gIGlmIChpbmRleCA+IHRoaXMuY2FwYWNpdHkpXG4gICAgaW5kZXggLT0gdGhpcy5jYXBhY2l0eTtcblxuICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF07XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZSBvZiB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7YW55fVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICBpZiAodGhpcy5zaXplID09PSAwKVxuICAgIHJldHVybjtcblxuICBpbmRleCA9IHRoaXMuc3RhcnQgKyBpbmRleDtcblxuICBpZiAoaW5kZXggPiB0aGlzLmNhcGFjaXR5KVxuICAgIGluZGV4IC09IHRoaXMuY2FwYWNpdHk7XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGRlcXVlLlxuICpcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGl0ZW0uXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgIHNjb3BlICAgIC0gT3B0aW9uYWwgc2NvcGUuXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgc2NvcGUpIHtcbiAgc2NvcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNjb3BlIDogdGhpcztcblxuICB2YXIgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICB3aGlsZSAoaiA8IGwpIHtcbiAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCB0aGlzLml0ZW1zW2ldLCBqLCB0aGlzKTtcbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjb252ZXJ0IHRoZSBkZXF1ZSB0byBhIEphdmFTY3JpcHQgYXJyYXkuXG4gKlxuICogQHJldHVybiB7YXJyYXl9XG4gKi9cbi8vIFRPRE86IG9wdGlvbmFsIGFycmF5IGNsYXNzIGFzIGFyZ3VtZW50P1xuRml4ZWREZXF1ZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIE9wdGltaXphdGlvblxuICB2YXIgb2Zmc2V0ID0gdGhpcy5zdGFydCArIHRoaXMuc2l6ZTtcblxuICBpZiAob2Zmc2V0IDwgdGhpcy5jYXBhY2l0eSlcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zbGljZSh0aGlzLnN0YXJ0LCBvZmZzZXQpO1xuXG4gIHZhciBhcnJheSA9IG5ldyB0aGlzLkFycmF5Q2xhc3ModGhpcy5zaXplKSxcbiAgICAgIGMgPSB0aGlzLmNhcGFjaXR5LFxuICAgICAgbCA9IHRoaXMuc2l6ZSxcbiAgICAgIGkgPSB0aGlzLnN0YXJ0LFxuICAgICAgaiA9IDA7XG5cbiAgd2hpbGUgKGogPCBsKSB7XG4gICAgYXJyYXlbal0gPSB0aGlzLml0ZW1zW2ldO1xuICAgIGkrKztcbiAgICBqKys7XG5cbiAgICBpZiAoaSA9PT0gYylcbiAgICAgIGkgPSAwO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyB2YWx1ZXMuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zLFxuICAgICAgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgIGlmIChqID49IGwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuXG4gICAgdmFyIHZhbHVlID0gaXRlbXNbaV07XG5cbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyBlbnRyaWVzLlxuICpcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuaXRlbXMsXG4gICAgICBjID0gdGhpcy5jYXBhY2l0eSxcbiAgICAgIGwgPSB0aGlzLnNpemUsXG4gICAgICBpID0gdGhpcy5zdGFydCxcbiAgICAgIGogPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGogPj0gbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSBpdGVtc1tpXTtcblxuICAgIGkrKztcblxuICAgIGlmIChpID09PSBjKVxuICAgICAgaSA9IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IFtqKyssIHZhbHVlXSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEF0dGFjaGluZyB0aGUgIy52YWx1ZXMgbWV0aG9kIHRvIFN5bWJvbC5pdGVyYXRvciBpZiBwb3NzaWJsZS5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBGaXhlZERlcXVlLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gRml4ZWREZXF1ZS5wcm90b3R5cGUudmFsdWVzO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGtub3duIG1ldGhvZHMuXG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFycmF5ID0gdGhpcy50b0FycmF5KCk7XG5cbiAgYXJyYXkudHlwZSA9IHRoaXMuQXJyYXlDbGFzcy5uYW1lO1xuICBhcnJheS5jYXBhY2l0eSA9IHRoaXMuY2FwYWNpdHk7XG5cbiAgLy8gVHJpY2sgc28gdGhhdCBub2RlIGRpc3BsYXlzIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksICdjb25zdHJ1Y3RvcicsIHtcbiAgICB2YWx1ZTogRml4ZWREZXF1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEZpeGVkRGVxdWUucHJvdG90eXBlW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldID0gRml4ZWREZXF1ZS5wcm90b3R5cGUuaW5zcGVjdDtcblxuLyoqXG4gKiBTdGF0aWMgQC5mcm9tIGZ1bmN0aW9uIHRha2luZyBhbiBhcmJpdHJhcnkgaXRlcmFibGUgJiBjb252ZXJ0aW5nIGl0IGludG9cbiAqIGEgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7SXRlcmFibGV9IGl0ZXJhYmxlICAgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gQXJyYXlDbGFzcyAtIEFycmF5IGNsYXNzIHRvIHVzZS5cbiAqIEBwYXJhbSAge251bWJlcn0gICBjYXBhY2l0eSAgIC0gRGVzaXJlZCBjYXBhY2l0eS5cbiAqIEByZXR1cm4ge0Zpbml0ZVN0YWNrfVxuICovXG5GaXhlZERlcXVlLmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSwgQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgY2FwYWNpdHkgPSBpdGVyYWJsZXMuZ3Vlc3NMZW5ndGgoaXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBjYXBhY2l0eSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5mcm9tOiBjb3VsZCBub3QgZ3Vlc3MgaXRlcmFibGUgbGVuZ3RoLiBQbGVhc2UgcHJvdmlkZSBkZXNpcmVkIGNhcGFjaXR5IGFzIGxhc3QgYXJndW1lbnQuJyk7XG4gIH1cblxuICB2YXIgZGVxdWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheUNsYXNzLCBjYXBhY2l0eSk7XG5cbiAgaWYgKGl0ZXJhYmxlcy5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGZvciAoaSA9IDAsIGwgPSBpdGVyYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICBkZXF1ZS5pdGVtc1tpXSA9IGl0ZXJhYmxlW2ldO1xuXG4gICAgZGVxdWUuc2l6ZSA9IGw7XG5cbiAgICByZXR1cm4gZGVxdWU7XG4gIH1cblxuICBpdGVyYWJsZXMuZm9yRWFjaChpdGVyYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBkZXF1ZS5wdXNoKHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRlcXVlO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gRml4ZWREZXF1ZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIFV0aWxzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIHV0aWxzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqL1xuXG5mdW5jdGlvbiBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgZGVwdGgpIHtcbiAgdGhpcy5ub2RlID0gbm9kZTtcbiAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cjtcbiAgdGhpcy5kZXB0aCA9IGRlcHRoO1xufVxuXG5leHBvcnRzLlRyYXZlcnNhbFJlY29yZCA9IFRyYXZlcnNhbFJlY29yZDtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIEJGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEJyZWFkdGgtRmlyc3QgU2VhcmNoIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xudmFyIGlzR3JhcGggPSByZXF1aXJlKCdncmFwaG9sb2d5LXV0aWxzL2lzLWdyYXBoJyk7XG52YXIgRml4ZWREZXF1ZSA9IHJlcXVpcmUoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZScpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2JmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvYmZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgcXVldWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheSwgZ3JhcGgub3JkZXIpO1xuICB2YXIgcmVjb3JkLCBkZXB0aDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgZ3JhcGguZm9yRWFjaE5vZGUoZnVuY3Rpb24obm9kZSwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhub2RlKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5vZGUpO1xuICAgIHF1ZXVlLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBhdHRyLCAwKSk7XG5cbiAgICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGRlcHRoID0gcmVjb3JkLmRlcHRoO1xuXG4gICAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGgsIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIG5vZGUsIHVzaW5nIGFcbiAqIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbm9kZSAgICAgLSBTdGFydGluZyBub2RlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmc0Zyb21Ob2RlKGdyYXBoLCBub2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzR3JhcGgoZ3JhcGgpKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBleHBlY3RpbmcgYSBncmFwaG9sb2d5IGluc3RhbmNlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdncmFwaG9sb2d5LXRyYXZlcnNhbC9kZnM6IGdpdmVuIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xuXG4gIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gIGlmIChncmFwaC5vcmRlciA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgbm9kZSA9ICcnICsgbm9kZTtcblxuICB2YXIgc2VlbiA9IG5ldyBTZXQoKTtcbiAgdmFyIHF1ZXVlID0gbmV3IEZpeGVkRGVxdWUoQXJyYXksIGdyYXBoLm9yZGVyKTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgcXVldWUucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIHNlZW4uYWRkKG5vZGUpO1xuICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgZ3JhcGguZ2V0Tm9kZUF0dHJpYnV0ZXMobm9kZSksIDApKTtcblxuICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgIHJlY29yZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgZGVwdGggPSByZWNvcmQuZGVwdGg7XG5cbiAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnRzLmJmcyA9IGJmcztcbmV4cG9ydHMuYmZzRnJvbU5vZGUgPSBiZnNGcm9tTm9kZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIERGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlcHRoLUZpcnN0IFNlYXJjaCB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cbnZhciBpc0dyYXBoID0gcmVxdWlyZSgnZ3JhcGhvbG9neS11dGlscy9pcy1ncmFwaCcpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogREZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGRmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgc3RhY2sucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIGdyYXBoLmZvckVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUsIGF0dHIpIHtcbiAgICBpZiAoc2Vlbi5oYXMobm9kZSkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgMCkpO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gc3RhY2sucG9wKCk7XG4gICAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgICAgY2FsbGJhY2socmVjb3JkLm5vZGUsIHJlY29yZC5hdHRyaWJ1dGVzLCBkZXB0aCk7XG5cbiAgICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIERGUyB0cmF2ZXJzYWwgaW4gdGhlIGdpdmVuIGdyYXBoLCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlLCB1c2luZyBhXG4gKiBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBncmFwaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG5vZGUgICAgIC0gU3RhcnRpbmcgbm9kZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gSXRlcmF0aW9uIGNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBkZnNGcm9tTm9kZShncmFwaCwgbm9kZSwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgdmFyIHNlZW4gPSBuZXcgU2V0KCk7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgZGVwdGgsIHJlY29yZDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgc2Vlbi5hZGQobm9kZSk7XG4gIHN0YWNrLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBncmFwaC5nZXROb2RlQXR0cmlidXRlcyhub2RlKSwgMCkpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggIT09IDApIHtcbiAgICByZWNvcmQgPSBzdGFjay5wb3AoKTtcbiAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgIGNhbGxiYWNrKHJlY29yZC5ub2RlLCByZWNvcmQuYXR0cmlidXRlcywgZGVwdGgpO1xuXG4gICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydHMuZGZzID0gZGZzO1xuZXhwb3J0cy5kZnNGcm9tTm9kZSA9IGRmc0Zyb21Ob2RlO1xuIiwgInZhciBiZnNNb2R1bGUgPSByZXF1aXJlKCcuL2Jmcy5qcycpO1xudmFyIGRmc01vZHVsZSA9IHJlcXVpcmUoJy4vZGZzLmpzJyk7XG5cbnZhciBrO1xuXG5mb3IgKGsgaW4gYmZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gYmZzTW9kdWxlW2tdO1xuXG5mb3IgKGsgaW4gZGZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gZGZzTW9kdWxlW2tdO1xuIiwgIi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTHV4b25FcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlVGltZUVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIERhdGVUaW1lOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSW50ZXJ2YWxFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBJbnRlcnZhbDogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZER1cmF0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7fVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVW5pdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICBzdXBlcihgSW52YWxpZCB1bml0ICR7dW5pdH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige31cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgWm9uZUlzQWJzdHJhY3RFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIik7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY29uc3QgbiA9IFwibnVtZXJpY1wiLFxuICBzID0gXCJzaG9ydFwiLFxuICBsID0gXCJsb25nXCI7XG5cbmV4cG9ydCBjb25zdCBEQVRFX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgd2Vla2RheTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IHMsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG4iLCAiLypcbiAgVGhpcyBpcyBqdXN0IGEganVuayBkcmF3ZXIsIGNvbnRhaW5pbmcgYW55dGhpbmcgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgY2xhc3Nlcy5cbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcbiAgaXQgdXAgaW50bywgc2F5LCBwYXJzaW5nVXRpbC5qcyBhbmQgYmFzaWNVdGlsLmpzIGFuZCBzbyBvbi4gQnV0IHRoZXkgYXJlIGRpdmlkZWQgdXAgYnkgZmVhdHVyZSBhcmVhLlxuKi9cblxuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG4vLyBUWVBFU1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIiAmJiBvICUgMSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG59XG5cbi8vIENBUEFCSUxJVElFU1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVsYXRpdmUoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSBcInVuZGVmaW5lZFwiICYmICEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuICAgIGlmICghYmVzdCkge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfSBlbHNlIGlmIChjb21wYXJlKGJlc3RbMF0sIHBhaXJbMF0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2sob2JqLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgoYSwgaykgPT4ge1xuICAgIGFba10gPSBvYmpba107XG4gICAgcmV0dXJuIGE7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbi8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXJCZXR3ZWVuKHRoaW5nLCBib3R0b20sIHRvcCkge1xuICByZXR1cm4gaXNJbnRlZ2VyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufVxuXG4vLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcbmV4cG9ydCBmdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkU3RhcnQoaW5wdXQsIG4gPSAyKSB7XG4gIGNvbnN0IGlzTmVnID0gaW5wdXQgPCAwO1xuICBsZXQgcGFkZGVkO1xuICBpZiAoaXNOZWcpIHtcbiAgICBwYWRkZWQgPSBcIi1cIiArIChcIlwiICsgLWlucHV0KS5wYWRTdGFydChuLCBcIjBcIik7XG4gIH0gZWxzZSB7XG4gICAgcGFkZGVkID0gKFwiXCIgKyBpbnB1dCkucGFkU3RhcnQobiwgXCIwXCIpO1xuICB9XG4gIHJldHVybiBwYWRkZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGbG9hdGluZyhzdHJpbmcpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHN0cmluZykgfHwgc3RyaW5nID09PSBudWxsIHx8IHN0cmluZyA9PT0gXCJcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyaW5nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gMTAgKiogZGlnaXRzLFxuICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgY29uc3QgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcbmV4cG9ydCBmdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIGxldCBkID0gRGF0ZS5VVEMoXG4gICAgb2JqLnllYXIsXG4gICAgb2JqLm1vbnRoIC0gMSxcbiAgICBvYmouZGF5LFxuICAgIG9iai5ob3VyLFxuICAgIG9iai5taW51dGUsXG4gICAgb2JqLnNlY29uZCxcbiAgICBvYmoubWlsbGlzZWNvbmRcbiAgKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIGNvbnN0IHAxID1cbiAgICAgICh3ZWVrWWVhciArXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICtcbiAgICAgICAgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICVcbiAgICAgIDcsXG4gICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn1cblxuLy8gUEFSU0lOR1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUsIHRpbWVab25lID0gbnVsbCkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgIGludGxPcHRzID0ge1xuICAgICAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0geyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCwgLi4uaW50bE9wdHMgfTtcblxuICBjb25zdCBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKVxuICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG59XG5cbi8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICBsZXQgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKTtcblxuICAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuICBpZiAoTnVtYmVyLmlzTmFOKG9mZkhvdXIpKSB7XG4gICAgb2ZmSG91ciA9IDA7XG4gIH1cblxuICBjb25zdCBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwIHx8IE9iamVjdC5pcyhvZmZIb3VyLCAtMCkgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufVxuXG4vLyBDT0VSQ0lPTlxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWUpIHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT09IFwiXCIgfHwgTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHVuaXQgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgcmV0dXJuIG51bWVyaWNWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBmb3IgKGNvbnN0IHUgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgdSkpIHtcbiAgICAgIGNvbnN0IHYgPSBvYmpbdV07XG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVyKHUpXSA9IGFzTnVtYmVyKHYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgIHNpZ24gPSBvZmZzZXQgPj0gMCA/IFwiK1wiIDogXCItXCI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7cGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtob3Vyc30ke21pbnV0ZXMgPiAwID8gYDoke21pbnV0ZXN9YCA6IFwiXCJ9YDtcbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtmb3JtYXR9IGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlhbmFSZWdleCA9IC9bQS1aYS16XystXXsxLDI1Nn0oOj9cXC9bQS1aYS16MC05XystXXsxLDI1Nn0oXFwvW0EtWmEtejAtOV8rLV17MSwyNTZ9KT8pPy87XG4iLCAiaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9mb3JtYXRzLmpzXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjb25zdCBtb250aHNMb25nID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBbXG4gIFwiSmFuXCIsXG4gIFwiRmViXCIsXG4gIFwiTWFyXCIsXG4gIFwiQXByXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuXCIsXG4gIFwiSnVsXCIsXG4gIFwiQXVnXCIsXG4gIFwiU2VwXCIsXG4gIFwiT2N0XCIsXG4gIFwiTm92XCIsXG4gIFwiRGVjXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzTmFycm93ID0gW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzTmFycm93XTtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzU2hvcnRdO1xuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gWy4uLm1vbnRoc0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNMb25nID0gW1xuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG4gIFwiU3VuZGF5XCIsXG5dO1xuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcblxuZXhwb3J0IGNvbnN0IHdlZWtkYXlzTmFycm93ID0gW1wiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCIsIFwiU1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ud2Vla2RheXNOYXJyb3ddO1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c1Nob3J0XTtcbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcblxuZXhwb3J0IGNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc05hcnJvd107XG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gWy4uLmVyYXNTaG9ydF07XG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc0xvbmddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdLFxuICB9O1xuXG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuICAgIHN3aXRjaCAoY291bnQpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b21vcnJvd1wiIDogYG5leHQgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IGBsYXN0ICR7dW5pdHNbdW5pdF1bMF19YDtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgZGVmYXVsdDogLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgc2luZ3VsYXIgPSBmbXRWYWx1ZSA9PT0gMSxcbiAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgIGZtdFVuaXQgPSBuYXJyb3dcbiAgICAgID8gc2luZ3VsYXJcbiAgICAgICAgPyBsaWxVbml0c1sxXVxuICAgICAgICA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdXG4gICAgICA6IHNpbmd1bGFyXG4gICAgICA/IHVuaXRzW3VuaXRdWzBdXG4gICAgICA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcbiAgICAgIFwid2Vla2RheVwiLFxuICAgICAgXCJlcmFcIixcbiAgICAgIFwieWVhclwiLFxuICAgICAgXCJtb250aFwiLFxuICAgICAgXCJkYXlcIixcbiAgICAgIFwiaG91clwiLFxuICAgICAgXCJtaW51dGVcIixcbiAgICAgIFwic2Vjb25kXCIsXG4gICAgICBcInRpbWVab25lTmFtZVwiLFxuICAgICAgXCJob3VyQ3ljbGVcIixcbiAgICBdKSxcbiAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9IVUdFKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FXzI0X1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiSEg6bW06c3NcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW0gYVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBkIExMTCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiBzcGxpdHMpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxuY29uc3QgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogRm9ybWF0cy5EQVRFX1NIT1JULFxuICBERDogRm9ybWF0cy5EQVRFX01FRCxcbiAgREREOiBGb3JtYXRzLkRBVEVfRlVMTCxcbiAgRERERDogRm9ybWF0cy5EQVRFX0hVR0UsXG4gIHQ6IEZvcm1hdHMuVElNRV9TSU1QTEUsXG4gIHR0OiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IEZvcm1hdHMuVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogRm9ybWF0cy5USU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IEZvcm1hdHMuREFURVRJTUVfU0hPUlQsXG4gIGZmOiBGb3JtYXRzLkRBVEVUSU1FX01FRCxcbiAgZmZmOiBGb3JtYXRzLkRBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IEZvcm1hdHMuREFURVRJTUVfSFVHRSxcbiAgRjogRm9ybWF0cy5EQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICBjdXJyZW50RnVsbCA9IFwiXCIsXG4gICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGJyYWNrZXRlZCwgdmFsOiBjdXJyZW50RnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG4gICAgY29uc3QgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgeyAuLi50aGlzLm9wdHMsIC4uLm9wdHMgfSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfVxuXG4gIG51bShuLCBwID0gMCkge1xuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLm9wdHMgfTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIGNvbnN0IGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiLFxuICAgICAgc3RyaW5nID0gKG9wdHMsIGV4dHJhY3QpID0+IHRoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpLFxuICAgICAgZm9ybWF0T2Zmc2V0ID0gKG9wdHMpID0+IHtcbiAgICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICAgIH0sXG4gICAgICBtZXJpZGllbSA9ICgpID0+XG4gICAgICAgIGtub3duRW5nbGlzaFxuICAgICAgICAgID8gRW5nbGlzaC5tZXJpZGllbUZvckRhdGVUaW1lKGR0KVxuICAgICAgICAgIDogc3RyaW5nKHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9LCBcImRheXBlcmlvZFwiKSxcbiAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT5cbiAgICAgICAga25vd25FbmdsaXNoXG4gICAgICAgICAgPyBFbmdsaXNoLm1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aClcbiAgICAgICAgICA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKSxcbiAgICAgIHdlZWtkYXkgPSAobGVuZ3RoLCBzdGFuZGFsb25lKSA9PlxuICAgICAgICBrbm93bkVuZ2xpc2hcbiAgICAgICAgICA/IEVuZ2xpc2gud2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpXG4gICAgICAgICAgOiBzdHJpbmcoXG4gICAgICAgICAgICAgIHN0YW5kYWxvbmUgPyB7IHdlZWtkYXk6IGxlbmd0aCB9IDogeyB3ZWVrZGF5OiBsZW5ndGgsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9LFxuICAgICAgICAgICAgICBcIndlZWtkYXlcIlxuICAgICAgICAgICAgKSxcbiAgICAgIG1heWJlTWFjcm8gPSAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuKTtcbiAgICAgICAgaWYgKGZvcm1hdE9wdHMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJhID0gKGxlbmd0aCkgPT5cbiAgICAgICAga25vd25FbmdsaXNoID8gRW5nbGlzaC5lcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7IGVyYTogbGVuZ3RoIH0sIFwiZXJhXCIpLFxuICAgICAgdG9rZW5Ub1N0cmluZyA9ICh0b2tlbikgPT4ge1xuICAgICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgICAvLyBtc1xuICAgICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAgIC8vIGZyYWN0aW9uYWwgc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJ1dVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQubWlsbGlzZWNvbmQgLyAxMCksIDIpO1xuICAgICAgICAgIGNhc2UgXCJ1dXVcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGR0Lm1pbGxpc2Vjb25kIC8gMTAwKSk7XG4gICAgICAgICAgLy8gbWludXRlc1xuICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlKTtcbiAgICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5ob3VyICUgMTIgPT09IDAgPyAxMiA6IGR0LmhvdXIgJSAxMik7XG4gICAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91cik7XG4gICAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciwgMik7XG4gICAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoeyBmb3JtYXQ6IFwibmFycm93XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInNob3J0XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInRlY2hpZVwiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJzaG9ydFwiLCBsb2NhbGU6IHRoaXMubG9jLmxvY2FsZSB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJsb25nXCIsIGxvY2FsZTogdGhpcy5sb2MubG9jYWxlIH0pO1xuICAgICAgICAgIC8vIHpvbmVcbiAgICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZU5hbWU7XG4gICAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAgIC8vIGRhdGVzXG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IGRheTogXCJudW1lcmljXCIgfSwgXCJkYXlcIikgOiB0aGlzLm51bShkdC5kYXkpO1xuICAgICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHsgZGF5OiBcIjItZGlnaXRcIiB9LCBcImRheVwiKSA6IHRoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG4gICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG4gICAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIHN0YW5kYWxvbmVcbiAgICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCJudW1lcmljXCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDEsIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCIyLWRpZ2l0XCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoLCAyKTtcbiAgICAgICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgdHJ1ZSk7XG4gICAgICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IG1vbnRoOiBcIm51bWVyaWNcIiB9LCBcIm1vbnRoXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQubW9udGgpO1xuICAgICAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwiMi1kaWdpdFwiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgICAvLyB5ZWFyc1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAvLyBsaWtlIDIwMTRcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCIyLWRpZ2l0XCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCJudW1lcmljXCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhciwgNCk7XG4gICAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMDAwMTJcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAgIC8vIGVyYXNcbiAgICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgICAgcmV0dXJuIGVyYShcInNob3J0XCIpO1xuICAgICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG4gICAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgICByZXR1cm4gZXJhKFwibmFycm93XCIpO1xuICAgICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLCA0KTtcbiAgICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQub3JkaW5hbCk7XG4gICAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyKTtcbiAgICAgICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyLCAyKTtcbiAgICAgICAgICBjYXNlIFwiWFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG4gICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC50cyk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgY29uc3QgdG9rZW5Ub0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodG9rZW5bMF0pIHtcbiAgICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG4gICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuICAgICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJob3VyXCI7XG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImRheVwiO1xuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJ5ZWFyXCI7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9rZW5Ub1N0cmluZyA9IChsaWxkdXIpID0+ICh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGxpbGR1ci5nZXQobWFwcGVkKSwgdG9rZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgIHJlYWxUb2tlbnMgPSB0b2tlbnMucmVkdWNlKFxuICAgICAgICAoZm91bmQsIHsgbGl0ZXJhbCwgdmFsIH0pID0+IChsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8oLi4ucmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoKHQpID0+IHQpKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWQge1xuICBjb25zdHJ1Y3RvcihyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5leHBsYW5hdGlvbiA9IGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgdG9NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmV4cGxhbmF0aW9uKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IFpvbmVJc0Fic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB6b25lLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLiBBY2NlcHRzICdsb25nJyBvciAnc2hvcnQnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG9mZnNldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnbmFycm93JywgJ3Nob3J0Jywgb3IgJ3RlY2hpZScuIFJldHVybmluZyAnKzYnLCAnKzA2OjAwJywgb3IgJyswNjAwJyByZXNwZWN0aXZlbHlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIHRoaXMgem9uZSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHBhcnNlWm9uZUluZm8gfSBmcm9tIFwiLi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgWm9uZSBmcm9tIFwiLi4vem9uZS5qc1wiO1xuXG5sZXQgc2luZ2xldG9uID0gbnVsbDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhbCB6b25lIGZvciB0aGlzIEphdmFTY3JpcHQgZW52aXJvbm1lbnQuXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBsb2NhbCB6b25lXG4gICAqIEByZXR1cm4ge1N5c3RlbVpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgIHNpbmdsZXRvbiA9IG5ldyBTeXN0ZW1ab25lKCk7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJzeXN0ZW1cIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUodHMsIHsgZm9ybWF0LCBsb2NhbGUgfSkge1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5vZmZzZXQodHMpLCBmb3JtYXQpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwic3lzdGVtXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGZvcm1hdE9mZnNldCwgcGFyc2Vab25lSW5mbywgaXNVbmRlZmluZWQsIGlhbmFSZWdleCwgb2JqVG9Mb2NhbFRTIH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxuY29uc3QgbWF0Y2hpbmdSZWdleCA9IFJlZ0V4cChgXiR7aWFuYVJlZ2V4LnNvdXJjZX0kYCk7XG5cbmxldCBkdGZDYWNoZSA9IHt9O1xuZnVuY3Rpb24gbWFrZURURih6b25lKSB7XG4gIGlmICghZHRmQ2FjaGVbem9uZV0pIHtcbiAgICBkdGZDYWNoZVt6b25lXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICAgIHRpbWVab25lOiB6b25lLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbmNvbnN0IHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDUsXG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICBmaWxsZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBmb3JtYXR0ZWRbaV0sXG4gICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxubGV0IGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW5hWm9uZUNhY2hlW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBzcGVjaWZpZXIuIFRoaXMgb25seSBjaGVja3MgdGhlIHN0cmluZydzIGZvcm1hdCwgbm90IHRoYXQgdGhlIHNwZWNpZmllciBpZGVudGlmaWVzIGEga25vd24gem9uZTsgc2VlIGlzVmFsaWRab25lIGZvciB0aGF0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBzdHJpbmcgdG8gY2hlY2sgdmFsaWRpdHkgb25cbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIGlmICghem9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAcHJpdmF0ZSAqKi9cbiAgICB0aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaWFuYVwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0TmFtZSh0cywgeyBmb3JtYXQsIGxvY2FsZSB9KSB7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCh0cykge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZSkpIHJldHVybiBOYU47XG5cbiAgICBjb25zdCBkdGYgPSBtYWtlRFRGKHRoaXMubmFtZSksXG4gICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gZHRmLmZvcm1hdFRvUGFydHNcbiAgICAgICAgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpXG4gICAgICAgIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKTtcblxuICAgIC8vIGJlY2F1c2Ugd2UncmUgdXNpbmcgaG91cjEyIGFuZCBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDI1NTY0JmNhbj0yJnE9JTIyMjQlM0EwMCUyMiUyMGRhdGV0aW1lZm9ybWF0XG4gICAgY29uc3QgYWRqdXN0ZWRIb3VyID0gaG91ciA9PT0gMjQgPyAwIDogaG91cjtcblxuICAgIGNvbnN0IGFzVVRDID0gb2JqVG9Mb2NhbFRTKHtcbiAgICAgIHllYXIsXG4gICAgICBtb250aCxcbiAgICAgIGRheSxcbiAgICAgIGhvdXI6IGFkanVzdGVkSG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICAgIHNlY29uZCxcbiAgICAgIG1pbGxpc2Vjb25kOiAwLFxuICAgIH0pO1xuXG4gICAgbGV0IGFzVFMgPSArZGF0ZTtcbiAgICBjb25zdCBvdmVyID0gYXNUUyAlIDEwMDA7XG4gICAgYXNUUyAtPSBvdmVyID49IDAgPyBvdmVyIDogMTAwMCArIG92ZXI7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUubmFtZSA9PT0gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHNpZ25lZE9mZnNldCB9IGZyb20gXCIuLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbmxldCBzaW5nbGV0b24gPSBudWxsO1xuXG4vKipcbiAqIEEgem9uZSB3aXRoIGEgZml4ZWQgb2Zmc2V0IChtZWFuaW5nIG5vIERTVClcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaXhlZE9mZnNldFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBVVENcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCB1dGNJbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCBpbiBtaW51dGVzXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBGaXhlZE9mZnNldFpvbmUgZnJvbSBhIFVUQyBvZmZzZXQgc3RyaW5nLCBsaWtlIFwiVVRDKzZcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBvZmZzZXQgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQys2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQyswNlwiKVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMtNjowMFwiKVxuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICBjb25zdCByID0gcy5tYXRjaCgvXnV0Yyg/OihbKy1dXFxkezEsMn0pKD86OihcXGR7Mn0pKT8pPyQvaSk7XG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9mZnNldCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuICAgIHRoaXMuZml4ZWQgPSBvZmZzZXQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJmaXhlZFwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogYFVUQyR7Zm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIFwibmFycm93XCIpfWA7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1VuaXZlcnNhbCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbi8qKlxuICogQSB6b25lIHRoYXQgZmFpbGVkIHRvIHBhcnNlLiBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy5cbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih6b25lTmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqICBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuem9uZU5hbWUgPSB6b25lTmFtZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImludmFsaWRcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuLi96b25lcy9pbnZhbGlkWm9uZS5qc1wiO1xuXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgaXNTdHJpbmcsIGlzTnVtYmVyIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplWm9uZShpbnB1dCwgZGVmYXVsdFpvbmUpIHtcbiAgbGV0IG9mZnNldDtcbiAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSB8fCBpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFpvbmUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgY29uc3QgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09IFwibG9jYWxcIiB8fCBsb3dlcmVkID09PSBcInN5c3RlbVwiKSByZXR1cm4gZGVmYXVsdFpvbmU7XG4gICAgZWxzZSBpZiAobG93ZXJlZCA9PT0gXCJ1dGNcIiB8fCBsb3dlcmVkID09PSBcImdtdFwiKSByZXR1cm4gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBJQU5BWm9uZS5jcmVhdGUoaW5wdXQpO1xuICAgIGVsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcblxuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxubGV0IG5vdyA9ICgpID0+IERhdGUubm93KCksXG4gIGRlZmF1bHRab25lID0gXCJzeXN0ZW1cIixcbiAgZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBudWxsLFxuICB0aHJvd09uSW52YWxpZDtcblxuLyoqXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAqL1xuICBzdGF0aWMgZ2V0IG5vdygpIHtcbiAgICByZXR1cm4gbm93O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gICAqIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbnVtYmVyLCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIEVwb2NoIG1pbGxpc2Vjb25kIGNvdW50XG4gICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gRGF0ZS5ub3coKSArIDMwMDAgLy8gcHJldGVuZCBpdCBpcyAzIHNlY29uZHMgaW4gdGhlIGZ1dHVyZVxuICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiAwIC8vIGFsd2F5cyBwcmV0ZW5kIGl0J3MgSmFuIDEsIDE5NzAgYXQgbWlkbmlnaHQgaW4gVVRDIHRpbWVcbiAgICovXG4gIHN0YXRpYyBzZXQgbm93KG4pIHtcbiAgICBub3cgPSBuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogVXNlIHRoZSB2YWx1ZSBcInN5c3RlbVwiIHRvIHJlc2V0IHRoaXMgdmFsdWUgdG8gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdFpvbmUoem9uZSkge1xuICAgIGRlZmF1bHRab25lID0gem9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIG9iamVjdCBjdXJyZW50bHkgdXNlZCB0byBjcmVhdGUgRGF0ZVRpbWVzLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc3lzdGVtJ3MgdGltZSB6b25lICh0aGUgb25lIHNldCBvbiB0aGUgbWFjaGluZSB0aGF0IHJ1bnMgdGhpcyBjb2RlKS5cbiAgICogQHR5cGUge1pvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRab25lKCkge1xuICAgIHJldHVybiBub3JtYWxpemVab25lKGRlZmF1bHRab25lLCBTeXN0ZW1ab25lLmluc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdExvY2FsZShsb2NhbGUpIHtcbiAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCBudW1iZXJpbmcgc3lzdGVtIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0obnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcihvdXRwdXRDYWxlbmRhcikge1xuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKSB7XG4gICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBzZXQgdGhyb3dPbkludmFsaWQodCkge1xuICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICAgIElBTkFab25lLnJlc2V0Q2FjaGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHBhZFN0YXJ0LCByb3VuZFRvLCBoYXNSZWxhdGl2ZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCAqIGFzIEVuZ2xpc2ggZnJvbSBcIi4vZW5nbGlzaC5qc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuLi9kYXRldGltZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuXG4vLyB0b2RvIC0gcmVtYXAgY2FjaGluZ1xuXG5sZXQgaW50bExGQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZExGKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGR0ZiA9IGludGxMRkNhY2hlW2tleV07XG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuTGlzdEZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxMRkNhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxEVENhY2hlID0ge307XG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcbiAgaWYgKCFkdGYpIHtcbiAgICBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxEVENhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxOdW1DYWNoZSA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBpbnRsUmVsQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGJhc2UsIC4uLmNhY2hlS2V5T3B0cyB9ID0gb3B0czsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBjYWNoZUtleU9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxSZWxDYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGVTdHIpIHtcbiAgLy8gSSByZWFsbHkgd2FudCB0byBhdm9pZCB3cml0aW5nIGEgQkNQIDQ3IHBhcnNlclxuICAvLyBzZWUsIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9iY3AtNDdcbiAgLy8gSW5zdGVhZCwgd2UnbGwgZG8gdGhpczpcblxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcblxuICBjb25zdCB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBvcHRpb25zO1xuICAgIC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICBpZiAob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGxvY2FsZVN0ciArPSBgLWNhLSR7b3V0cHV0Q2FsZW5kYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBsb2NhbGVTdHIgKz0gYC1udS0ke251bWJlcmluZ1N5c3RlbX1gO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlU3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2NhbGVTdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgY29uc3QgbXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbWFwV2Vla2RheXMoZikge1xuICBjb25zdCBtcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8XG4gICAgICAhbG9jLmxvY2FsZSB8fFxuICAgICAgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHsgcGFkVG8sIGZsb29yLCAuLi5vdGhlck9wdHMgfSA9IG9wdHM7XG5cbiAgICBpZiAoIWZvcmNlU2ltcGxlIHx8IE9iamVjdC5rZXlzKG90aGVyT3B0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSwgLi4ub3B0cyB9O1xuICAgICAgaWYgKG9wdHMucGFkVG8gPiAwKSBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgICB0aGlzLmluZiA9IGdldENhY2hlZElORihpbnRsLCBpbnRsT3B0cyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0KGkpIHtcbiAgICBpZiAodGhpcy5pbmYpIHtcbiAgICAgIGNvbnN0IGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5mLmZvcm1hdChmaXhlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogcm91bmRUbyhpLCAzKTtcbiAgICAgIHJldHVybiBwYWRTdGFydChmaXhlZCwgdGhpcy5wYWRUbyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBQb2x5RGF0ZUZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcblxuICAgIGxldCB6O1xuICAgIGlmIChkdC56b25lLmlzVW5pdmVyc2FsKSB7XG4gICAgICAvLyBVVEMtOCBvciBFdGMvVVRDLTggYXJlIG5vdCBwYXJ0IG9mIHR6ZGF0YSwgb25seSBFdGMvR01UKzggYW5kIHRoZSBsaWtlLlxuICAgICAgLy8gVGhhdCBpcyB3aHkgZml4ZWQtb2Zmc2V0IFRaIGlzIHNldCB0byB0aGF0IHVubGVzcyBpdCBpczpcbiAgICAgIC8vIDEuIFJlcHJlc2VudGluZyBvZmZzZXQgMCB3aGVuIFVUQyBpcyB1c2VkIHRvIG1haW50YWluIHByZXZpb3VzIGJlaGF2aW9yIGFuZCBkb2VzIG5vdCBiZWNvbWUgR01ULlxuICAgICAgLy8gMi4gVW5zdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXI6XG4gICAgICAvLyAgICAtIHNvbWUgZG8gbm90IHN1cHBvcnQgRXRjL1xuICAgICAgLy8gICAgLSA8IEV0Yy9HTVQtMTQsID4gRXRjL0dNVCsxMiwgYW5kIDMwLW1pbnV0ZSBvciA0NS1taW51dGUgb2Zmc2V0cyBhcmUgbm90IHBhcnQgb2YgdHpkYXRhXG4gICAgICBjb25zdCBnbXRPZmZzZXQgPSAtMSAqIChkdC5vZmZzZXQgLyA2MCk7XG4gICAgICBjb25zdCBvZmZzZXRaID0gZ210T2Zmc2V0ID49IDAgPyBgRXRjL0dNVCske2dtdE9mZnNldH1gIDogYEV0Yy9HTVQke2dtdE9mZnNldH1gO1xuICAgICAgaWYgKGR0Lm9mZnNldCAhPT0gMCAmJiBJQU5BWm9uZS5jcmVhdGUob2Zmc2V0WikudmFsaWQpIHtcbiAgICAgICAgeiA9IG9mZnNldFo7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRsT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgaWYgKHopIHtcbiAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICB9XG4gICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgZm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0geyBzdHlsZTogXCJsb25nXCIsIC4uLm9wdHMgfTtcbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoY291bnQsIHVuaXQpIHtcbiAgICBpZiAodGhpcy5ydGYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ0Zi5mb3JtYXQoY291bnQsIHVuaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW5nbGlzaC5mb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsZSB7XG4gIHN0YXRpYyBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyLCBkZWZhdWx0VG9FTiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBjb25zdCBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/IFwiZW4tVVNcIiA6IHN5c3RlbUxvY2FsZSgpKTtcbiAgICBjb25zdCBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgY29uc3Qgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgbnVtYmVyaW5nLCBvdXRwdXRDYWxlbmRhciwgc3BlY2lmaWVkTG9jYWxlKSB7XG4gICAgY29uc3QgW3BhcnNlZExvY2FsZSwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtLCBwYXJzZWRPdXRwdXRDYWxlbmRhcl0gPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIGdldCBmYXN0TnVtYmVycygpIHtcbiAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgfVxuXG4gIGxpc3RpbmdNb2RlKCkge1xuICAgIGNvbnN0IGlzQWN0dWFsbHlFbiA9IHRoaXMuaXNFbmdsaXNoKCk7XG4gICAgY29uc3QgaGFzTm9XZWlyZG5lc3MgPVxuICAgICAgKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiZcbiAgICAgICh0aGlzLm91dHB1dENhbGVuZGFyID09PSBudWxsIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IFwiZ3JlZ29yeVwiKTtcbiAgICByZXR1cm4gaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzID8gXCJlblwiIDogXCJpbnRsXCI7XG4gIH1cblxuICBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKFxuICAgICAgICBhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSxcbiAgICAgICAgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZWRlZmF1bHRUb0VOKGFsdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKHsgLi4uYWx0cywgZGVmYXVsdFRvRU46IHRydWUgfSk7XG4gIH1cblxuICByZWRlZmF1bHRUb1N5c3RlbShhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSh7IC4uLmFsdHMsIGRlZmF1bHRUb0VOOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG1vbnRocyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgRW5nbGlzaC5tb250aHMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSBmb3JtYXQgPyB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSA6IHsgbW9udGg6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwTW9udGhzKChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIm1vbnRoXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHdlZWtkYXlzKGxlbmd0aCwgZm9ybWF0ID0gZmFsc2UsIGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBFbmdsaXNoLndlZWtkYXlzLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnRsID0gZm9ybWF0XG4gICAgICAgICAgPyB7IHdlZWtkYXk6IGxlbmd0aCwgeWVhcjogXCJudW1lcmljXCIsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9XG4gICAgICAgICAgOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcFdlZWtkYXlzKChkdCkgPT5cbiAgICAgICAgICB0aGlzLmV4dHJhY3QoZHQsIGludGwsIFwid2Vla2RheVwiKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICBtZXJpZGllbXMoZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYoXG4gICAgICB0aGlzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdE9LLFxuICAgICAgKCkgPT4gRW5nbGlzaC5tZXJpZGllbXMsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgICAgaWYgKCF0aGlzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBpbnRsID0geyBob3VyOiBcIm51bWVyaWNcIiwgaG91ckN5Y2xlOiBcImgxMlwiIH07XG4gICAgICAgICAgdGhpcy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChcbiAgICAgICAgICAgIChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tZXJpZGllbUNhY2hlO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBlcmFzKGxlbmd0aCwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIEVuZ2xpc2guZXJhcywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IHsgZXJhOiBsZW5ndGggfTtcblxuICAgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYy4gRGlmZmVyZW50IGNhbGVuZGFycyBhcmUgZ29pbmcgdG8gZGVmaW5lIGVyYXMgdG90YWxseSBkaWZmZXJlbnRseS4gV2hhdCBJIG5lZWQgaXMgdGhlIG1pbmltdW0gc2V0IG9mIGRhdGVzXG4gICAgICAvLyB0byBkZWZpbml0ZWx5IGVudW1lcmF0ZSB0aGVtLlxuICAgICAgaWYgKCF0aGlzLmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy5lcmFDYWNoZVtsZW5ndGhdID0gW0RhdGVUaW1lLnV0YygtNDAsIDEsIDEpLCBEYXRlVGltZS51dGMoMjAxNywgMSwgMSldLm1hcCgoZHQpID0+XG4gICAgICAgICAgdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9XG5cbiAgZXh0cmFjdChkdCwgaW50bE9wdHMsIGZpZWxkKSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZCk7XG4gICAgcmV0dXJuIG1hdGNoaW5nID8gbWF0Y2hpbmcudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgbnVtYmVyRm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgcmV0dXJuIG5ldyBQb2x5TnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzLCBvcHRzKTtcbiAgfVxuXG4gIGR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH1cblxuICByZWxGb3JtYXR0ZXIob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5UmVsRm9ybWF0dGVyKHRoaXMuaW50bCwgdGhpcy5pc0VuZ2xpc2goKSwgb3B0cyk7XG4gIH1cblxuICBsaXN0Rm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBnZXRDYWNoZWRMRih0aGlzLmludGwsIG9wdHMpO1xuICB9XG5cbiAgaXNFbmdsaXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvY2FsZSA9PT0gXCJlblwiIHx8XG4gICAgICB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKVxuICAgICk7XG4gIH1cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJlxuICAgICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJlxuICAgICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXJcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdW50cnVuY2F0ZVllYXIsXG4gIHNpZ25lZE9mZnNldCxcbiAgcGFyc2VJbnRlZ2VyLFxuICBwYXJzZU1pbGxpcyxcbiAgaWFuYVJlZ2V4LFxuICBpc1VuZGVmaW5lZCxcbiAgcGFyc2VGbG9hdGluZyxcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoLi4ucmVnZXhlcykge1xuICBjb25zdCBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoKGYsIHIpID0+IGYgKyByLnNvdXJjZSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoYF4ke2Z1bGx9JGApO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycyguLi5leHRyYWN0b3JzKSB7XG4gIHJldHVybiAobSkgPT5cbiAgICBleHRyYWN0b3JzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoW21lcmdlZFZhbHMsIG1lcmdlZFpvbmUsIGN1cnNvcl0sIGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3ZhbCwgem9uZSwgbmV4dF0gPSBleChtLCBjdXJzb3IpO1xuICAgICAgICAgIHJldHVybiBbeyAuLi5tZXJnZWRWYWxzLCAuLi52YWwgfSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICAgICAgfSxcbiAgICAgICAgW3t9LCBudWxsLCAxXVxuICAgICAgKVxuICAgICAgLnNsaWNlKDAsIDIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzLCAuLi5wYXR0ZXJucykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2V4LCBleHRyYWN0b3JdIG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsMzB9KSk/KT8pPy8sXG4gIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChgJHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0ke29mZnNldFJlZ2V4LnNvdXJjZX0/YCksXG4gIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgZXh0cmFjdElTT1dlZWtEYXRhID0gc2ltcGxlUGFyc2UoXCJ3ZWVrWWVhclwiLCBcIndlZWtOdW1iZXJcIiwgXCJ3ZWVrRGF5XCIpLFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbiAgc3FsVGltZVJlZ2V4ID0gUmVnRXhwKFxuICAgIGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSA/KD86JHtvZmZzZXRSZWdleC5zb3VyY2V9fCgke2lhbmFSZWdleC5zb3VyY2V9KSk/YFxuICApLFxuICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoYCg/OiAke3NxbFRpbWVSZWdleC5zb3VyY2V9KT9gKTtcblxuZnVuY3Rpb24gaW50KG1hdGNoLCBwb3MsIGZhbGxiYWNrKSB7XG4gIGNvbnN0IG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgeWVhcjogaW50KG1hdGNoLCBjdXJzb3IpLFxuICAgIG1vbnRoOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDEpLFxuICAgIGRheTogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAxKSxcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgaG91cnM6IGludChtYXRjaCwgY3Vyc29yLCAwKSxcbiAgICBtaW51dGVzOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDApLFxuICAgIHNlY29uZHM6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMCksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSksXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3Qgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBJQU5BWm9uZS5jcmVhdGUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIHRpbWUgcGFyc2luZ1xuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7XG5cbi8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID1cbiAgL14tP1AoPzooPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pWSk/KD86KC0/XFxkezEsOX0oPzpcXC5cXGR7MSw5fSk/KU0pPyg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylXKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pRCk/KD86VCg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylIKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID1cbiAgICBtYXRjaDtcblxuICBjb25zdCBoYXNOZWdhdGl2ZVByZWZpeCA9IHNbMF0gPT09IFwiLVwiO1xuICBjb25zdCBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICBjb25zdCBtYXliZU5lZ2F0ZSA9IChudW0sIGZvcmNlID0gZmFsc2UpID0+XG4gICAgbnVtICE9PSB1bmRlZmluZWQgJiYgKGZvcmNlIHx8IChudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpKSA/IC1udW0gOiBudW07XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyh5ZWFyU3RyKSksXG4gICAgICBtb250aHM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcobW9udGhTdHIpKSxcbiAgICAgIHdlZWtzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKHdlZWtTdHIpKSxcbiAgICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcoZGF5U3RyKSksXG4gICAgICBob3VyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhob3VyU3RyKSksXG4gICAgICBtaW51dGVzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKG1pbnV0ZVN0cikpLFxuICAgICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhzZWNvbmRTdHIpLCBzZWNvbmRTdHIgPT09IFwiLTBcIiksXG4gICAgICBtaWxsaXNlY29uZHM6IG1heWJlTmVnYXRlKHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0ciksIG5lZ2F0aXZlU2Vjb25kcyksXG4gICAgfSxcbiAgXTtcbn1cblxuLy8gVGhlc2UgYXJlIGEgbGl0dGxlIGJyYWluZGVhZC4gRURUICpzaG91bGQqIHRlbGwgdXMgdGhhdCB3ZSdyZSBpbiwgc2F5LCBBbWVyaWNhL05ld19Zb3JrXG4vLyBhbmQgbm90IGp1c3QgdGhhdCB3ZSdyZSBpbiAtMjQwICpyaWdodCBub3cqLiBCdXQgc2luY2UgSSBkb24ndCB0aGluayB0aGVzZSBhcmUgdXNlZCB0aGF0IG9mdGVuXG4vLyBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgdGhhdFxuY29uc3Qgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MCxcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50ZWdlcih5ZWFyU3RyKSkgOiBwYXJzZUludGVnZXIoeWVhclN0ciksXG4gICAgbW9udGg6IEVuZ2xpc2gubW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnRlZ2VyKGRheVN0ciksXG4gICAgaG91cjogcGFyc2VJbnRlZ2VyKGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnRlZ2VyKG1pbnV0ZVN0ciksXG4gIH07XG5cbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50ZWdlcihzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID1cbiAgICAgIHdlZWtkYXlTdHIubGVuZ3RoID4gM1xuICAgICAgICA/IEVuZ2xpc2gud2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxXG4gICAgICAgIDogRW5nbGlzaC53ZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0cikgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gUkZDIDI4MjIvNTMyMlxuY29uc3QgcmZjMjgyMiA9XG4gIC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfCg/OihbKy1dXFxkXFxkKShcXGRcXGQpKSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzI4MjIobWF0Y2gpIHtcbiAgY29uc3QgW1xuICAgICAgLFxuICAgICAgd2Vla2RheVN0cixcbiAgICAgIGRheVN0cixcbiAgICAgIG1vbnRoU3RyLFxuICAgICAgeWVhclN0cixcbiAgICAgIGhvdXJTdHIsXG4gICAgICBtaW51dGVTdHIsXG4gICAgICBzZWNvbmRTdHIsXG4gICAgICBvYnNPZmZzZXQsXG4gICAgICBtaWxPZmZzZXQsXG4gICAgICBvZmZIb3VyU3RyLFxuICAgICAgb2ZmTWludXRlU3RyLFxuICAgIF0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgbGV0IG9mZnNldDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xufVxuXG4vLyBodHRwIGRhdGVcblxuY29uc3QgcmZjMTEyMyA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSwgKFxcZFxcZCkgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoXFxkezR9KSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgcmZjODUwID1cbiAgICAvXihNb25kYXl8VHVlc2RheXxXZWRzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXFxkXFxkKS0oSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpLShcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICBhc2NpaSA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBkYXlTdHIsIG1vbnRoU3RyLCB5ZWFyU3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cl0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgY29uc3QgWywgd2Vla2RheVN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIsIHllYXJTdHJdID0gbWF0Y2gsXG4gICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuY29uc3QgaXNvWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1ltZFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb1RpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KTtcblxuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXRcbik7XG5jb25zdCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1dlZWtEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09PcmRpbmFsRGF0ZUFuZFRpbWUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT09yZGluYWxEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPWW1kVGltZUFuZE9mZnNldF0sXG4gICAgW2lzb1dlZWtXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXRdLFxuICAgIFtpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT09yZGluYWxEYXRlQW5kVGltZV0sXG4gICAgW2lzb1RpbWVDb21iaW5lZFJlZ2V4LCBleHRyYWN0SVNPVGltZUFuZE9mZnNldF1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIVFRQRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbYXNjaWksIGV4dHJhY3RBU0NJSV1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuY29uc3QgZXh0cmFjdElTT1RpbWVPbmx5ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09UaW1lT25seShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvVGltZU9ubHksIGV4dHJhY3RJU09UaW1lT25seV0pO1xufVxuXG5jb25zdCBzcWxZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsWW1kUmVnZXgsIHNxbFRpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBzcWxUaW1lQ29tYmluZWRSZWdleCA9IGNvbWJpbmVSZWdleGVzKHNxbFRpbWVSZWdleCk7XG5cbmNvbnN0IGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW3NxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmVdLFxuICAgIFtzcWxUaW1lQ29tYmluZWRSZWdleCwgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZV1cbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgSW52YWxpZER1cmF0aW9uRXJyb3IsIEludmFsaWRVbml0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBJbnZhbGlkIGZyb20gXCIuL2ltcGwvaW52YWxpZC5qc1wiO1xuaW1wb3J0IExvY2FsZSBmcm9tIFwiLi9pbXBsL2xvY2FsZS5qc1wiO1xuaW1wb3J0IHsgcGFyc2VJU09EdXJhdGlvbiwgcGFyc2VJU09UaW1lT25seSB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7XG4gIGFzTnVtYmVyLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaXNJbnRlZ2VyLFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbn0gZnJvbSBcIi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5leHBvcnQgY29uc3QgbG93T3JkZXJNYXRyaXggPSB7XG4gICAgd2Vla3M6IHtcbiAgICAgIGRheXM6IDcsXG4gICAgICBob3VyczogNyAqIDI0LFxuICAgICAgbWludXRlczogNyAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIGRheXM6IHtcbiAgICAgIGhvdXJzOiAyNCxcbiAgICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICAgIG1pbnV0ZXM6IHsgc2Vjb25kczogNjAsIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwIH0sXG4gICAgc2Vjb25kczogeyBtaWxsaXNlY29uZHM6IDEwMDAgfSxcbiAgfSxcbiAgY2FzdWFsTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogNTIsXG4gICAgICBkYXlzOiAzNjUsXG4gICAgICBob3VyczogMzY1ICogMjQsXG4gICAgICBtaW51dGVzOiAzNjUgKiAyNCAqIDYwLFxuICAgICAgc2Vjb25kczogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgcXVhcnRlcnM6IHtcbiAgICAgIG1vbnRoczogMyxcbiAgICAgIHdlZWtzOiAxMyxcbiAgICAgIGRheXM6IDkxLFxuICAgICAgaG91cnM6IDkxICogMjQsXG4gICAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgbW9udGhzOiB7XG4gICAgICB3ZWVrczogNCxcbiAgICAgIGRheXM6IDMwLFxuICAgICAgaG91cnM6IDMwICogMjQsXG4gICAgICBtaW51dGVzOiAzMCAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG5cbiAgICAuLi5sb3dPcmRlck1hdHJpeCxcbiAgfSxcbiAgZGF5c0luWWVhckFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0MDAsXG4gIGRheXNJbk1vbnRoQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQ4MDAsXG4gIGFjY3VyYXRlTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJblllYXJBY2N1cmF0ZSxcbiAgICAgIGhvdXJzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBxdWFydGVyczoge1xuICAgICAgbW9udGhzOiAzLFxuICAgICAgd2Vla3M6IGRheXNJblllYXJBY2N1cmF0ZSAvIDI4LFxuICAgICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICAgIGhvdXJzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQpIC8gNCxcbiAgICAgIG1pbnV0ZXM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwKSAvIDQsXG4gICAgICBzZWNvbmRzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwKSAvIDQsXG4gICAgICBtaWxsaXNlY29uZHM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSAvIDQsXG4gICAgfSxcbiAgICBtb250aHM6IHtcbiAgICAgIHdlZWtzOiBkYXlzSW5Nb250aEFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJbk1vbnRoQWNjdXJhdGUsXG4gICAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgICAgbWludXRlczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIC4uLmxvd09yZGVyTWF0cml4LFxuICB9O1xuXG4vLyB1bml0cyBvcmRlcmVkIGJ5IHNpemVcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcbiAgXCJ5ZWFyc1wiLFxuICBcInF1YXJ0ZXJzXCIsXG4gIFwibW9udGhzXCIsXG4gIFwid2Vla3NcIixcbiAgXCJkYXlzXCIsXG4gIFwiaG91cnNcIixcbiAgXCJtaW51dGVzXCIsXG4gIFwic2Vjb25kc1wiLFxuICBcIm1pbGxpc2Vjb25kc1wiLFxuXTtcblxuY29uc3QgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cywgY2xlYXIgPSBmYWxzZSkge1xuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIGNvbnN0IGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogeyAuLi5kdXIudmFsdWVzLCAuLi4oYWx0cy52YWx1ZXMgfHwge30pIH0sXG4gICAgbG9jOiBkdXIubG9jLmNsb25lKGFsdHMubG9jKSxcbiAgICBjb252ZXJzaW9uQWNjdXJhY3k6IGFsdHMuY29udmVyc2lvbkFjY3VyYWN5IHx8IGR1ci5jb252ZXJzaW9uQWNjdXJhY3ksXG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbmZ1bmN0aW9uIGFudGlUcnVuYyhuKSB7XG4gIHJldHVybiBuIDwgMCA/IE1hdGguZmxvb3IobikgOiBNYXRoLmNlaWwobik7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICBjb25zdCBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgIHJhdyA9IGZyb21NYXBbZnJvbVVuaXRdIC8gY29udixcbiAgICBzYW1lU2lnbiA9IE1hdGguc2lnbihyYXcpID09PSBNYXRoLnNpZ24odG9NYXBbdG9Vbml0XSksXG4gICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICAgIGFkZGVkID1cbiAgICAgICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZSNwbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYSBEdXJhdGlvbiwgdXNlIHtAbGluayBEdXJhdGlvbiNmcm9tTWlsbGlzfSwge0BsaW5rIER1cmF0aW9uI2Zyb21PYmplY3R9LCBvciB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT30uXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayBEdXJhdGlvbiN5ZWFyc30sIHtAbGluayBEdXJhdGlvbi5tb250aHN9LCB7QGxpbmsgRHVyYXRpb24jd2Vla3N9LCB7QGxpbmsgRHVyYXRpb24jZGF5c30sIHtAbGluayBEdXJhdGlvbiNob3Vyc30sIHtAbGluayBEdXJhdGlvbiNtaW51dGVzfSwge0BsaW5rIER1cmF0aW9uI3NlY29uZHN9LCB7QGxpbmsgRHVyYXRpb24jbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uI2xvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbiNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBuZXcgRHVyYXRpb25zIG91dCBvZiBvbGQgb25lcyB1c2Uge0BsaW5rIER1cmF0aW9uI3BsdXN9LCB7QGxpbmsgRHVyYXRpb24jbWludXN9LCB7QGxpbmsgRHVyYXRpb24jbm9ybWFsaXplfSwge0BsaW5rIER1cmF0aW9uI3NldH0sIHtAbGluayBEdXJhdGlvbiNyZWNvbmZpZ3VyZX0sIHtAbGluayBEdXJhdGlvbiNzaGlmdFRvfSwgYW5kIHtAbGluayBEdXJhdGlvbiNuZWdhdGV9LlxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIER1cmF0aW9uI2FzfSwge0BsaW5rIER1cmF0aW9uI3RvSVNPfSwge0BsaW5rIER1cmF0aW9uI3RvRm9ybWF0fSwgYW5kIHtAbGluayBEdXJhdGlvbiN0b0pTT059XG4gKlxuICogVGhlcmUncyBhcmUgbW9yZSBtZXRob2RzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCB2YWxpZGl0eSwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdXJhdGlvbiB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3QgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSBcImxvbmd0ZXJtXCIgfHwgZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jb252ZXJzaW9uQWNjdXJhY3kgPSBhY2N1cmF0ZSA/IFwibG9uZ3Rlcm1cIiA6IFwiY2FzdWFsXCI7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uRHVyYXRpb24gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBEdXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzJy5cbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiBhIHplcm8gbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGhzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91cnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9W11dIC0gb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhpcyBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tT2JqZWN0KG9iaiwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7XG4gICAgICAgICAgb2JqID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2Ygb2JqXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0cyksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9wdHMuY29udmVyc2lvbkFjY3VyYWN5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gRHVyYXRpb25MaWtlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdCB8IG51bWJlciB8IER1cmF0aW9ufSBkdXJhdGlvbkxpa2VcbiAgICogT25lIG9mOlxuICAgKiAtIG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcnMnIGFuZCAnaG91cnMnLlxuICAgKiAtIG51bWJlciByZXByZXNlbnRpbmcgbWlsbGlzZWNvbmRzXG4gICAqIC0gRHVyYXRpb24gaW5zdGFuY2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbkxpa2UpIHtcbiAgICBpZiAoaXNOdW1iZXIoZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb25MaWtlKTtcbiAgICB9IGVsc2UgaWYgKER1cmF0aW9uLmlzRHVyYXRpb24oZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIGR1cmF0aW9uTGlrZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbkxpa2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KGR1cmF0aW9uTGlrZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYFVua25vd24gZHVyYXRpb24gYXJndW1lbnQgJHtkdXJhdGlvbkxpa2V9IG9mIHR5cGUgJHt0eXBlb2YgZHVyYXRpb25MaWtlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNMVc0RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIHdlZWtzOiAxLCBkYXlzOiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QocGFyc2VkLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IFtwYXJzZWRdID0gcGFyc2VJU09UaW1lT25seSh0ZXh0KTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChwYXJzZWQsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIGRhdGV0aW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24gPSBudWxsKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZER1cmF0aW9uRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIixcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEdXJhdGlvbi4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiAobyAmJiBvLmlzTHV4b25EdXJhdGlvbikgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uI3NoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdClcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRHVyYXRpb24gd2l0aCBhbGwgdW5pdHMgaW5jbHVkZWRcbiAgICogVG8gbW9kaWZ5IGl0cyBiZWhhdmlvciB1c2UgdGhlIGBsaXN0U3R5bGVgIGFuZCBhbnkgSW50bC5OdW1iZXJGb3JtYXQgb3B0aW9uLCB0aG91Z2ggYHVuaXREaXNwbGF5YCBpcyBlc3BlY2lhbGx5IHJlbGV2YW50LiBTZWUge0BsaW5rIEludGwuTnVtYmVyRm9ybWF0fS5cbiAgICogQHBhcmFtIG9wdHMgLSBPbiBvcHRpb24gb2JqZWN0IHRvIG92ZXJyaWRlIHRoZSBmb3JtYXR0aW5nLiBBY2NlcHRzIHRoZSBzYW1lIGtleXMgYXMgdGhlIG9wdGlvbnMgcGFyYW1ldGVyIG9mIHRoZSBuYXRpdmUgYEludC5OdW1iZXJGb3JtYXRgIGNvbnN0cnVjdG9yLCBhcyB3ZWxsIGFzIGBsaXN0U3R5bGVgLlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqc1xuICAgKiB2YXIgZHVyID0gRHVyYXRpb24uZnJvbU9iamVjdCh7IGRheXM6IDEsIGhvdXJzOiA1LCBtaW51dGVzOiA2IH0pXG4gICAqIGR1ci50b0h1bWFuKCkgLy89PiAnMSBkYXksIDUgaG91cnMsIDYgbWludXRlcydcbiAgICogZHVyLnRvSHVtYW4oeyBsaXN0U3R5bGU6IFwibG9uZ1wiIH0pIC8vPT4gJzEgZGF5LCA1IGhvdXJzLCBhbmQgNiBtaW51dGVzJ1xuICAgKiBkdXIudG9IdW1hbih7IHVuaXREaXNwbGF5OiBcInNob3J0XCIgfSkgLy89PiAnMSBkYXksIDUgaHIsIDYgbWluJ1xuICAgKiBgYGBcbiAgICovXG4gIHRvSHVtYW4ob3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbCA9IG9yZGVyZWRVbml0c1xuICAgICAgLm1hcCgodW5pdCkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnZhbHVlc1t1bml0XTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NcbiAgICAgICAgICAubnVtYmVyRm9ybWF0dGVyKHsgc3R5bGU6IFwidW5pdFwiLCB1bml0RGlzcGxheTogXCJsb25nXCIsIC4uLm9wdHMsIHVuaXQ6IHVuaXQuc2xpY2UoMCwgLTEpIH0pXG4gICAgICAgICAgLmZvcm1hdCh2YWwpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG4pID0+IG4pO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jXG4gICAgICAubGlzdEZvcm1hdHRlcih7IHR5cGU6IFwiY29uanVuY3Rpb25cIiwgc3R5bGU6IG9wdHMubGlzdFN0eWxlIHx8IFwibmFycm93XCIsIC4uLm9wdHMgfSlcbiAgICAgIC5mb3JtYXQobCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgdG9PYmplY3QoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICByZXR1cm4geyAuLi50aGlzLnZhbHVlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA1IH0pLnRvSVNPKCkgLy89PiAnUDVNJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08oKSB7XG4gICAgLy8gd2UgY291bGQgdXNlIHRoZSBmb3JtYXR0ZXIsIGJ1dCB0aGlzIGlzIGFuIGVhc2llciB3YXkgdG8gZ2V0IHRoZSBtaW5pbXVtIHN0cmluZ1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy53ZWVrcyAhPT0gMCkgcyArPSB0aGlzLndlZWtzICsgXCJXXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCkgcyArPSB0aGlzLmRheXMgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgcyArPSBcIlRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCkgcyArPSB0aGlzLmhvdXJzICsgXCJIXCI7XG4gICAgaWYgKHRoaXMubWludXRlcyAhPT0gMCkgcyArPSB0aGlzLm1pbnV0ZXMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgLy8gdGhpcyB3aWxsIGhhbmRsZSBcImZsb2F0aW5nIHBvaW50IG1hZG5lc3NcIiBieSByZW1vdmluZyBleHRyYSBkZWNpbWFsIHBsYWNlc1xuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTg4MDA0L2lzLWZsb2F0aW5nLXBvaW50LW1hdGgtYnJva2VuXG4gICAgICBzICs9IHJvdW5kVG8odGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwLCAzKSArIFwiU1wiO1xuICAgIGlmIChzID09PSBcIlBcIikgcyArPSBcIlQwU1wiO1xuICAgIHJldHVybiBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLCBmb3JtYXR0ZWQgYXMgYSB0aW1lIG9mIGRheS5cbiAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgZHVyYXRpb24gaXMgaW52YWxpZCwgbmVnYXRpdmUsIG9yIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAyNCBob3Vycy5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVByZWZpeD1mYWxzZV0gLSBpbmNsdWRlIHRoZSBgVGAgcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSgpIC8vPT4gJzExOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMDowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMTE6MDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IGZvcm1hdDogJ2Jhc2ljJyB9KSAvLz0+ICcxMTAwMDAuMDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT1RpbWUob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWlsbGlzID0gdGhpcy50b01pbGxpcygpO1xuICAgIGlmIChtaWxsaXMgPCAwIHx8IG1pbGxpcyA+PSA4NjQwMDAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICBvcHRzID0ge1xuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHM6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVQcmVmaXg6IGZhbHNlLFxuICAgICAgZm9ybWF0OiBcImV4dGVuZGVkXCIsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2hpZnRUbyhcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIik7XG5cbiAgICBsZXQgZm10ID0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwiaGhtbVwiIDogXCJoaDptbVwiO1xuXG4gICAgaWYgKCFvcHRzLnN1cHByZXNzU2Vjb25kcyB8fCB2YWx1ZS5zZWNvbmRzICE9PSAwIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgZm10ICs9IG9wdHMuZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcInNzXCIgOiBcIjpzc1wiO1xuICAgICAgaWYgKCFvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN0ciA9IHZhbHVlLnRvRm9ybWF0KGZtdCk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlUHJlZml4KSB7XG4gICAgICBzdHIgPSBcIlRcIiArIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5hcyhcIm1pbGxpc2Vjb25kc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5KGR1ci52YWx1ZXMsIGspIHx8IGhhc093blByb3BlcnR5KHRoaXMudmFsdWVzLCBrKSkge1xuICAgICAgICByZXN1bHRba10gPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGlzIER1cmF0aW9uIHNob3J0ZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnBsdXMoZHVyLm5lZ2F0ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSB0aGlzIER1cmF0aW9uIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB1bml0LiBBcml0eSBpcyAxIG9yIDI6IHRoZSB2YWx1ZSBvZiB0aGUgdW5pdCBhbmQsIG9wdGlvbmFsbHksIHRoZSB1bml0IG5hbWUuIE11c3QgcmV0dXJuIGEgbnVtYmVyLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKHggPT4geCAqIDIpIC8vPT4geyBob3VyczogMiwgbWludXRlczogNjAgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKCh4LCB1KSA9PiB1ID09PSBcImhvdXJcIiA/IHggKiAyIDogeCkgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiAzMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbWFwVW5pdHMoZm4pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgcmVzdWx0W2tdID0gYXNOdW1iZXIoZm4odGhpcy52YWx1ZXNba10sIGspKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCd5ZWFycycpIC8vPT4gMlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLmdldCgnbW9udGhzJykgLy89PiAwXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdkYXlzJykgLy89PiAzXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KV07XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcbiAgICogQGV4YW1wbGUgZHVyLnNldCh7IGhvdXJzOiA4LCBtaW51dGVzOiAzMCB9KVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNldCh2YWx1ZXMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBtaXhlZCA9IHsgLi4udGhpcy52YWx1ZXMsIC4uLm5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpIH07XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBtaXhlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgZHVyLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgY29udmVyc2lvbkFjY3VyYWN5IH0gPSB7fSkge1xuICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jLmNsb25lKHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0gfSksXG4gICAgICBvcHRzID0geyBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGVzJyBvciAnZGF5cydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7aG91cnM6IDYwfSkuYXMoJ2RheXMnKSAvLz0+IDIuNVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmVkdWNlIHRoaXMgRHVyYXRpb24gdG8gaXRzIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBpbiBpdHMgY3VycmVudCB1bml0cy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMiwgbWludXRlczogLTQ1IH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMTUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogdmFscyB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNoaWZ0VG8oLi4udW5pdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1bml0cyA9IHVuaXRzLm1hcCgodSkgPT4gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1KSk7XG5cbiAgICBjb25zdCBidWlsdCA9IHt9LFxuICAgICAgYWNjdW11bGF0ZWQgPSB7fSxcbiAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgbGV0IGxhc3RVbml0O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKHVuaXRzLmluZGV4T2YoaykgPj0gMCkge1xuICAgICAgICBsYXN0VW5pdCA9IGs7XG5cbiAgICAgICAgbGV0IG93biA9IDA7XG5cbiAgICAgICAgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG4gICAgICAgIGZvciAoY29uc3QgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgIGFjY3VtdWxhdGVkW2FrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSAob3duICogMTAwMCAtIGkgKiAxMDAwKSAvIDEwMDA7XG5cbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG4gICAgICAgIGZvciAoY29uc3QgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgLy8gbGFzdFVuaXQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIHVuaXRzIGlzIG5vdCBlbXB0eVxuICAgIGZvciAoY29uc3Qga2V5IGluIGFjY3VtdWxhdGVkKSB7XG4gICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSAhPT0gMCkge1xuICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz1cbiAgICAgICAgICBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IGJ1aWx0IH0sIHRydWUpLm5vcm1hbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBuZWdhdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgbmVnYXRlZFtrXSA9IC10aGlzLnZhbHVlc1trXTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBuZWdhdGVkIH0sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeWVhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgeWVhcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnllYXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBxdWFydGVycy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRocy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1vbnRocyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2Vla3NcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMud2Vla3MgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRheXMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaG91cnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgaG91cnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmhvdXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGVzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbnV0ZXMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbGxpc2Vjb25kcyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xuICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIER1cmF0aW9ucyBhcmUgZXF1YWwgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSB1bml0cyBhbmQgdGhlIHNhbWUgdmFsdWVzIGZvciBlYWNoIHVuaXQuXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcSh2MSwgdjIpIHtcbiAgICAgIC8vIENvbnNpZGVyIDAgYW5kIHVuZGVmaW5lZCBhcyBlcXVhbFxuICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgfHwgdjEgPT09IDApIHJldHVybiB2MiA9PT0gdW5kZWZpbmVkIHx8IHYyID09PSAwO1xuICAgICAgcmV0dXJuIHYxID09PSB2MjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHUgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoIWVxKHRoaXMudmFsdWVzW3VdLCBvdGhlci52YWx1ZXNbdV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgRGF0ZVRpbWUsIHsgZnJpZW5kbHlEYXRlVGltZSB9IGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEludmFsaWRJbnRlcnZhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBJbnRlcnZhbFwiO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXG4gICAgICBcImVuZCBiZWZvcmUgc3RhcnRcIixcbiAgICAgIGBUaGUgZW5kIG9mIGFuIGludGVydmFsIG11c3QgYmUgYWZ0ZXIgaXRzIHN0YXJ0LCBidXQgeW91IGhhZCBzdGFydD0ke3N0YXJ0LnRvSVNPKCl9IGFuZCBlbmQ9JHtlbmQudG9JU08oKX1gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIEludGVydmFsOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIEludGVydmFsI2FmdGVyfSwge0BsaW5rIEludGVydmFsI2JlZm9yZX0sIG9yIHtAbGluayBJbnRlcnZhbCNmcm9tSVNPfS5cbiAqICogKipBY2Nlc3NvcnMqKiBVc2Uge0BsaW5rIEludGVydmFsI3N0YXJ0fSBhbmQge0BsaW5rIEludGVydmFsI2VuZH0gdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kLlxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNjb3VudH0sIHtAbGluayBJbnRlcnZhbCNsZW5ndGh9LCB7QGxpbmsgSW50ZXJ2YWwjaGFzU2FtZX0sIHtAbGluayBJbnRlcnZhbCNjb250YWluc30sIHtAbGluayBJbnRlcnZhbCNpc0FmdGVyfSwgb3Ige0BsaW5rIEludGVydmFsI2lzQmVmb3JlfS5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIEludGVydmFsI3NldH0sIHtAbGluayBJbnRlcnZhbCNzcGxpdEF0fSwge0BsaW5rIEludGVydmFsI3NwbGl0Qnl9LCB7QGxpbmsgSW50ZXJ2YWwjZGl2aWRlRXF1YWxseX0sIHtAbGluayBJbnRlcnZhbCNtZXJnZX0sIHtAbGluayBJbnRlcnZhbCN4b3J9LCB7QGxpbmsgSW50ZXJ2YWwjdW5pb259LCB7QGxpbmsgSW50ZXJ2YWwjaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIEludGVydmFsI2RpZmZlcmVuY2V9LlxuICogKiAqKkNvbXBhcmlzb24qKiBUbyBjb21wYXJlIHRoaXMgSW50ZXJ2YWwgdG8gYW5vdGhlciBvbmUsIHVzZSB7QGxpbmsgSW50ZXJ2YWwjZXF1YWxzfSwge0BsaW5rIEludGVydmFsI292ZXJsYXBzfSwge0BsaW5rIEludGVydmFsI2FidXRzU3RhcnR9LCB7QGxpbmsgSW50ZXJ2YWwjYWJ1dHNFbmR9LCB7QGxpbmsgSW50ZXJ2YWwjZW5ndWxmc31cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBJbnRlcnZhbCN0b1N0cmluZ30sIHtAbGluayBJbnRlcnZhbCN0b0lTT30sIHtAbGluayBJbnRlcnZhbCN0b0lTT0RhdGV9LCB7QGxpbmsgSW50ZXJ2YWwjdG9JU09UaW1lfSwge0BsaW5rIEludGVydmFsI3RvRm9ybWF0fSwgYW5kIHtAbGluayBJbnRlcnZhbCN0b0R1cmF0aW9ufS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWwge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpO1xuXG4gICAgaWYgKHZhbGlkYXRlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbiksXG4gICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZSNmcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT31cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgbGV0IHN0YXJ0LCBzdGFydElzVmFsaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyk7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IHN0YXJ0LmlzVmFsaWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZW5kLCBlbmRJc1ZhbGlkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kSXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uSW50ZXJ2YWwpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgc3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIHJldHVybiB0aGUgbGVuZ3RoIGluLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIEludGVydmFsI2xlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGNvdW50KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0c1wiIHRoZSBzdGFydCBhbmQvb3IgZW5kIGRhdGVzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gdmFsdWVzLmVuZCAtIHRoZSBlbmRpbmcgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzZXQoeyBzdGFydCwgZW5kIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHNwbGl0QXQoLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBzb3J0ZWQgPSBkYXRlVGltZXNcbiAgICAgICAgLm1hcChmcmllbmRseURhdGVUaW1lKVxuICAgICAgICAuZmlsdGVyKChkKSA9PiB0aGlzLmNvbnRhaW5zKGQpKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpID0gMDtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3BsaXRCeShkdXJhdGlvbikge1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpZHggPSAxLFxuICAgICAgbmV4dDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnN0YXJ0LnBsdXMoZHVyLm1hcFVuaXRzKCh4KSA9PiB4ICogaWR4KSk7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID49IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cbiAgICogQHBhcmFtIHtBcnJheX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIG1lcmdlKGludGVydmFscykge1xuICAgIGNvbnN0IFtmb3VuZCwgZmluYWxdID0gaW50ZXJ2YWxzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5zIC0gYi5zKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKFtzb2ZhciwgY3VycmVudF0sIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtbXSwgbnVsbF1cbiAgICAgICk7XG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnRlcnZhbHNcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgeG9yKGludGVydmFscykge1xuICAgIGxldCBzdGFydCA9IG51bGwsXG4gICAgICBjdXJyZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXSxcbiAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKChpKSA9PiBbXG4gICAgICAgIHsgdGltZTogaS5zLCB0eXBlOiBcInNcIiB9LFxuICAgICAgICB7IHRpbWU6IGkuZSwgdHlwZTogXCJlXCIgfSxcbiAgICAgIF0pLFxuICAgICAgZmxhdHRlbmVkID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi5lbmRzKSxcbiAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZGlmZmVyZW5jZSguLi5pbnRlcnZhbHMpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSlcbiAgICAgIC5tYXAoKGkpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKVxuICAgICAgLmZpbHRlcigoaSkgPT4gaSAmJiAhaS5pc0VtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0gXHUyMDEzICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPKG9wdHMpfS8ke3RoaXMuZS50b0lTTyhvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSB0aW1lIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyBcdTIwMTMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChkYXRlRm9ybWF0LCB7IHNlcGFyYXRvciA9IFwiIFx1MjAxMyBcIiB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gbWFwRm4gb24gdGhlIGludGVydmFsIHN0YXJ0IGFuZCBlbmQsIHJldHVybmluZyBhIG5ldyBJbnRlcnZhbCBmcm9tIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1hcEZuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQudG9VVEMoKSlcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikubWFwRW5kcG9pbnRzKGVuZHBvaW50ID0+IGVuZHBvaW50LnBsdXMoeyBob3VyczogMiB9KSlcbiAgICovXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxuaW1wb3J0IHsgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZvIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGhhc0RTVCh6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmUpIHtcbiAgICBjb25zdCBwcm90byA9IERhdGVUaW1lLm5vdygpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLmlzVW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHsgbW9udGg6IDYgfSkub2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpbnB1dCBpbnRvIGEge0BsaW5rIFpvbmV9IGluc3RhbmNlLlxuICAgKlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYWxyZWFkeSBhIFpvbmUgaW5zdGFuY2UsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCB0aW1lIHpvbmUgbmFtZSwgYSBab25lIGluc3RhbmNlXG4gICAqICAgd2l0aCB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYSBrbm93biB0aW1lIHpvbmUsIGEgWm9uZVxuICAgKiAgIGluc3RhbmNlIHdpdGgge0BsaW5rIFpvbmUjaXNWYWxpZH0gPT0gZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0IGlzIGEgbnVtYmVyLCBhIFpvbmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIG9mZnNldFxuICAgKiAgIGluIG1pbnV0ZXMgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBkZWZhdWx0IHpvbmUgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV8bnVtYmVyfSBbaW5wdXRdIC0gdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtab25lfVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVpvbmUoaW5wdXQpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShpbnB1dCwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ1x1MDY2MSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiaVx1MDJCQiBJJ1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBtb250aHMoXG4gICAgbGVuZ3RoID0gXCJsb25nXCIsXG4gICAgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsLCBvdXRwdXRDYWxlbmRhciA9IFwiZ3JlZ29yeVwiIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgSW5mbyNtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbW9udGhzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCwgb3V0cHV0Q2FsZW5kYXIgPSBcImdyZWdvcnlcIiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAnXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJCXHUwNjQ2XHUwNjRBXHUwNjQ2J1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIEluZm8jd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIHdlZWtkYXlzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ215JyB9KSAvLz0+IFsgJ1x1MTAxNFx1MTAzNlx1MTAxNFx1MTAwMFx1MTAzQScsICdcdTEwMEFcdTEwMTRcdTEwMzEnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbWVyaWRpZW1zKHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IEpcdTAwRTlzdXMtQ2hyaXN0JywgJ2Fwclx1MDBFOHMgSlx1MDBFOXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGlmIHRoYXQncyB0aGUgY2FzZS5cbiAgICogS2V5czpcbiAgICogKiBgcmVsYXRpdmVgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgcmVsYXRpdmUgdGltZSBmb3JtYXR0aW5nXG4gICAqIEBleGFtcGxlIEluZm8uZmVhdHVyZXMoKSAvLz0+IHsgcmVsYXRpdmU6IGZhbHNlIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGZlYXR1cmVzKCkge1xuICAgIHJldHVybiB7IHJlbGF0aXZlOiBoYXNSZWxhdGl2ZSgpIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4uL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIGRheURpZmYoZWFybGllciwgbGF0ZXIpIHtcbiAgY29uc3QgdXRjRGF5U3RhcnQgPSAoZHQpID0+IGR0LnRvVVRDKDAsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKSxcbiAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuICByZXR1cm4gTWF0aC5mbG9vcihEdXJhdGlvbi5mcm9tTWlsbGlzKG1zKS5hcyhcImRheXNcIikpO1xufVxuXG5mdW5jdGlvbiBoaWdoT3JkZXJEaWZmcyhjdXJzb3IsIGxhdGVyLCB1bml0cykge1xuICBjb25zdCBkaWZmZXJzID0gW1xuICAgIFtcInllYXJzXCIsIChhLCBiKSA9PiBiLnllYXIgLSBhLnllYXJdLFxuICAgIFtcInF1YXJ0ZXJzXCIsIChhLCBiKSA9PiBiLnF1YXJ0ZXIgLSBhLnF1YXJ0ZXJdLFxuICAgIFtcIm1vbnRoc1wiLCAoYSwgYikgPT4gYi5tb250aCAtIGEubW9udGggKyAoYi55ZWFyIC0gYS55ZWFyKSAqIDEyXSxcbiAgICBbXG4gICAgICBcIndlZWtzXCIsXG4gICAgICAoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICAgICAgcmV0dXJuIChkYXlzIC0gKGRheXMgJSA3KSkgLyA3O1xuICAgICAgfSxcbiAgICBdLFxuICAgIFtcImRheXNcIiwgZGF5RGlmZl0sXG4gIF07XG5cbiAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICBsZXQgbG93ZXN0T3JkZXIsIGhpZ2hXYXRlcjtcblxuICBmb3IgKGNvbnN0IFt1bml0LCBkaWZmZXJdIG9mIGRpZmZlcnMpIHtcbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIGxldCBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSB9KTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSAtIDEgfSk7XG4gICAgICAgIGRlbHRhIC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdHNbdW5pdF0gPSBkZWx0YTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpIHtcbiAgbGV0IFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdID0gaGlnaE9yZGVyRGlmZnMoZWFybGllciwgbGF0ZXIsIHVuaXRzKTtcblxuICBjb25zdCByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICBjb25zdCBsb3dlck9yZGVyVW5pdHMgPSB1bml0cy5maWx0ZXIoXG4gICAgKHUpID0+IFtcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl0uaW5kZXhPZih1KSA+PSAwXG4gICk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW2xvd2VzdE9yZGVyXTogMSB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHJlc3VsdHMsIG9wdHMpO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKHJlbWFpbmluZ01pbGxpcywgb3B0cylcbiAgICAgIC5zaGlmdFRvKC4uLmxvd2VyT3JkZXJVbml0cylcbiAgICAgIC5wbHVzKGR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cbn1cbiIsICJjb25zdCBudW1iZXJpbmdTeXN0ZW1zID0ge1xuICBhcmFiOiBcIltcXHUwNjYwLVxcdTA2NjldXCIsXG4gIGFyYWJleHQ6IFwiW1xcdTA2RjAtXFx1MDZGOV1cIixcbiAgYmFsaTogXCJbXFx1MUI1MC1cXHUxQjU5XVwiLFxuICBiZW5nOiBcIltcXHUwOUU2LVxcdTA5RUZdXCIsXG4gIGRldmE6IFwiW1xcdTA5NjYtXFx1MDk2Rl1cIixcbiAgZnVsbHdpZGU6IFwiW1xcdUZGMTAtXFx1RkYxOV1cIixcbiAgZ3VqcjogXCJbXFx1MEFFNi1cXHUwQUVGXVwiLFxuICBoYW5pZGVjOiBcIltcdTMwMDd8XHU0RTAwfFx1NEU4Q3xcdTRFMDl8XHU1NkRCfFx1NEU5NHxcdTUxNkR8XHU0RTAzfFx1NTE2QnxcdTRFNURdXCIsXG4gIGtobXI6IFwiW1xcdTE3RTAtXFx1MTdFOV1cIixcbiAga25kYTogXCJbXFx1MENFNi1cXHUwQ0VGXVwiLFxuICBsYW9vOiBcIltcXHUwRUQwLVxcdTBFRDldXCIsXG4gIGxpbWI6IFwiW1xcdTE5NDYtXFx1MTk0Rl1cIixcbiAgbWx5bTogXCJbXFx1MEQ2Ni1cXHUwRDZGXVwiLFxuICBtb25nOiBcIltcXHUxODEwLVxcdTE4MTldXCIsXG4gIG15bXI6IFwiW1xcdTEwNDAtXFx1MTA0OV1cIixcbiAgb3J5YTogXCJbXFx1MEI2Ni1cXHUwQjZGXVwiLFxuICB0YW1sZGVjOiBcIltcXHUwQkU2LVxcdTBCRUZdXCIsXG4gIHRlbHU6IFwiW1xcdTBDNjYtXFx1MEM2Rl1cIixcbiAgdGhhaTogXCJbXFx1MEU1MC1cXHUwRTU5XVwiLFxuICB0aWJ0OiBcIltcXHUwRjIwLVxcdTBGMjldXCIsXG4gIGxhdG46IFwiXFxcXGRcIixcbn07XG5cbmNvbnN0IG51bWJlcmluZ1N5c3RlbXNVVEYxNiA9IHtcbiAgYXJhYjogWzE2MzIsIDE2NDFdLFxuICBhcmFiZXh0OiBbMTc3NiwgMTc4NV0sXG4gIGJhbGk6IFs2OTkyLCA3MDAxXSxcbiAgYmVuZzogWzI1MzQsIDI1NDNdLFxuICBkZXZhOiBbMjQwNiwgMjQxNV0sXG4gIGZ1bGx3aWRlOiBbNjUyOTYsIDY1MzAzXSxcbiAgZ3VqcjogWzI3OTAsIDI3OTldLFxuICBraG1yOiBbNjExMiwgNjEyMV0sXG4gIGtuZGE6IFszMzAyLCAzMzExXSxcbiAgbGFvbzogWzM3OTIsIDM4MDFdLFxuICBsaW1iOiBbNjQ3MCwgNjQ3OV0sXG4gIG1seW06IFszNDMwLCAzNDM5XSxcbiAgbW9uZzogWzYxNjAsIDYxNjldLFxuICBteW1yOiBbNDE2MCwgNDE2OV0sXG4gIG9yeWE6IFsyOTE4LCAyOTI3XSxcbiAgdGFtbGRlYzogWzMwNDYsIDMwNTVdLFxuICB0ZWx1OiBbMzE3NCwgMzE4M10sXG4gIHRoYWk6IFszNjY0LCAzNjczXSxcbiAgdGlidDogWzM4NzIsIDM4ODFdLFxufTtcblxuY29uc3QgaGFuaWRlY0NoYXJzID0gbnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjLnJlcGxhY2UoL1tcXFt8XFxdXS9nLCBcIlwiKS5zcGxpdChcIlwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGlnaXRzKHN0cikge1xuICBsZXQgdmFsdWUgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgIHZhbHVlID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICBpZiAoc3RyW2ldLnNlYXJjaChudW1iZXJpbmdTeXN0ZW1zLmhhbmlkZWMpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSArPSBoYW5pZGVjQ2hhcnMuaW5kZXhPZihzdHJbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbnVtYmVyaW5nU3lzdGVtc1VURjE2KSB7XG4gICAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IG51bWJlcmluZ1N5c3RlbXNVVEYxNltrZXldO1xuICAgICAgICAgIGlmIChjb2RlID49IG1pbiAmJiBjb2RlIDw9IG1heCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gY29kZSAtIG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWdpdFJlZ2V4KHsgbnVtYmVyaW5nU3lzdGVtIH0sIGFwcGVuZCA9IFwiXCIpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7bnVtYmVyaW5nU3lzdGVtc1tudW1iZXJpbmdTeXN0ZW0gfHwgXCJsYXRuXCJdfSR7YXBwZW5kfWApO1xufVxuIiwgImltcG9ydCB7IHBhcnNlTWlsbGlzLCBpc1VuZGVmaW5lZCwgdW50cnVuY2F0ZVllYXIsIHNpZ25lZE9mZnNldCwgaGFzT3duUHJvcGVydHkgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgRm9ybWF0dGVyIGZyb20gXCIuL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4uL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgRGF0ZVRpbWUgZnJvbSBcIi4uL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgeyBkaWdpdFJlZ2V4LCBwYXJzZURpZ2l0cyB9IGZyb20gXCIuL2RpZ2l0cy5qc1wiO1xuaW1wb3J0IHsgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmNvbnN0IE1JU1NJTkdfRlRQID0gXCJtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0XCI7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgsIHBvc3QgPSAoaSkgPT4gaSkge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbc10pID0+IHBvc3QocGFyc2VEaWdpdHMocykpIH07XG59XG5cbmNvbnN0IE5CU1AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5jb25zdCBzcGFjZU9yTkJTUCA9IGAoIHwke05CU1B9KWA7XG5jb25zdCBzcGFjZU9yTkJTUFJlZ0V4cCA9IG5ldyBSZWdFeHAoc3BhY2VPck5CU1AsIFwiZ1wiKTtcblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIC8vIG1ha2Ugc3BhY2UgYW5kIG5vbiBicmVha2FibGUgc3BhY2UgY2hhcmFjdGVycyBpbnRlcmNoYW5nZWFibGVcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuL2csIFwiXFxcXC4/XCIpLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIHNwYWNlT3JOQlNQKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC9cXC4vZywgXCJcIikgLy8gaWdub3JlIGRvdHMgdGhhdCB3ZXJlIG1hZGUgb3B0aW9uYWxcbiAgICAucmVwbGFjZShzcGFjZU9yTkJTUFJlZ0V4cCwgXCIgXCIpIC8vIGludGVyY2hhbmdlIHNwYWNlIGFuZCBuYnNwXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9uZU9mKHN0cmluZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgaWYgKHN0cmluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cChzdHJpbmdzLm1hcChmaXhMaXN0UmVnZXgpLmpvaW4oXCJ8XCIpKSxcbiAgICAgIGRlc2VyOiAoW3NdKSA9PlxuICAgICAgICBzdHJpbmdzLmZpbmRJbmRleCgoaSkgPT4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpKSArIHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbLCBoLCBtXSkgPT4gc2lnbmVkT2Zmc2V0KGgsIG0pLCBncm91cHMgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7IHJlZ2V4LCBkZXNlcjogKFtzXSkgPT4gcyB9O1xufVxuXG5mdW5jdGlvbiBlc2NhcGVUb2tlbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcLVxcW1xcXXt9KCkqKz8uLFxcXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xufVxuXG5mdW5jdGlvbiB1bml0Rm9yVG9rZW4odG9rZW4sIGxvYykge1xuICBjb25zdCBvbmUgPSBkaWdpdFJlZ2V4KGxvYyksXG4gICAgdHdvID0gZGlnaXRSZWdleChsb2MsIFwiezJ9XCIpLFxuICAgIHRocmVlID0gZGlnaXRSZWdleChsb2MsIFwiezN9XCIpLFxuICAgIGZvdXIgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NH1cIiksXG4gICAgc2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezZ9XCIpLFxuICAgIG9uZU9yVHdvID0gZGlnaXRSZWdleChsb2MsIFwiezEsMn1cIiksXG4gICAgb25lVG9UaHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDN9XCIpLFxuICAgIG9uZVRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezEsNn1cIiksXG4gICAgb25lVG9OaW5lID0gZGlnaXRSZWdleChsb2MsIFwiezEsOX1cIiksXG4gICAgdHdvVG9Gb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezIsNH1cIiksXG4gICAgZm91clRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezQsNn1cIiksXG4gICAgbGl0ZXJhbCA9ICh0KSA9PiAoeyByZWdleDogUmVnRXhwKGVzY2FwZVRva2VuKHQudmFsKSksIGRlc2VyOiAoW3NdKSA9PiBzLCBsaXRlcmFsOiB0cnVlIH0pLFxuICAgIHVuaXRhdGUgPSAodCkgPT4ge1xuICAgICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAgIC8vIGVyYVxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcInNob3J0XCIsIGZhbHNlKSwgMCk7XG4gICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcImxvbmdcIiwgZmFsc2UpLCAwKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1NpeCk7XG4gICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwieXl5eXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyVG9TaXgpO1xuICAgICAgICBjYXNlIFwieXl5eXl5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoc2l4KTtcbiAgICAgICAgLy8gbW9udGhzXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgLy8gb3JkaW5hbHNcbiAgICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcbiAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcbiAgICAgICAgLy8gdGltZVxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgcmV0dXJuIHNpbXBsZShvbmVUb05pbmUpO1xuICAgICAgICBjYXNlIFwidXVcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInV1dVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG4gICAgICAgIC8vIG1lcmlkaWVtXG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tZXJpZGllbXMoKSwgMCk7XG4gICAgICAgIC8vIHdlZWtZZWFyIChrKVxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIC8vIHdlZWtkYXlzXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAgIC8vIG9mZnNldC96b25lXG4gICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgIGNhc2UgXCJaWlwiOlxuICAgICAgICAgIHJldHVybiBvZmZzZXQobmV3IFJlZ0V4cChgKFsrLV0ke29uZU9yVHdvLnNvdXJjZX0pKD86Oigke3R3by5zb3VyY2V9KSk/YCksIDIpO1xuICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKGAoWystXSR7b25lT3JUd28uc291cmNlfSkoJHt0d28uc291cmNlfSk/YCksIDIpO1xuICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBhcmVcbiAgICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKC9bYS16XystL117MSwyNTZ9Py9pKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIGNvbnN0IHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFAsXG4gIH07XG5cbiAgdW5pdC50b2tlbiA9IHRva2VuO1xuXG4gIHJldHVybiB1bml0O1xufVxuXG5jb25zdCBwYXJ0VHlwZVN0eWxlVG9Ub2tlblZhbCA9IHtcbiAgeWVhcjoge1xuICAgIFwiMi1kaWdpdFwiOiBcInl5XCIsXG4gICAgbnVtZXJpYzogXCJ5eXl5eVwiLFxuICB9LFxuICBtb250aDoge1xuICAgIG51bWVyaWM6IFwiTVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIk1NXCIsXG4gICAgc2hvcnQ6IFwiTU1NXCIsXG4gICAgbG9uZzogXCJNTU1NXCIsXG4gIH0sXG4gIGRheToge1xuICAgIG51bWVyaWM6IFwiZFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImRkXCIsXG4gIH0sXG4gIHdlZWtkYXk6IHtcbiAgICBzaG9ydDogXCJFRUVcIixcbiAgICBsb25nOiBcIkVFRUVcIixcbiAgfSxcbiAgZGF5cGVyaW9kOiBcImFcIixcbiAgZGF5UGVyaW9kOiBcImFcIixcbiAgaG91cjoge1xuICAgIG51bWVyaWM6IFwiaFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImhoXCIsXG4gIH0sXG4gIG1pbnV0ZToge1xuICAgIG51bWVyaWM6IFwibVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIm1tXCIsXG4gIH0sXG4gIHNlY29uZDoge1xuICAgIG51bWVyaWM6IFwic1wiLFxuICAgIFwiMi1kaWdpdFwiOiBcInNzXCIsXG4gIH0sXG59O1xuXG5mdW5jdGlvbiB0b2tlbkZvclBhcnQocGFydCwgbG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gIGNvbnN0IHsgdHlwZSwgdmFsdWUgfSA9IHBhcnQ7XG5cbiAgaWYgKHR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IHRydWUsXG4gICAgICB2YWw6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IGZvcm1hdE9wdHNbdHlwZV07XG5cbiAgbGV0IHZhbCA9IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsW3R5cGVdO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhbCA9IHZhbFtzdHlsZV07XG4gIH1cblxuICBpZiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgdmFsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2V4KHVuaXRzKSB7XG4gIGNvbnN0IHJlID0gdW5pdHMubWFwKCh1KSA9PiB1LnJlZ2V4KS5yZWR1Y2UoKGYsIHIpID0+IGAke2Z9KCR7ci5zb3VyY2V9KWAsIFwiXCIpO1xuICByZXR1cm4gW2BeJHtyZX0kYCwgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb25zdCBhbGwgPSB7fTtcbiAgICBsZXQgbWF0Y2hJbmRleCA9IDE7XG4gICAgZm9yIChjb25zdCBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoaGFuZGxlcnMsIGkpKSB7XG4gICAgICAgIGNvbnN0IGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICBncm91cHMgPSBoLmdyb3VwcyA/IGguZ3JvdXBzICsgMSA6IDE7XG4gICAgICAgIGlmICghaC5saXRlcmFsICYmIGgudG9rZW4pIHtcbiAgICAgICAgICBhbGxbaC50b2tlbi52YWxbMF1dID0gaC5kZXNlcihtYXRjaGVzLnNsaWNlKG1hdGNoSW5kZXgsIG1hdGNoSW5kZXggKyBncm91cHMpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFttYXRjaGVzLCBhbGxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbWF0Y2hlcywge31dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykge1xuICBjb25zdCB0b0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIFwibWludXRlXCI7XG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gXCJvcmRpbmFsXCI7XG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrZGF5XCI7XG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrTnVtYmVyXCI7XG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIFwicXVhcnRlclwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGxldCB6b25lID0gbnVsbDtcbiAgbGV0IHNwZWNpZmljT2Zmc2V0O1xuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gSUFOQVpvbmUuY3JlYXRlKG1hdGNoZXMueik7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuWikpIHtcbiAgICBpZiAoIXpvbmUpIHtcbiAgICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gICAgfVxuICAgIHNwZWNpZmljT2Zmc2V0ID0gbWF0Y2hlcy5aO1xuICB9XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnEpKSB7XG4gICAgbWF0Y2hlcy5NID0gKG1hdGNoZXMucSAtIDEpICogMyArIDE7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgY29uc3QgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZSgociwgaykgPT4ge1xuICAgIGNvbnN0IGYgPSB0b0ZpZWxkKGspO1xuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuXG4gIHJldHVybiBbdmFscywgem9uZSwgc3BlY2lmaWNPZmZzZXRdO1xufVxuXG5sZXQgZHVtbXlEYXRlVGltZUNhY2hlID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0RHVtbXlEYXRlVGltZSgpIHtcbiAgaWYgKCFkdW1teURhdGVUaW1lQ2FjaGUpIHtcbiAgICBkdW1teURhdGVUaW1lQ2FjaGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKDE1NTU1NTU1NTU1NTUpO1xuICB9XG5cbiAgcmV0dXJuIGR1bW15RGF0ZVRpbWVDYWNoZTtcbn1cblxuZnVuY3Rpb24gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHRva2VuLCBsb2NhbGUpIHtcbiAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXRPcHRzID0gRm9ybWF0dGVyLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHModG9rZW4udmFsKTtcblxuICBpZiAoIWZvcm1hdE9wdHMpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXIuY3JlYXRlKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdERhdGVUaW1lUGFydHMoZ2V0RHVtbXlEYXRlVGltZSgpKTtcblxuICBjb25zdCB0b2tlbnMgPSBwYXJ0cy5tYXAoKHApID0+IHRva2VuRm9yUGFydChwLCBsb2NhbGUsIGZvcm1hdE9wdHMpKTtcblxuICBpZiAodG9rZW5zLmluY2x1ZGVzKHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBleHBhbmRNYWNyb1Rva2Vucyh0b2tlbnMsIGxvY2FsZSkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50b2tlbnMubWFwKCh0KSA9PiBtYXliZUV4cGFuZE1hY3JvVG9rZW4odCwgbG9jYWxlKSkpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB0b2tlbnMgPSBleHBhbmRNYWNyb1Rva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm9ybWF0KSwgbG9jYWxlKSxcbiAgICB1bml0cyA9IHRva2Vucy5tYXAoKHQpID0+IHVuaXRGb3JUb2tlbih0LCBsb2NhbGUpKSxcbiAgICBkaXNxdWFsaWZ5aW5nVW5pdCA9IHVuaXRzLmZpbmQoKHQpID0+IHQuaW52YWxpZFJlYXNvbik7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtyZWdleFN0cmluZywgaGFuZGxlcnNdID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgXCJpXCIpLFxuICAgICAgW3Jhd01hdGNoZXMsIG1hdGNoZXNdID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldF0gPSBtYXRjaGVzXG4gICAgICAgID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKVxuICAgICAgICA6IFtudWxsLCBudWxsLCB1bmRlZmluZWRdO1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShtYXRjaGVzLCBcImFcIikgJiYgaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJIXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgcmVnZXgsIHJhd01hdGNoZXMsIG1hdGNoZXMsIHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB7IHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQsIGludmFsaWRSZWFzb24gfSA9IGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCk7XG4gIHJldHVybiBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldCwgaW52YWxpZFJlYXNvbl07XG59XG4iLCAiaW1wb3J0IHtcbiAgaW50ZWdlckJldHdlZW4sXG4gIGlzTGVhcFllYXIsXG4gIHRpbWVPYmplY3QsXG4gIGRheXNJblllYXIsXG4gIGRheXNJbk1vbnRoLFxuICB3ZWVrc0luV2Vla1llYXIsXG4gIGlzSW50ZWdlcixcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW52YWxpZC5qc1wiO1xuXG5jb25zdCBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIHVuaXRPdXRPZlJhbmdlKHVuaXQsIHZhbHVlKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcbiAgICBcInVuaXQgb3V0IG9mIHJhbmdlXCIsXG4gICAgYHlvdSBzcGVjaWZpZWQgJHt2YWx1ZX0gKG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9KSBhcyBhICR7dW5pdH0sIHdoaWNoIGlzIGludmFsaWRgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIGNvbnN0IGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgY29uc3QgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KChpKSA9PiBpIDwgb3JkaW5hbCksXG4gICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7IG1vbnRoOiBtb250aDAgKyAxLCBkYXkgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdPYmosXG4gICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgIHdlZWtkYXkgPSBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSk7XG5cbiAgbGV0IHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgIHdlZWtZZWFyO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIHsgd2Vla1llYXIsIHdlZWtOdW1iZXIsIHdlZWtkYXksIC4uLnRpbWVPYmplY3QoZ3JlZ09iaikgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICBjb25zdCB7IHdlZWtZZWFyLCB3ZWVrTnVtYmVyLCB3ZWVrZGF5IH0gPSB3ZWVrRGF0YSxcbiAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICB5ZWFySW5EYXlzID0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG5cbiAgbGV0IG9yZGluYWwgPSB3ZWVrTnVtYmVyICogNyArIHdlZWtkYXkgLSB3ZWVrZGF5T2ZKYW40IC0gMyxcbiAgICB5ZWFyO1xuXG4gIGlmIChvcmRpbmFsIDwgMSkge1xuICAgIHllYXIgPSB3ZWVrWWVhciAtIDE7XG4gICAgb3JkaW5hbCArPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2UgaWYgKG9yZGluYWwgPiB5ZWFySW5EYXlzKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyICsgMTtcbiAgICBvcmRpbmFsIC09IGRheXNJblllYXIod2Vla1llYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIGNvbnN0IHsgbW9udGgsIGRheSB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSwgLi4udGltZU9iamVjdCh3ZWVrRGF0YSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdEYXRhO1xuICBjb25zdCBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiB7IHllYXIsIG9yZGluYWwsIC4uLnRpbWVPYmplY3QoZ3JlZ0RhdGEpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsVG9HcmVnb3JpYW4ob3JkaW5hbERhdGEpIHtcbiAgY29uc3QgeyB5ZWFyLCBvcmRpbmFsIH0gPSBvcmRpbmFsRGF0YTtcbiAgY29uc3QgeyBtb250aCwgZGF5IH0gPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpO1xuICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5LCAuLi50aW1lT2JqZWN0KG9yZGluYWxEYXRhKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLndlZWtZZWFyKSxcbiAgICB2YWxpZFdlZWsgPSBpbnRlZ2VyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgIHZhbGlkV2Vla2RheSA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai55ZWFyKSxcbiAgICB2YWxpZE9yZGluYWwgPSBpbnRlZ2VyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIGNvbnN0IHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgdmFsaWRNb250aCA9IGludGVnZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgIHZhbGlkRGF5ID0gaW50ZWdlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtb250aFwiLCBvYmoubW9udGgpO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcImRheVwiLCBvYmouZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQgfSA9IG9iajtcbiAgY29uc3QgdmFsaWRIb3VyID1cbiAgICAgIGludGVnZXJCZXR3ZWVuKGhvdXIsIDAsIDIzKSB8fFxuICAgICAgKGhvdXIgPT09IDI0ICYmIG1pbnV0ZSA9PT0gMCAmJiBzZWNvbmQgPT09IDAgJiYgbWlsbGlzZWNvbmQgPT09IDApLFxuICAgIHZhbGlkTWludXRlID0gaW50ZWdlckJldHdlZW4obWludXRlLCAwLCA1OSksXG4gICAgdmFsaWRTZWNvbmQgPSBpbnRlZ2VyQmV0d2VlbihzZWNvbmQsIDAsIDU5KSxcbiAgICB2YWxpZE1pbGxpc2Vjb25kID0gaW50ZWdlckJldHdlZW4obWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIGhvdXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbnV0ZSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInNlY29uZFwiLCBzZWNvbmQpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWlsbGlzZWNvbmRcIiwgbWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCBEdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IEludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBJbmZvIGZyb20gXCIuL2luZm8uanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5pbXBvcnQge1xuICBpc1VuZGVmaW5lZCxcbiAgbWF5YmVBcnJheSxcbiAgaXNEYXRlLFxuICBpc051bWJlcixcbiAgYmVzdEJ5LFxuICBkYXlzSW5Nb250aCxcbiAgZGF5c0luWWVhcixcbiAgaXNMZWFwWWVhcixcbiAgd2Vla3NJbldlZWtZZWFyLFxuICBub3JtYWxpemVPYmplY3QsXG4gIHJvdW5kVG8sXG4gIG9ialRvTG9jYWxUUyxcbiAgcGFkU3RhcnQsXG59IGZyb20gXCIuL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcbmltcG9ydCBkaWZmIGZyb20gXCIuL2ltcGwvZGlmZi5qc1wiO1xuaW1wb3J0IHsgcGFyc2VSRkMyODIyRGF0ZSwgcGFyc2VJU09EYXRlLCBwYXJzZUhUVFBEYXRlLCBwYXJzZVNRTCB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7IHBhcnNlRnJvbVRva2VucywgZXhwbGFpbkZyb21Ub2tlbnMgfSBmcm9tIFwiLi9pbXBsL3Rva2VuUGFyc2VyLmpzXCI7XG5pbXBvcnQge1xuICBncmVnb3JpYW5Ub1dlZWssXG4gIHdlZWtUb0dyZWdvcmlhbixcbiAgZ3JlZ29yaWFuVG9PcmRpbmFsLFxuICBvcmRpbmFsVG9HcmVnb3JpYW4sXG4gIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhLFxuICBoYXNJbnZhbGlkV2Vla0RhdGEsXG4gIGhhc0ludmFsaWRPcmRpbmFsRGF0YSxcbiAgaGFzSW52YWxpZFRpbWVEYXRhLFxufSBmcm9tIFwiLi9pbXBsL2NvbnZlcnNpb25zLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2ltcGwvZm9ybWF0cy5qc1wiO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yLFxuICBJbnZhbGlkVW5pdEVycm9yLFxuICBJbnZhbGlkRGF0ZVRpbWVFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEYXRlVGltZVwiO1xuY29uc3QgTUFYX0RBVEUgPSA4LjY0ZTE1O1xuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFpvbmUoem9uZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXCJ1bnN1cHBvcnRlZCB6b25lXCIsIGB0aGUgem9uZSBcIiR7em9uZS5uYW1lfVwiIGlzIG5vdCBzdXBwb3J0ZWRgKTtcbn1cblxuLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcbmZ1bmN0aW9uIHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEoZHQpIHtcbiAgaWYgKGR0LndlZWtEYXRhID09PSBudWxsKSB7XG4gICAgZHQud2Vla0RhdGEgPSBncmVnb3JpYW5Ub1dlZWsoZHQuYyk7XG4gIH1cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufVxuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBjbG9uZShpbnN0LCBhbHRzKSB7XG4gIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgdHM6IGluc3QudHMsXG4gICAgem9uZTogaW5zdC56b25lLFxuICAgIGM6IGluc3QuYyxcbiAgICBvOiBpbnN0Lm8sXG4gICAgbG9jOiBpbnN0LmxvYyxcbiAgICBpbnZhbGlkOiBpbnN0LmludmFsaWQsXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyAuLi5jdXJyZW50LCAuLi5hbHRzLCBvbGQ6IGN1cnJlbnQgfSk7XG59XG5cbi8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcbmZ1bmN0aW9uIGZpeE9mZnNldChsb2NhbFRTLCBvLCB0eikge1xuICAvLyBPdXIgVVRDIHRpbWUgaXMganVzdCBhIGd1ZXNzIGJlY2F1c2Ugb3VyIG9mZnNldCBpcyBqdXN0IGEgZ3Vlc3NcbiAgbGV0IHV0Y0d1ZXNzID0gbG9jYWxUUyAtIG8gKiA2MCAqIDEwMDA7XG5cbiAgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuICBjb25zdCBvMiA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG5cbiAgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG4gIGlmIChvID09PSBvMikge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG9dO1xuICB9XG5cbiAgLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcbiAgdXRjR3Vlc3MgLT0gKG8yIC0gbykgKiA2MCAqIDEwMDA7XG5cbiAgLy8gSWYgdGhhdCBnaXZlcyB1cyB0aGUgbG9jYWwgdGltZSB3ZSB3YW50LCB3ZSdyZSBkb25lXG4gIGNvbnN0IG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgbW9udGg6IGQuZ2V0VVRDTW9udGgoKSArIDEsXG4gICAgZGF5OiBkLmdldFVUQ0RhdGUoKSxcbiAgICBob3VyOiBkLmdldFVUQ0hvdXJzKCksXG4gICAgbWludXRlOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIG1pbGxpc2Vjb25kOiBkLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICB9O1xufVxuXG4vLyBjb252ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgZXBvY2ggdGltZXN0YW1wXG5mdW5jdGlvbiBvYmpUb1RTKG9iaiwgb2Zmc2V0LCB6b25lKSB7XG4gIHJldHVybiBmaXhPZmZzZXQob2JqVG9Mb2NhbFRTKG9iaiksIG9mZnNldCwgem9uZSk7XG59XG5cbi8vIGNyZWF0ZSBhIG5ldyBEVCBpbnN0YW5jZSBieSBhZGRpbmcgYSBkdXJhdGlvbiwgYWRqdXN0aW5nIGZvciBEU1RzXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICBjb25zdCBvUHJlID0gaW5zdC5vLFxuICAgIHllYXIgPSBpbnN0LmMueWVhciArIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICBtb250aCA9IGluc3QuYy5tb250aCArIE1hdGgudHJ1bmMoZHVyLm1vbnRocykgKyBNYXRoLnRydW5jKGR1ci5xdWFydGVycykgKiAzLFxuICAgIGMgPSB7XG4gICAgICAuLi5pbnN0LmMsXG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXk6XG4gICAgICAgIE1hdGgubWluKGluc3QuYy5kYXksIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSkgK1xuICAgICAgICBNYXRoLnRydW5jKGR1ci5kYXlzKSArXG4gICAgICAgIE1hdGgudHJ1bmMoZHVyLndlZWtzKSAqIDcsXG4gICAgfSxcbiAgICBtaWxsaXNUb0FkZCA9IER1cmF0aW9uLmZyb21PYmplY3Qoe1xuICAgICAgeWVhcnM6IGR1ci55ZWFycyAtIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICAgIHF1YXJ0ZXJzOiBkdXIucXVhcnRlcnMgLSBNYXRoLnRydW5jKGR1ci5xdWFydGVycyksXG4gICAgICBtb250aHM6IGR1ci5tb250aHMgLSBNYXRoLnRydW5jKGR1ci5tb250aHMpLFxuICAgICAgd2Vla3M6IGR1ci53ZWVrcyAtIE1hdGgudHJ1bmMoZHVyLndlZWtzKSxcbiAgICAgIGRheXM6IGR1ci5kYXlzIC0gTWF0aC50cnVuYyhkdXIuZGF5cyksXG4gICAgICBob3VyczogZHVyLmhvdXJzLFxuICAgICAgbWludXRlczogZHVyLm1pbnV0ZXMsXG4gICAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kcyxcbiAgICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIGxldCBbdHMsIG9dID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSk7XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzLCBvIH07XG59XG5cbi8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuZnVuY3Rpb24gcGFyc2VEYXRhVG9EYXRlVGltZShwYXJzZWQsIHBhcnNlZFpvbmUsIG9wdHMsIGZvcm1hdCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpIHtcbiAgY29uc3QgeyBzZXRab25lLCB6b25lIH0gPSBvcHRzO1xuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QocGFyc2VkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgICAgc3BlY2lmaWNPZmZzZXQsXG4gICAgICB9KTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXG4gICAgICBuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgJHtmb3JtYXR9YClcbiAgICApO1xuICB9XG59XG5cbi8vIGlmIHlvdSB3YW50IHRvIG91dHB1dCBhIHRlY2huaWNhbCBmb3JtYXQgKGUuZy4gUkZDIDI4MjIpLCB0aGlzIGhlbHBlclxuLy8gaGVscHMgaGFuZGxlIHRoZSBkZXRhaWxzXG5mdW5jdGlvbiB0b1RlY2hGb3JtYXQoZHQsIGZvcm1hdCwgYWxsb3daID0gdHJ1ZSkge1xuICByZXR1cm4gZHQuaXNWYWxpZFxuICAgID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICAgICAgYWxsb3daLFxuICAgICAgICBmb3JjZVNpbXBsZTogdHJ1ZSxcbiAgICAgIH0pLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm9ybWF0KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9JU09EYXRlKG8sIGV4dGVuZGVkKSB7XG4gIGNvbnN0IGxvbmdGb3JtYXQgPSBvLmMueWVhciA+IDk5OTkgfHwgby5jLnllYXIgPCAwO1xuICBsZXQgYyA9IFwiXCI7XG4gIGlmIChsb25nRm9ybWF0ICYmIG8uYy55ZWFyID49IDApIGMgKz0gXCIrXCI7XG4gIGMgKz0gcGFkU3RhcnQoby5jLnllYXIsIGxvbmdGb3JtYXQgPyA2IDogNCk7XG5cbiAgaWYgKGV4dGVuZGVkKSB7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5tb250aCk7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9IGVsc2Uge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLm1vbnRoKTtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiB0b0lTT1RpbWUobywgZXh0ZW5kZWQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpIHtcbiAgbGV0IGMgPSBwYWRTdGFydChvLmMuaG91cik7XG4gIGlmIChleHRlbmRlZCkge1xuICAgIGMgKz0gXCI6XCI7XG4gICAgYyArPSBwYWRTdGFydChvLmMubWludXRlKTtcbiAgICBpZiAoby5jLnNlY29uZCAhPT0gMCB8fCAhc3VwcHJlc3NTZWNvbmRzKSB7XG4gICAgICBjICs9IFwiOlwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5taW51dGUpO1xuICB9XG5cbiAgaWYgKG8uYy5zZWNvbmQgIT09IDAgfHwgIXN1cHByZXNzU2Vjb25kcykge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLnNlY29uZCk7XG5cbiAgICBpZiAoby5jLm1pbGxpc2Vjb25kICE9PSAwIHx8ICFzdXBwcmVzc01pbGxpc2Vjb25kcykge1xuICAgICAgYyArPSBcIi5cIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoby5jLm1pbGxpc2Vjb25kLCAzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGlmIChvLmlzT2Zmc2V0Rml4ZWQgJiYgby5vZmZzZXQgPT09IDApIHtcbiAgICAgIGMgKz0gXCJaXCI7XG4gICAgfSBlbHNlIGlmIChvLm8gPCAwKSB7XG4gICAgICBjICs9IFwiLVwiO1xuICAgICAgYyArPSBwYWRTdGFydChNYXRoLnRydW5jKC1vLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYygtby5vICUgNjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYyArPSBcIitcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gJSA2MCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYztcbn1cblxuLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG5jb25zdCBkZWZhdWx0VW5pdFZhbHVlcyA9IHtcbiAgICBtb250aDogMSxcbiAgICBkYXk6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9LFxuICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gICAgd2Vla051bWJlcjogMSxcbiAgICB3ZWVrZGF5OiAxLFxuICAgIGhvdXI6IDAsXG4gICAgbWludXRlOiAwLFxuICAgIHNlY29uZDogMCxcbiAgICBtaWxsaXNlY29uZDogMCxcbiAgfSxcbiAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICAgIG9yZGluYWw6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9O1xuXG4vLyBVbml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFycywgc29ydGVkIGJ5IGJpZ25lc3NcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgb3JkZXJlZFdlZWtVbml0cyA9IFtcbiAgICBcIndlZWtZZWFyXCIsXG4gICAgXCJ3ZWVrTnVtYmVyXCIsXG4gICAgXCJ3ZWVrZGF5XCIsXG4gICAgXCJob3VyXCIsXG4gICAgXCJtaW51dGVcIixcbiAgICBcInNlY29uZFwiLFxuICAgIFwibWlsbGlzZWNvbmRcIixcbiAgXSxcbiAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFtcInllYXJcIiwgXCJvcmRpbmFsXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBxdWFydGVyOiBcInF1YXJ0ZXJcIixcbiAgICBxdWFydGVyczogXCJxdWFydGVyXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiLFxuICB9W3VuaXQudG9Mb3dlckNhc2UoKV07XG5cbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgb3B0cykge1xuICBjb25zdCB6b25lID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKSxcbiAgICB0c05vdyA9IFNldHRpbmdzLm5vdygpO1xuXG4gIGxldCB0cywgbztcblxuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGlmICghaXNVbmRlZmluZWQob2JqLnllYXIpKSB7XG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKG9ialt1XSkpIHtcbiAgICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG9iaik7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KTtcbiAgICBbdHMsIG9dID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgdHMgPSB0c05vdztcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0cywgem9uZSwgbG9jLCBvIH0pO1xufVxuXG5mdW5jdGlvbiBkaWZmUmVsYXRpdmUoc3RhcnQsIGVuZCwgb3B0cykge1xuICBjb25zdCByb3VuZCA9IGlzVW5kZWZpbmVkKG9wdHMucm91bmQpID8gdHJ1ZSA6IG9wdHMucm91bmQsXG4gICAgZm9ybWF0ID0gKGMsIHVuaXQpID0+IHtcbiAgICAgIGMgPSByb3VuZFRvKGMsIHJvdW5kIHx8IG9wdHMuY2FsZW5kYXJ5ID8gMCA6IDIsIHRydWUpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZW5kLmxvYy5jbG9uZShvcHRzKS5yZWxGb3JtYXR0ZXIob3B0cyk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChjLCB1bml0KTtcbiAgICB9LFxuICAgIGRpZmZlciA9ICh1bml0KSA9PiB7XG4gICAgICBpZiAob3B0cy5jYWxlbmRhcnkpIHtcbiAgICAgICAgaWYgKCFlbmQuaGFzU2FtZShzdGFydCwgdW5pdCkpIHtcbiAgICAgICAgICByZXR1cm4gZW5kLnN0YXJ0T2YodW5pdCkuZGlmZihzdGFydC5zdGFydE9mKHVuaXQpLCB1bml0KS5nZXQodW5pdCk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgaWYgKG9wdHMudW5pdCkge1xuICAgIHJldHVybiBmb3JtYXQoZGlmZmVyKG9wdHMudW5pdCksIG9wdHMudW5pdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygb3B0cy51bml0cykge1xuICAgIGNvbnN0IGNvdW50ID0gZGlmZmVyKHVuaXQpO1xuICAgIGlmIChNYXRoLmFicyhjb3VudCkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3RhcnQgPiBlbmQgPyAtMCA6IDAsIG9wdHMudW5pdHNbb3B0cy51bml0cy5sZW5ndGggLSAxXSk7XG59XG5cbmZ1bmN0aW9uIGxhc3RPcHRzKGFyZ0xpc3QpIHtcbiAgbGV0IG9wdHMgPSB7fSxcbiAgICBhcmdzO1xuICBpZiAoYXJnTGlzdC5sZW5ndGggPiAwICYmIHR5cGVvZiBhcmdMaXN0W2FyZ0xpc3QubGVuZ3RoIC0gMV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICBvcHRzID0gYXJnTGlzdFthcmdMaXN0Lmxlbmd0aCAtIDFdO1xuICAgIGFyZ3MgPSBBcnJheS5mcm9tKGFyZ0xpc3QpLnNsaWNlKDAsIGFyZ0xpc3QubGVuZ3RoIC0gMSk7XG4gIH0gZWxzZSB7XG4gICAgYXJncyA9IEFycmF5LmZyb20oYXJnTGlzdCk7XG4gIH1cbiAgcmV0dXJuIFtvcHRzLCBhcmdzXTtcbn1cblxuLyoqXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXG4gKlxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XG4gKlxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIERhdGVUaW1lI2xvY2FsfSwge0BsaW5rIERhdGVUaW1lI3V0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIERhdGVUaW1lI2Zyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21JU099LCB7QGxpbmsgRGF0ZVRpbWUjZnJvbUhUVFB9LCBhbmQge0BsaW5rIERhdGVUaW1lI2Zyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgRGF0ZVRpbWUjZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21KU0RhdGV9LlxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIERhdGVUaW1lI3RvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3llYXJ9LCB7QGxpbmsgRGF0ZVRpbWUjbW9udGh9LFxuICoge0BsaW5rIERhdGVUaW1lI2RheX0sIHtAbGluayBEYXRlVGltZSNob3VyfSwge0BsaW5rIERhdGVUaW1lI21pbnV0ZX0sIHtAbGluayBEYXRlVGltZSNzZWNvbmR9LCB7QGxpbmsgRGF0ZVRpbWUjbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayBEYXRlVGltZSN3ZWVrWWVhcn0sIHtAbGluayBEYXRlVGltZSN3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayBEYXRlVGltZSN3ZWVrZGF5fSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIERhdGVUaW1lI2xvY2FsZX0gYW5kIHtAbGluayBEYXRlVGltZSNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIERhdGVUaW1lI3NldH0sIHtAbGluayBEYXRlVGltZSNyZWNvbmZpZ3VyZX0sIHtAbGluayBEYXRlVGltZSNzZXRab25lfSwge0BsaW5rIERhdGVUaW1lI3NldExvY2FsZX0sIHtAbGluayBEYXRlVGltZS5wbHVzfSwge0BsaW5rIERhdGVUaW1lI21pbnVzfSwge0BsaW5rIERhdGVUaW1lI2VuZE9mfSwge0BsaW5rIERhdGVUaW1lI3N0YXJ0T2Z9LCB7QGxpbmsgRGF0ZVRpbWUjdG9VVEN9LCBhbmQge0BsaW5rIERhdGVUaW1lI3RvTG9jYWx9LlxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3RvUmVsYXRpdmV9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SZWxhdGl2ZUNhbGVuZGFyfSwge0BsaW5rIERhdGVUaW1lI3RvSlNPTn0sIHtAbGluayBEYXRlVGltZSN0b0lTT30sIHtAbGluayBEYXRlVGltZSN0b0hUVFB9LCB7QGxpbmsgRGF0ZVRpbWUjdG9PYmplY3R9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SRkMyODIyfSwge0BsaW5rIERhdGVUaW1lI3RvU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSwge0BsaW5rIERhdGVUaW1lI3RvTWlsbGlzfSBhbmQge0BsaW5rIERhdGVUaW1lI3RvSlNEYXRlfS5cbiAqXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlVGltZSB7XG4gIC8qKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIGNvbnN0IHpvbmUgPSBjb25maWcuem9uZSB8fCBTZXR0aW5ncy5kZWZhdWx0Wm9uZTtcblxuICAgIGxldCBpbnZhbGlkID1cbiAgICAgIGNvbmZpZy5pbnZhbGlkIHx8XG4gICAgICAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsKSB8fFxuICAgICAgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuXG4gICAgbGV0IGMgPSBudWxsLFxuICAgICAgbyA9IG51bGw7XG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICBjb25zdCB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcblxuICAgICAgaWYgKHVuY2hhbmdlZCkge1xuICAgICAgICBbYywgb10gPSBbY29uZmlnLm9sZC5jLCBjb25maWcub2xkLm9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3QgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgYyA9IHRzVG9PYmoodGhpcy50cywgb3QpO1xuICAgICAgICBpbnZhbGlkID0gTnVtYmVyLmlzTmFOKGMueWVhcikgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsO1xuICAgICAgICBjID0gaW52YWxpZCA/IG51bGwgOiBjO1xuICAgICAgICBvID0gaW52YWxpZCA/IG51bGwgOiBvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl96b25lID0gem9uZTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy53ZWVrRGF0YSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXNMdXhvbkRhdGVUaW1lID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudCwgaW4gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICpcbiAgICogVXNlIFNldHRpbmdzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGlmIG5lZWRlZC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvL34+IG5vdyBpbiB0aGUgSVNPIGZvcm1hdFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBub3coKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbG9jYWwgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgbG9jYWwoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKHsgem9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCIgfSkgICAgICAvL34+IG5vdywgaW4gVVMgZWFzdCBjb2FzdCB0aW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDAsIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCB7IHpvbmU6IFwidXRjXCIgfSkgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDAsIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUpICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgbG9jYWwoKSB7XG4gICAgY29uc3QgW29wdHMsIGFyZ3NdID0gbGFzdE9wdHMoYXJndW1lbnRzKSxcbiAgICAgIFt5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdID0gYXJncztcbiAgICByZXR1cm4gcXVpY2tEVCh7IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF5PTFdIC0gVGhlIGRheSBvZiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub3V0cHV0Q2FsZW5kYXJdIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubnVtYmVyaW5nU3lzdGVtXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMS0wMVQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFogd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1LCB7IGxvY2FsZTogXCJmclwiIH0pIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVaIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIHV0YygpIHtcbiAgICBjb25zdCBbb3B0cywgYXJnc10gPSBsYXN0T3B0cyhhcmd1bWVudHMpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF0gPSBhcmdzO1xuXG4gICAgb3B0cy56b25lID0gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIHJldHVybiBxdWlja0RUKHsgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNEYXRlKGRhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHRzID0gaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU47XG4gICAgaWYgKE51bWJlci5pc05hTih0cykpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0cyxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFpc051bWJlcihtaWxsaXNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBmcm9tTWlsbGlzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0LCBidXQgcmVjZWl2ZWQgYSAke3R5cGVvZiBtaWxsaXNlY29uZHN9IHdpdGggdmFsdWUgJHttaWxsaXNlY29uZHN9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA8IC1NQVhfREFURSB8fCBtaWxsaXNlY29uZHMgPiBNQVhfREFURSkge1xuICAgICAgLy8gdGhpcyBpc24ndCBwZXJmZWN0IGJlY2F1c2UgYmVjYXVzZSB3ZSBjYW4gc3RpbGwgZW5kIHVwIG91dCBvZiByYW5nZSBiZWNhdXNlIG9mIGFkZGl0aW9uYWwgc2hpZnRpbmcsIGJ1dCBpdCdzIGEgc3RhcnRcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiVGltZXN0YW1wIG91dCBvZiByYW5nZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAobWVhbmluZyBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tU2Vjb25kcyhzZWNvbmRzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICd1dGMnIH0pLFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICdsb2NhbCcgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSwgeyB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Qob2JqLCBvcHRzID0ge30pIHtcbiAgICBvYmogPSBvYmogfHwge307XG4gICAgY29uc3Qgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICBpZiAoIXpvbmVUb1VzZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZVRvVXNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9ICFpc1VuZGVmaW5lZChvcHRzLnNwZWNpZmljT2Zmc2V0KVxuICAgICAgICA/IG9wdHMuc3BlY2lmaWNPZmZzZXRcbiAgICAgICAgOiB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0KSxcbiAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKTtcblxuICAgIC8vIGNhc2VzOlxuICAgIC8vIGp1c3QgYSB3ZWVrZGF5IC0+IHRoaXMgd2VlaydzIGluc3RhbmNlIG9mIHRoYXQgd2Vla2RheSwgbm8gd29ycmllc1xuICAgIC8vIChncmVnb3JpYW4gZGF0YSBvciBvcmRpbmFsKSArICh3ZWVrWWVhciBvciB3ZWVrTnVtYmVyKSAtPiBlcnJvclxuICAgIC8vIChncmVnb3JpYW4gbW9udGggb3IgZGF5KSArIG9yZGluYWwgLT4gZXJyb3JcbiAgICAvLyBvdGhlcndpc2UganVzdCB1c2Ugd2Vla3Mgb3Igb3JkaW5hbHMgb3IgZ3JlZ29yaWFuLCBkZXBlbmRpbmcgb24gd2hhdCdzIHNwZWNpZmllZFxuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IChub3JtYWxpemVkLndlZWtkYXkgJiYgIWNvbnRhaW5zR3JlZ29yKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgbGV0IHVuaXRzLFxuICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG4gICAgaWYgKHVzZVdlZWtEYXRhKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRXZWVrVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFdlZWtVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9XZWVrKG9iak5vdyk7XG4gICAgfSBlbHNlIGlmIChjb250YWluc09yZGluYWwpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZE9yZGluYWxVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub09yZGluYWwob2JqTm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgbGV0IGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdW5pdHMpIHtcbiAgICAgIGNvbnN0IHYgPSBub3JtYWxpemVkW3VdO1xuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2KSkge1xuICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdCkge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gZGVmYXVsdFZhbHVlc1t1XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBvYmpOb3dbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZXMgd2UgaGF2ZSBhcmUgaW4gcmFuZ2VcbiAgICBjb25zdCBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHRpbWVcbiAgICBjb25zdCBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IG5vcm1hbGl6ZWQsXG4gICAgICBbdHNGaW5hbCwgb2Zmc2V0RmluYWxdID0gb2JqVG9UUyhncmVnb3JpYW4sIG9mZnNldFByb3Zpcywgem9uZVRvVXNlKSxcbiAgICAgIGluc3QgPSBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogdHNGaW5hbCxcbiAgICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgICBvOiBvZmZzZXRGaW5hbCxcbiAgICAgICAgbG9jLFxuICAgICAgfSk7XG5cbiAgICAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcbiAgICBpZiAobm9ybWFsaXplZC53ZWVrZGF5ICYmIGNvbnRhaW5zR3JlZ29yICYmIG9iai53ZWVrZGF5ICE9PSBpbnN0LndlZWtkYXkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFxuICAgICAgICBcIm1pc21hdGNoZWQgd2Vla2RheVwiLFxuICAgICAgICBgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtub3JtYWxpemVkLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtpbnN0LnRvSVNPKCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IFt2YWxzLCBwYXJzZWRab25lXSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIklTTyA4NjAxXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCdGcmksIDI1IE5vdiAyMDE2IDEzOjIzOjEyICswNjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVJGQzI4MjJEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiUkZDIDI4MjJcIiwgdGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIEhUVFAgaGVhZGVyIGRhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSBIVFRQIGRhdGVzIGFyZSBhbHdheXMgaW4gVVRDLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCB0aGUgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuIEZvciBIVFRQIGRhdGVzLCB0aGlzIGlzIGFsd2F5cyBVVEMsIHNvIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgYHpvbmVgIG9wdGlvbiB0byAndXRjJywgYnV0IHRoaXMgb3B0aW9uIGlzIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbWlsYXIgbWV0aG9kcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSFRUUCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUhUVFBEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSFRUUFwiLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZy5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLiBGb3IgYSB0YWJsZSBvZiB0b2tlbnMgYW5kIHRoZWlyIGludGVycHJldGF0aW9ucywgc2VlIFtoZXJlXShodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9wYXJzaW5nP2lkPXRhYmxlLW9mLXRva2VucykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgdGhlIGxpbmsgYmVsb3cgZm9yIHRoZSBmb3JtYXRzKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHRleHQpIHx8IGlzVW5kZWZpbmVkKGZtdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdHMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgW3ZhbHMsIHBhcnNlZFpvbmUsIHNwZWNpZmljT2Zmc2V0LCBpbnZhbGlkXSA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZnJvbVN0cmluZyh0ZXh0LCBmbXQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbVNRTCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVNRTCh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4cGxhbmF0aW9uPW51bGxdIC0gbG9uZ2VyIGV4cGxhbmF0aW9uLCBtYXkgaW5jbHVkZSBwYXJhbWV0ZXJzIGFuZCBvdGhlciB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IGludmFsaWQgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhIERhdGVUaW1lLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNEYXRlVGltZShvKSB7XG4gICAgcmV0dXJuIChvICYmIG8uaXNMdXhvbkRhdGVUaW1lKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8vIElORk9cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGZyb20gaW52YWxpZCBjYWxlbmRhciBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgMTN0aCBtb250aCBvciBGZWJydWFyeSAzMFxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIERhdGVUaW1lIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEYXRlVGltZSBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2NhbGUgb2YgYSBEYXRlVGltZSwgc3VjaCAnZW4tR0InLiBUaGUgbG9jYWxlIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSB6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERhdGVUaW1lLlxuICAgKiBAdHlwZSB7Wm9uZX1cbiAgICovXG4gIGdldCB6b25lKCkge1xuICAgIHJldHVybiB0aGlzLl96b25lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdGltZSB6b25lLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHpvbmVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB5ZWFyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHllYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy55ZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRheSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmRheSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhvdXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5zZWNvbmQgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayB5ZWFyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMiwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtZZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla051bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrTnVtYmVyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxuICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtkYXkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmRpbmFsIChtZWFuaW5nIHRoZSBkYXkgb2YgdGhlIHllYXIpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XG4gICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgb3JkaW5hbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYykub3JkaW5hbCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBtb250aFNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcInNob3J0XCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vbnRoTG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJsb25nXCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgd2Vla2RheSwgc3VjaCBhcyAnTW9uJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgd2Vla2RheVNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwic2hvcnRcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWVrZGF5TG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcImxvbmdcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm9mZnNldCAvLz0+IC0yNDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gK3RoaXMubyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgb2Zmc2V0TmFtZVNob3J0KCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvZmZzZXROYW1lTG9uZygpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICBmb3JtYXQ6IFwibG9uZ1wiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGlzIHpvbmUncyBvZmZzZXQgZXZlciBjaGFuZ2VzLCBhcyBpbiBhIERTVC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNPZmZzZXRGaXhlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLmlzVW5pdmVyc2FsIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzSW5EU1QoKSB7XG4gICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHsgbW9udGg6IDEgfSkub2Zmc2V0IHx8IHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogNSB9KS5vZmZzZXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuaXNJbkxlYXBZZWFyIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc0luTGVhcFllYXIoKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgbW9udGhcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAzKS5kYXlzSW5Nb250aCAvLz0+IDMxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luTW9udGgoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhpcyBEYXRlVGltZSdzIHllYXJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuZGF5c0luWWVhciAvLz0+IDM2NlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luWWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrc0luV2Vla1llYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIGZvcm1hdHRpbmcgbWV0aG9kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgcmVzb2x2ZWRMb2NhbGVPcHRpb25zKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBGb3JtYXR0ZXIuY3JlYXRlKFxuICAgICAgdGhpcy5sb2MuY2xvbmUob3B0cyksXG4gICAgICBvcHRzXG4gICAgKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7XG4gICAgcmV0dXJuIHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBjYWxlbmRhciB9O1xuICB9XG5cbiAgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBVVEMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgRGF0ZVRpbWUjc2V0Wm9uZX0oJ3V0YycpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gb3B0aW9uYWxseSwgYW4gb2Zmc2V0IGZyb20gVVRDIGluIG1pbnV0ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHRvVVRDKG9mZnNldCA9IDAsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byBgc2V0Wm9uZSgnbG9jYWwnKWBcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBzcGVjaWZpZWQgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2V0dGVyIGtlZXBzIHRoZSB1bmRlcmx5aW5nIHRpbWUgdGhlIHNhbWUgKGFzIGluLCB0aGUgc2FtZSB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBEYXRlVGltZSNwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbH0gYW5kIHtAbGluayBEYXRlVGltZSN0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gYSB6b25lIGlkZW50aWZpZXIuIEFzIGEgc3RyaW5nLCB0aGF0IGNhbiBiZSBhbnkgSUFOQSB6b25lIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudCwgb3IgYSBmaXhlZC1vZmZzZXQgbmFtZSBvZiB0aGUgZm9ybSAnVVRDKzMnLCBvciB0aGUgc3RyaW5ncyAnbG9jYWwnIG9yICd1dGMnLiBZb3UgbWF5IGFsc28gc3VwcGx5IGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIERhdGVUaW1lI1pvbmV9IGNsYXNzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzZXRab25lKHpvbmUsIHsga2VlcExvY2FsVGltZSA9IGZhbHNlLCBrZWVwQ2FsZW5kYXJUaW1lID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdUUyA9IHRoaXMudHM7XG4gICAgICBpZiAoa2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldEd1ZXNzID0gem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgICAgIGNvbnN0IGFzT2JqID0gdGhpcy50b09iamVjdCgpO1xuICAgICAgICBbbmV3VFNdID0gb2JqVG9UUyhhc09iaiwgb2Zmc2V0R3Vlc3MsIHpvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgLSB0aGUgcHJvcGVydGllcyB0byBzZXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgY29uc3QgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgbG9jIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBKdXN0IGEgY29udmVuaWVudCBhbGlhcyBmb3IgcmVjb25maWd1cmUoeyBsb2NhbGUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIFlvdSBjYW4gb25seSBzZXQgdW5pdHMgd2l0aCB0aGlzIG1ldGhvZDsgZm9yIFwic2V0dGluZ1wiIG1ldGFkYXRhLCBzZWUge0BsaW5rIERhdGVUaW1lI3JlY29uZmlndXJlfSBhbmQge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9LlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyBob3VyOiA4LCBtaW51dGU6IDMwIH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHdlZWtkYXk6IDUgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3QodmFsdWVzLCBub3JtYWxpemVVbml0KSxcbiAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPVxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSksXG4gICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyO1xuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGxldCBtaXhlZDtcbiAgICBpZiAoc2V0dGluZ1dlZWtTdHVmZikge1xuICAgICAgbWl4ZWQgPSB3ZWVrVG9HcmVnb3JpYW4oeyAuLi5ncmVnb3JpYW5Ub1dlZWsodGhpcy5jKSwgLi4ubm9ybWFsaXplZCB9KTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbih7IC4uLmdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCAuLi5ub3JtYWxpemVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IHsgLi4udGhpcy50b09iamVjdCgpLCAuLi5ub3JtYWxpemVkIH07XG5cbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBzZXQgdGhlIGRheSBidXQgd2UgZW5kZWQgdXAgb24gYW4gb3ZlcmZsb3cgZGF0ZSxcbiAgICAgIC8vIHVzZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHJpZ2h0IG1vbnRoXG4gICAgICBpZiAoaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpKSB7XG4gICAgICAgIG1peGVkLmRheSA9IE1hdGgubWluKGRheXNJbk1vbnRoKG1peGVkLnllYXIsIG1peGVkLm1vbnRoKSwgbWl4ZWQuZGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbdHMsIG9dID0gb2JqVG9UUyhtaXhlZCwgdGhpcy5vLCB0aGlzLnpvbmUpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHRzLCBvIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXG4gICAqXG4gICAqIEFkZGluZyBob3VycywgbWludXRlcywgc2Vjb25kcywgb3IgbWlsbGlzZWNvbmRzIGluY3JlYXNlcyB0aGUgdGltZXN0YW1wIGJ5IHRoZSByaWdodCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBBZGRpbmcgZGF5cywgbW9udGhzLCBvciB5ZWFycyBzaGlmdHMgdGhlIGNhbGVuZGFyLCBhY2NvdW50aW5nIGZvciBEU1RzIGFuZCBsZWFwIHllYXJzIGFsb25nIHRoZSB3YXkuIFRodXMsIGBkdC5wbHVzKHsgaG91cnM6IDI0IH0pYCBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHRpbWUgdGhhbiBgZHQucGx1cyh7IGRheXM6IDEgfSlgIGlmIHRoZXJlJ3MgYSBEU1Qgc2hpZnQgaW4gYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKDEyMykgLy9+PiBpbiAxMjMgbWlsbGlzZWNvbmRzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IC0xIH0pIC8vfj4gdGhpcyB0aW1lIHllc3RlcmRheVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMyBociwgMTMgbWluXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBwbHVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnRyYWN0IGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcbiAgICogU2VlIHtAbGluayBEYXRlVGltZSNwbHVzfVxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgbWludXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbikubmVnYXRlKCk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB1bml0IG9mIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignbW9udGgnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd3ZWVrJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDMnLCB3ZWVrcyBhbHdheXMgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2hvdXInKS50b0lTT1RpbWUoKTsgLy89PiAnMDU6MDA6MDAuMDAwLTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBvID0ge30sXG4gICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG4gICAgc3dpdGNoIChub3JtYWxpemVkVW5pdCkge1xuICAgICAgY2FzZSBcInllYXJzXCI6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcInF1YXJ0ZXJzXCI6XG4gICAgICBjYXNlIFwibW9udGhzXCI6XG4gICAgICAgIG8uZGF5ID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJob3Vyc1wiOlxuICAgICAgICBvLm1pbnV0ZSA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwibWludXRlc1wiOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbm8gZGVmYXVsdCwgaW52YWxpZCB1bml0cyB0aHJvdyBpbiBub3JtYWxpemVVbml0KClcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwid2Vla3NcIikge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwicXVhcnRlcnNcIikge1xuICAgICAgY29uc3QgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAobWVhbmluZyB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3dlZWsnKS50b0lTTygpOyAvLyA9PiAnMjAxNC0wMy0wOVQyMzo1OTo1OS45OTktMDU6MDAnLCB3ZWVrcyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIGVuZE9mKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkXG4gICAgICA/IHRoaXMucGx1cyh7IFt1bml0XTogMSB9KVxuICAgICAgICAgIC5zdGFydE9mKHVuaXQpXG4gICAgICAgICAgLm1pbnVzKDEpXG4gICAgICA6IHRoaXM7XG4gIH1cblxuICAvLyBPVVRQVVRcblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uLyMvZm9ybWF0dGluZz9pZD10YWJsZS1vZi10b2tlbnMpLlxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2ZyJykudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJykgLy89PiAnMjAxNyBhdnIuIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnLCB7IGxvY2FsZTogXCJmclwiIH0pIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvRm9ybWF0KGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpXG4gICAgICA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIGZvcm1hdE9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZSgnZW4tZ2InKS50b0xvY2FsZVN0cmluZygpOyAvLz0+ICcyMC8wNC8yMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGxvY2FsZTogJ2VuLWdiJyB9KTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyB3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHVyc2RheSwgQXByaWwgMjAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JywgaG91ckN5Y2xlOiAnaDIzJyB9KTsgLy89PiAnMTE6MzInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvTG9jYWxlU3RyaW5nKGZvcm1hdE9wdHMgPSBGb3JtYXRzLkRBVEVfU0hPUlQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgZm9ybWF0T3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcylcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIG1lYW5pbmcgaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVBhcnRzKCk7IC8vPT4gW1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cbiAgICovXG4gIHRvTG9jYWxlUGFydHMob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODMsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNS0wNDowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMjAxNzA0MjJUMjA0NzA1LjMzNS0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTTyh7XG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gZmFsc2UsXG4gICAgaW5jbHVkZU9mZnNldCA9IHRydWUsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBleHQgPSBmb3JtYXQgPT09IFwiZXh0ZW5kZWRcIjtcblxuICAgIGxldCBjID0gdG9JU09EYXRlKHRoaXMsIGV4dCk7XG4gICAgYyArPSBcIlRcIjtcbiAgICBjICs9IHRvSVNPVGltZSh0aGlzLCBleHQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT0RhdGUoeyBmb3JtYXQgPSBcImV4dGVuZGVkXCIgfSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0b0lTT0RhdGUodGhpcywgZm9ybWF0ID09PSBcImV4dGVuZGVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3Mgd2VlayBkYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09XZWVrRGF0ZSgpIC8vPT4gJzE5ODItVzIxLTInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPV2Vla0RhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcImtra2stJ1cnV1ctY1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVQcmVmaXg9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgYFRgIHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0LCBzZWNvbmRzOiAwLCBtaWxsaXNlY29uZHM6IDAgfSkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMDczNDE5LjM2MVonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMDc6MzQ6MTkuMzYxWidcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKHtcbiAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIGluY2x1ZGVPZmZzZXQgPSB0cnVlLFxuICAgIGluY2x1ZGVQcmVmaXggPSBmYWxzZSxcbiAgICBmb3JtYXQgPSBcImV4dGVuZGVkXCIsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgYyA9IGluY2x1ZGVQcmVmaXggPyBcIlRcIiA6IFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgK1xuICAgICAgdG9JU09UaW1lKHRoaXMsIGZvcm1hdCA9PT0gXCJleHRlbmRlZFwiLCBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzLCBpbmNsdWRlT2Zmc2V0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWlpcIiwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy4gVGhlIG91dHB1dCBpcyBhbHdheXMgZXhwcmVzc2VkIGluIEdNVC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1NRTERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdG9JU09EYXRlKHRoaXMsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvU1FMVGltZSh7IGluY2x1ZGVPZmZzZXQgPSB0cnVlLCBpbmNsdWRlWm9uZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGxldCBmbXQgPSBcIkhIOm1tOnNzLlNTU1wiO1xuXG4gICAgaWYgKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgIGZtdCArPSBcIiBcIjtcbiAgICAgIGlmIChpbmNsdWRlWm9uZSkge1xuICAgICAgICBmbXQgKz0gXCJ6XCI7XG4gICAgICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgICAgZm10ICs9IFwiWlpcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIGZtdCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IHRydWUgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TUUwob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKG9wdHMpfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9JU08oKSA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayBEYXRlVGltZSN0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvU2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyAvIDEwMDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7RGF0ZX1cbiAgICovXG4gIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHRvT2JqZWN0KG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG5cbiAgICBjb25zdCBiYXNlID0geyAuLi50aGlzLmMgfTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge0RhdGV9XG4gICAqL1xuICB0b0pTRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTik7XG4gIH1cblxuICAvLyBDT01QQVJFXG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIGFycmF5IG9mIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xuICAgKiBpMi5kaWZmKGkxKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDQzODA3NTAwMDAwIH1cbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XG4gICAqIGkyLmRpZmYoaTEsIFsnbW9udGhzJywgJ2RheXMnLCAnaG91cnMnXSkudG9PYmplY3QoKSAvLz0+IHsgbW9udGhzOiAxNiwgZGF5czogMTksIGhvdXJzOiAwLjc1IH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1ck9wdHMgPSB7IGxvY2FsZTogdGhpcy5sb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogdGhpcy5udW1iZXJpbmdTeXN0ZW0sIC4uLm9wdHMgfTtcblxuICAgIGNvbnN0IHVuaXRzID0gbWF5YmVBcnJheSh1bml0KS5tYXAoRHVyYXRpb24ubm9ybWFsaXplVW5pdCksXG4gICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgbGF0ZXIgPSBvdGhlcklzTGF0ZXIgPyBvdGhlckRhdGVUaW1lIDogdGhpcyxcbiAgICAgIGRpZmZlZCA9IGRpZmYoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBkdXJPcHRzKTtcblxuICAgIHJldHVybiBvdGhlcklzTGF0ZXIgPyBkaWZmZWQubmVnYXRlKCkgOiBkaWZmZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgcmlnaHQgbm93LlxuICAgKiBTZWUge0BsaW5rIERhdGVUaW1lI2RpZmZ9XG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmTm93KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLm5vdygpLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHVudGlsKG90aGVyRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyh0aGlzLCBvdGhlckRhdGVUaW1lKSA6IHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZS5cbiAgICogSGlnaGVyLW9yZGVyIHVuaXRzIG11c3QgYWxzbyBiZSBpZGVudGljYWwgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IHRpbWUgem9uZXMgYXJlICoqaWdub3JlZCoqIGluIHRoaXMgY29tcGFyaXNvbiwgd2hpY2ggY29tcGFyZXMgdGhlICoqbG9jYWwqKiBjYWxlbmRhciB0aW1lLiBVc2Uge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9IHRvIGNvbnZlcnQgb25lIG9mIHRoZSBkYXRlcyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgb3RoZXJEVCBpcyBpbiB0aGUgc2FtZSBjdXJyZW50IGNhbGVuZGFyIGRheVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZShvdGhlckRhdGVUaW1lLCB1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGlucHV0TXMgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICBjb25zdCBhZGp1c3RlZFRvWm9uZSA9IHRoaXMuc2V0Wm9uZShvdGhlckRhdGVUaW1lLnpvbmUsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYWRqdXN0ZWRUb1pvbmUuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gYWRqdXN0ZWRUb1pvbmUuZW5kT2YodW5pdCk7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXG4gICAqIFRvIGNvbXBhcmUganVzdCB0aGUgbWlsbGlzZWNvbmQgdmFsdWVzLCB1c2UgYCtkdDEgPT09ICtkdDJgLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlciAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNWYWxpZCAmJlxuICAgICAgb3RoZXIuaXNWYWxpZCAmJlxuICAgICAgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJlxuICAgICAgdGhpcy56b25lLmVxdWFscyhvdGhlci56b25lKSAmJlxuICAgICAgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aGlzIHRpbWUgcmVsYXRpdmUgdG8gbm93LCBzdWNoIGFzIFwiaW4gdHdvIGRheXNcIi4gQ2FuIG9ubHkgaW50ZXJuYXRpb25hbGl6ZSBpZiB5b3VyXG4gICAqIHBsYXRmb3JtIHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LiBSb3VuZHMgZG93biBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9XCJsb25nXCJdIC0gdGhlIHN0eWxlIG9mIHVuaXRzLCBtdXN0IGJlIFwibG9uZ1wiLCBcInNob3J0XCIsIG9yIFwibmFycm93XCJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHM7IGlmIG9taXR0ZWQsIG9yIGFuIGFycmF5LCB0aGUgbWV0aG9kIHdpbGwgcGljayB0aGUgYmVzdCB1bml0LiBVc2UgYW4gYXJyYXkgb3Igb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBvciBcInNlY29uZHNcIlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJvdW5kPXRydWVdIC0gd2hldGhlciB0byByb3VuZCB0aGUgbnVtYmVycyBpbiB0aGUgb3V0cHV0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFkZGluZz0wXSAtIHBhZGRpbmcgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIGFsbG93cyB5b3UgdG8gcm91bmQgdXAgdGhlIHJlc3VsdCBpZiBpdCBmaXRzIGluc2lkZSB0aGUgdGhyZXNob2xkLiBEb24ndCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCB7cm91bmQ6IGZhbHNlfSBiZWNhdXNlIHRoZSBkZWNpbWFsIG91dHB1dCB3aWxsIGluY2x1ZGUgdGhlIHBhZGRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiaW4gMSBkYXlcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS50b1JlbGF0aXZlKHsgZGF5czogMSB9KSAvLz0+IFwiZGVudHJvIGRlIDEgZFx1MDBFRGFcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRhbnMgMjMgaGV1cmVzXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlKHsgdW5pdDogXCJob3Vyc1wiIH0pIC8vPT4gXCI0OCBob3VycyBhZ29cIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGhvdXJzOiAzNiB9KS50b1JlbGF0aXZlKHsgcm91bmQ6IGZhbHNlIH0pIC8vPT4gXCIxLjUgZGF5cyBhZ29cIlxuICAgKi9cbiAgdG9SZWxhdGl2ZShvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYmFzZSA9IG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHt9LCB7IHpvbmU6IHRoaXMuem9uZSB9KSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcgPyAodGhpcyA8IGJhc2UgPyAtb3B0aW9ucy5wYWRkaW5nIDogb3B0aW9ucy5wYWRkaW5nKSA6IDA7XG4gICAgbGV0IHVuaXRzID0gW1wieWVhcnNcIiwgXCJtb250aHNcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXTtcbiAgICBsZXQgdW5pdCA9IG9wdGlvbnMudW5pdDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnVuaXQpKSB7XG4gICAgICB1bml0cyA9IG9wdGlvbnMudW5pdDtcbiAgICAgIHVuaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkaWZmUmVsYXRpdmUoYmFzZSwgdGhpcy5wbHVzKHBhZGRpbmcpLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbnVtZXJpYzogXCJhbHdheXNcIixcbiAgICAgIHVuaXRzLFxuICAgICAgdW5pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGF0ZSByZWxhdGl2ZSB0byB0b2RheSwgc3VjaCBhcyBcInllc3RlcmRheVwiIG9yIFwibmV4dCBtb250aFwiLlxuICAgKiBPbmx5IGludGVybmF0aW9uYWxpemVzIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5sb2NhbGUgLSBvdmVycmlkZSB0aGUgbG9jYWxlIG9mIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQ7IGlmIG9taXR0ZWQsIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSB1bml0LiBVc2Ugb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIG9yIFwiZGF5c1wiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKCkgLy89PiBcInRvbW9ycm93XCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKFwiZXNcIikucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJcIm1hXHUwMEYxYW5hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRlbWFpblwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqL1xuICB0b1JlbGF0aXZlQ2FsZW5kYXIob3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGRpZmZSZWxhdGl2ZShvcHRpb25zLmJhc2UgfHwgRGF0ZVRpbWUuZnJvbU9iamVjdCh7fSwgeyB6b25lOiB0aGlzLnpvbmUgfSksIHRoaXMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBudW1lcmljOiBcImF1dG9cIixcbiAgICAgIHVuaXRzOiBbXCJ5ZWFyc1wiLCBcIm1vbnRoc1wiLCBcImRheXNcIl0sXG4gICAgICBjYWxlbmRhcnk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1pbiguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1pbik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtYXggb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1heCguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1heCk7XG4gIH1cblxuICAvLyBNSVNDXG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdGlvbnMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGZyb21TdHJpbmdFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlIDEwLzE0LzE5ODNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9TSE9SVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9NRUQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9NRUQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCBPY3QgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9GVUxMKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdUdWVzZGF5LCBPY3RvYmVyIDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9IVUdFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfU0lNUExFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9MT05HX09GRlNFVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9TSU1QTEU7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaSwgMTQgT2N0IDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9XRUVLREFZO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTEwoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfSFVHRTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyaWVuZGx5RGF0ZVRpbWUoZGF0ZVRpbWVpc2gpIHtcbiAgaWYgKERhdGVUaW1lLmlzRGF0ZVRpbWUoZGF0ZVRpbWVpc2gpKSB7XG4gICAgcmV0dXJuIGRhdGVUaW1laXNoO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIGRhdGVUaW1laXNoLnZhbHVlT2YgJiYgaXNOdW1iZXIoZGF0ZVRpbWVpc2gudmFsdWVPZigpKSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiB0eXBlb2YgZGF0ZVRpbWVpc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYFVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6ICR7ZGF0ZVRpbWVpc2h9LCBvZiB0eXBlICR7dHlwZW9mIGRhdGVUaW1laXNofWBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBJbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IEluZm8gZnJvbSBcIi4vaW5mby5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4vem9uZS5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuL3pvbmVzL2ludmFsaWRab25lLmpzXCI7XG5pbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgVkVSU0lPTiA9IFwiMi4zLjBcIjtcblxuZXhwb3J0IHtcbiAgVkVSU0lPTixcbiAgRGF0ZVRpbWUsXG4gIER1cmF0aW9uLFxuICBJbnRlcnZhbCxcbiAgSW5mbyxcbiAgWm9uZSxcbiAgRml4ZWRPZmZzZXRab25lLFxuICBJQU5BWm9uZSxcbiAgSW52YWxpZFpvbmUsXG4gIFN5c3RlbVpvbmUsXG4gIFNldHRpbmdzLFxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjIxJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbicsXG4gICAgICBJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUID0gJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBgdmFsaWRhdGVgIG9wdGlvbiBpbiBgXy50ZW1wbGF0ZWAgdmFyaWFibGUuXG4gICAqXG4gICAqIEZvcmJpZHMgY2hhcmFjdGVycyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlZmluaXRpb246XG4gICAqIC0gXCIoKSxcIiAobW9kaWZpY2F0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCI9XCIgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gXCJbXXt9XCIgKGRlc3RydWN0dXJpbmcgb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIi9cIiAoYmVnaW5uaW5nIG9mIGEgY29tbWVudClcbiAgICogLSB3aGl0ZXNwYWNlXG4gICAqL1xuICB2YXIgcmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMgPSAvWygpPSx7fVxcW1xcXVxcL1xcc10vO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZ1xuICAgICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICAgIDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkXHUwMEU5alx1MDBFMCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW5cbiAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpXG4gICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXFxzL2csICcgJylcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZm9yYmlkZGVuIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gYHZhcmlhYmxlYCwgdG8gcHJldmVudFxuICAgICAgLy8gcG90ZW50aWFsIGNvbW1hbmQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAgICBlbHNlIGlmIChyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycy50ZXN0KHZhcmlhYmxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gYmFzZVRyaW0oc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tIFwianVnZ2wtYXBpXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIEV2ZW50UmVmLCBNYXJrZG93blZpZXcsIFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEZlYXRoZXJJY29uLFxyXG4gIG9wZW5WaWV3LFxyXG4gIHdhaXQsXHJcbn0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgeyBCQ0FQSSB9IGZyb20gXCIuL0FQSVwiO1xyXG5pbXBvcnQgeyBEZWJ1Z2dlciB9IGZyb20gXCJzcmMvRGVidWdnZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwgfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJOb3RlTW9kYWxcIjtcclxuaW1wb3J0IHsgZ2V0Q29kZWJsb2NrQ0IgfSBmcm9tIFwiLi9Db2RlYmxvY2tzXCI7XHJcbmltcG9ydCB7IGNvcHlHbG9iYWxJbmRleCwgY29weUxvY2FsSW5kZXggfSBmcm9tIFwiLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG5pbXBvcnQgeyBqdW1wVG9GaXJzdERpciB9IGZyb20gXCIuL0NvbW1hbmRzL2p1bXBUb0ZpcnN0RGlyXCI7XHJcbmltcG9ydCB7IHRocmVhZCB9IGZyb20gXCIuL0NvbW1hbmRzL3RocmVhZGluZ1wiO1xyXG5pbXBvcnQgeyB3cml0ZUJDc1RvQWxsRmlsZXMsIHdyaXRlQkNUb0ZpbGUgfSBmcm9tIFwiLi9Db21tYW5kcy9Xcml0ZUJDc1wiO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfU0VUVElOR1MsXHJcbiAgRFVDS19JQ09OLFxyXG4gIERVQ0tfSUNPTl9TVkcsXHJcbiAgRFVDS19WSUVXLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbiAgVFJBSUxfSUNPTl9TVkcsXHJcbiAgVFJFRV9WSUVXLFxyXG4gIEFQSV9OQU1FLFxyXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBGaWVsZFN1Z2dlc3RvciB9IGZyb20gXCIuL0ZpZWxkU3VnZ2VzdG9yXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ0FQSUksXHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIE15VmlldyxcclxuICBWaWV3SW5mbyxcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJ1aWxkQ2xvc2VkRywgYnVpbGRNYWluRywgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IFJlbGF0aW9uU3VnZ2VzdG9yIH0gZnJvbSBcIi4vUmVsYXRpb25TdWdnZXN0b3JcIjtcclxuaW1wb3J0IHsgQkNTZXR0aW5nVGFiIH0gZnJvbSBcIi4vU2V0dGluZ3MvQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyB3YWl0Rm9yQ2FjaGUgfSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCBEdWNrc1ZpZXcgZnJvbSBcIi4vVmlld3MvRHVja3NWaWV3XCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHsgZHJhd1RyYWlsIH0gZnJvbSBcIi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBUcmVlVmlldyBmcm9tIFwiLi9WaWV3cy9UcmVlVmlld1wiO1xyXG5pbXBvcnQgeyBCQ1N0b3JlIH0gZnJvbSBcIi4vVmlzdWFsaXNhdGlvbnMvSnVnZ2xcIjtcclxuaW1wb3J0IHsgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzO1xyXG5cclxuICB2aXNpdGVkOiBbc3RyaW5nLCBIVE1MRGl2RWxlbWVudF1bXSA9IFtdO1xyXG5cclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBhY3RpdmVMZWFmQ2hhbmdlOiBFdmVudFJlZiA9IHVuZGVmaW5lZDtcclxuICBsYXlvdXRDaGFuZ2U6IEV2ZW50UmVmID0gdW5kZWZpbmVkO1xyXG5cclxuICBkYjogRGVidWdnZXI7XHJcblxyXG4gIFZJRVdTOiBWaWV3SW5mb1tdO1xyXG5cclxuICBhcGk6IEJDQVBJSTtcclxuICBwcml2YXRlIGJjU3RvcmU6IEJDU3RvcmU7XHJcblxyXG4gIHJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCkge1xyXG4gICAgdGhpcy5hY3RpdmVMZWFmQ2hhbmdlID0gYXBwLndvcmtzcGFjZS5vbihcclxuICAgICAgXCJmaWxlLW9wZW5cIixcclxuICAgICAgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVDaGFuZ2UpIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKTtcclxuICAgICAgICAgIGlmIChhY3RpdmVWaWV3KSBhd2FpdCBhY3RpdmVWaWV3LmRyYXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hY3RpdmVMZWFmQ2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyTGF5b3V0Q2hhbmdlRXZlbnQoKSB7XHJcbiAgICB0aGlzLmxheW91dENoYW5nZSA9IGFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5sYXlvdXRDaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nIGJyZWFkY3J1bWJzIHBsdWdpblwiKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBCQ1NldHRpbmdUYWIodGhpcykpO1xyXG5cclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIodGhpcyk7XHJcblxyXG4gICAgY29uc3QgeyBzZXR0aW5ncyB9ID0gdGhpcztcclxuICAgIGNvbnN0IHtcclxuICAgICAgZmllbGRTdWdnZXN0b3IsXHJcbiAgICAgIGVuYWJsZVJlbGF0aW9uU3VnZ2VzdG9yLFxyXG4gICAgICBvcGVuTWF0cml4T25Mb2FkLFxyXG4gICAgICBvcGVuRHVja09uTG9hZCxcclxuICAgICAgb3BlbkRvd25PbkxvYWQsXHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIHVzZXJIaWVycyxcclxuICAgIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgICBpZiAoZmllbGRTdWdnZXN0b3IpIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBGaWVsZFN1Z2dlc3Rvcih0aGlzKSk7XHJcbiAgICBpZiAoZW5hYmxlUmVsYXRpb25TdWdnZXN0b3IpXHJcbiAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBSZWxhdGlvblN1Z2dlc3Rvcih0aGlzKSk7XHJcblxyXG5cclxuICAgIC8vIE92ZXJyaWRlIG9sZGVyIHZlcnNpb25zIG9mIHRoZXNlIHNldHRpbmdzXHJcbiAgICBpZiAoc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMubGVuZ3RoID09PSAwKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzLnNob3dBbGwgPT09ICdib29sZWFuJykgc2V0dGluZ3Muc2hvd0FsbCA9IHNldHRpbmdzLnNob3dBbGwgPyAnQWxsJyA6ICdTaG9ydGVzdCdcclxuXHJcbiAgICB0aGlzLlZJRVdTID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgcGxhaW46IFwiTWF0cml4XCIsXHJcbiAgICAgICAgdHlwZTogTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IE1hdHJpeFZpZXcsXHJcbiAgICAgICAgb3Blbk9uTG9hZDogb3Blbk1hdHJpeE9uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkR1Y2tcIixcclxuICAgICAgICB0eXBlOiBEVUNLX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IER1Y2tzVmlldyxcclxuICAgICAgICBvcGVuT25Mb2FkOiBvcGVuRHVja09uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkRvd25cIixcclxuICAgICAgICB0eXBlOiBUUkVFX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IFRyZWVWaWV3LFxyXG4gICAgICAgIG9wZW5PbkxvYWQ6IG9wZW5Eb3duT25Mb2FkLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgY29uc3RydWN0b3IsIHR5cGUgfSBvZiB0aGlzLlZJRVdTKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHR5cGUsIChsZWFmKSA9PiBuZXcgY29uc3RydWN0b3IobGVhZiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEljb24oRFVDS19JQ09OLCBEVUNLX0lDT05fU1ZHKTtcclxuICAgIGFkZEljb24oVFJBSUxfSUNPTiwgVFJBSUxfSUNPTl9TVkcpO1xyXG5cclxuICAgIGF3YWl0IHdhaXRGb3JDYWNoZSh0aGlzKTtcclxuICAgIHRoaXMubWFpbkcgPSBhd2FpdCBidWlsZE1haW5HKHRoaXMpO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG5cclxuICAgIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgICAgaWYgKHRoaXMubWFpbkc/Lm5vZGVzKCkubGVuZ3RoIDwgbm9GaWxlcykge1xyXG4gICAgICAgIGF3YWl0IHdhaXQoMzAwMCk7XHJcbiAgICAgICAgdGhpcy5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHsgb3Blbk9uTG9hZCwgdHlwZSwgY29uc3RydWN0b3IgfSBvZiB0aGlzLlZJRVdTKVxyXG4gICAgICAgIGlmIChvcGVuT25Mb2FkKSBhd2FpdCBvcGVuVmlldyh0eXBlLCBjb25zdHJ1Y3Rvcik7XHJcblxyXG4gICAgICBpZiAoc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCk7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJMYXlvdXRDaGFuZ2VFdmVudCgpO1xyXG5cclxuICAgICAgLy8gU291cmNlIGZvciBzYXZlIHNldHRpbmdcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpcHN0ZXJzbW9vdGhpZS9vYnNpZGlhbi1wbHVnaW4tcHJldHRpZXIvYmxvYi9tYWluL3NyYy9tYWluLnRzXHJcbiAgICAgIGNvbnN0IHNhdmVDb21tYW5kRGVmaW5pdGlvbiA9XHJcbiAgICAgICAgYXBwLmNvbW1hbmRzLmNvbW1hbmRzW1wiZWRpdG9yOnNhdmUtZmlsZVwiXTtcclxuICAgICAgY29uc3Qgc2F2ZSA9IHNhdmVDb21tYW5kRGVmaW5pdGlvbj8uY2FsbGJhY2s7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHNhdmUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHNhdmVDb21tYW5kRGVmaW5pdGlvbi5jYWxsYmFjayA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGF3YWl0IHNhdmUoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVTYXZlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IHRoaXMuZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlVmlldykgYXdhaXQgYWN0aXZlVmlldy5kcmF3KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XHJcbiAgICAgICAgaWYgKGxlYWYgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpXHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIGxlYWYudmlldy5wcmV2aWV3TW9kZS5yZXJlbmRlcih0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgdHlwZSwgcGxhaW4sIGNvbnN0cnVjdG9yIH0gb2YgdGhpcy5WSUVXUykge1xyXG4gICAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICAgIGlkOiBgc2hvdy0ke3R5cGV9LXZpZXdgLFxyXG4gICAgICAgIG5hbWU6IGBPcGVuICR7cGxhaW59IFZpZXdgLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGNoZWNrQ2FsbGJhY2s6IGFzeW5jIChjaGVja2luZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoZWNraW5nKSByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSkubGVuZ3RoID09PSAwO1xyXG4gICAgICAgICAgYXdhaXQgb3BlblZpZXcodHlwZSwgY29uc3RydWN0b3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIm9wZW4tdmlzLW1vZGFsXCIsXHJcbiAgICAgIG5hbWU6IFwiT3BlbiBWaXN1YWxpc2F0aW9uIE1vZGFsXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgVmlzTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwibWFuaXB1bGF0ZS1oaWVyYXJjaHktbm90ZXNcIixcclxuICAgICAgbmFtZTogXCJBZGp1c3QgSGllcmFyY2h5IE5vdGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwiUmVmcmVzaC1CcmVhZGNydW1icy1JbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIlJlZnJlc2ggQnJlYWRjcnVtYnMgSW5kZXhcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIlRvZ2dsZS10cmFpbC1pbi1FZGl0JkxQXCIsXHJcbiAgICAgIG5hbWU6IFwiVG9nZ2xlOiBTaG93IFRyYWlsL0dyaWQgaW4gRWRpdCAmIExQIG1vZGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QkNzSW5FZGl0TFBNb2RlID0gIXNldHRpbmdzLnNob3dCQ3NJbkVkaXRMUE1vZGU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwodGhpcyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1DdXJyZW50LUZpbGVcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byBDdXJyZW50IEZpbGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHdyaXRlQkNUb0ZpbGUodGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1BbGwtRmlsZXNcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byAqKkFMTCoqIEZpbGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB3cml0ZUJDc1RvQWxsRmlsZXModGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJsb2NhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBMb2NhbCBJbmRleCB0byB0aGUgY2xpcGJvYXJkXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBjb3B5TG9jYWxJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImdsb2JhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBHbG9iYWwgSW5kZXggdG8gdGhlIGNsaXBib2FyZFwiLFxyXG4gICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gYXdhaXQgY29weUdsb2JhbEluZGV4KHRoaXMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgW1widXBcIiwgXCJkb3duXCIsIFwibmV4dFwiLCBcInByZXZcIl0uZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgaWQ6IGBqdW1wLXRvLWZpcnN0LSR7ZGlyfWAsXHJcbiAgICAgICAgbmFtZTogYEp1bXAgdG8gZmlyc3QgJyR7ZGlyfSdgLFxyXG4gICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBqdW1wVG9GaXJzdERpcih0aGlzLCBkaXIpLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmZvckVhY2goKGZpZWxkOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgICBpZDogYG5ldy1maWxlLXdpdGgtY3Vyci1hcy0ke2ZpZWxkfWAsXHJcbiAgICAgICAgbmFtZTogYENyZWF0ZSBhIG5ldyAnJHtmaWVsZH0nIGZyb20gdGhlIGN1cnJlbnQgbm90ZWAsXHJcbiAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRocmVhZCh0aGlzLCBmaWVsZCksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKFxyXG4gICAgICBhZGRGZWF0aGVySWNvbihcInR2XCIpIGFzIHN0cmluZyxcclxuICAgICAgXCJCcmVhZGNydW1icyBWaXN1YWxpc2F0aW9uXCIsXHJcbiAgICAgICgpID0+IG5ldyBWaXNNb2RhbCh0aGlzKS5vcGVuKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFxyXG4gICAgICBcImJyZWFkY3J1bWJzXCIsXHJcbiAgICAgIGdldENvZGVibG9ja0NCKHRoaXMpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoanVnZ2xQbHVnaW4pIHtcclxuICAgICAgdGhpcy5iY1N0b3JlID0gbmV3IEJDU3RvcmUodGhpcy5tYWluRywgYXBwLm1ldGFkYXRhQ2FjaGUpO1xyXG4gICAgICBqdWdnbFBsdWdpbi5yZWdpc3RlclN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGkgPSBuZXcgQkNBUEkodGhpcyk7XHJcbiAgICAvLyBSZWdpc3RlciBBUEkgdG8gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXHJcbiAgICAod2luZG93W0FQSV9OQU1FXSA9IHRoaXMuYXBpKSAmJlxyXG4gICAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IGRlbGV0ZSB3aW5kb3dbQVBJX05BTUVdKTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZVRZUEVWaWV3KHR5cGU6IHN0cmluZyk6IE15VmlldyB8IG51bGwge1xyXG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpcy5WSUVXUy5maW5kKCh2aWV3KSA9PiB2aWV3LnR5cGUgPT09IHR5cGUpO1xyXG4gICAgY29uc3QgbGVhdmVzID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSk7XHJcbiAgICBpZiAobGVhdmVzICYmIGxlYXZlcy5sZW5ndGggPj0gMSkge1xyXG4gICAgICBjb25zdCB7IHZpZXcgfSA9IGxlYXZlc1swXTtcclxuICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcikgcmV0dXJuIHZpZXc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGxvYWRTZXR0aW5ncyA9IGFzeW5jICgpID0+XHJcbiAgKHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKFxyXG4gICAge30sXHJcbiAgICBERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpXHJcbiAgKSk7XHJcblxyXG4gIHNhdmVTZXR0aW5ncyA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblxyXG4gIG9udW5sb2FkKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJ1bmxvYWRpbmdcIik7XHJcbiAgICB0aGlzLlZJRVdTLmZvckVhY2goYXN5bmMgKHZpZXcpID0+IHtcclxuICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlldy50eXBlKS5mb3JFYWNoKChsZWFmKSA9PiB7XHJcbiAgICAgICAgbGVhZi5kZXRhY2goKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZpc2l0ZWQuZm9yRWFjaCgodmlzaXQpID0+IHZpc2l0WzFdLnJlbW92ZSgpKTtcclxuICAgIGlmICh0aGlzLmJjU3RvcmUpIHtcclxuICAgICAgY29uc3QganVnZ2xQbHVnaW4gPSBnZXRQbHVnaW4oYXBwKTtcclxuICAgICAgaWYgKGp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGp1Z2dsUGx1Z2luLnJlbW92ZVN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXJUYWdzLCBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IENBVF9EQU5HTElORyA9ICdkYW5nbGluZyc7XG5jb25zdCBDT1JFX1NUT1JFX0lEID0gJ2NvcmUnO1xuY2xhc3MgVml6SWQge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdG9yZUlkID0gc3RvcmVJZDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnN0b3JlSWR9OiR7dGhpcy5pZH1gO1xuICAgIH1cbiAgICB0b0lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUlkKGlkKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gaWQuc3BsaXQoJzonKTtcbiAgICAgICAgY29uc3Qgc3RvcmVJZCA9IHNwbGl0WzBdO1xuICAgICAgICBjb25zdCBfaWQgPSBzcGxpdC5zbGljZSgxKS5qb2luKCc6Jyk7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoX2lkLCBzdG9yZUlkKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21Ob2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZpeklkLmZyb21JZChub2RlLmlkKCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU5vZGVzKG5vZGVzKSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5tYXAoKG4pID0+IFZpeklkLmZyb21Ob2RlKG4pKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21GaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaXpJZChmaWxlLm5hbWUsICdjb3JlJyk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0lkKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoaWQsIHN0b3JlSWQpLnRvSWQoKTtcbiAgICB9XG59XG5jb25zdCBfcGFyc2VUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLnRhZ3NcbiAgICAgICAgLm1hcCgodGFnKSA9PiB7XG4gICAgICAgIHRhZyA9IHRhZy5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgaFNwbGl0ID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGhTcGxpdCkge1xuICAgICAgICAgICAgY29uc3QgaFRhZyA9IGhTcGxpdC5zbGljZSgwLCBwYXJzZUludChpKSArIDEpLmpvaW4oJy0nKTtcbiAgICAgICAgICAgIHRhZ3MucHVzaChgdGFnLSR7aFRhZ31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFncztcbiAgICB9KSk7XG59O1xuY29uc3QgZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uIChmaWxlLCBtZXRhZGF0YUNhY2hlKSB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICAgICAgICBpZiAoWydwbmcnLCAnanBnJywgJ2pwZWcnLCAnZ2lmJywgJ2JtcCcsICdzdmcnLCAndGlmZiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpbWFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFsnbXAzJywgJ3dlYm0nLCAnd2F2JywgJ200YScsICdvZ2cnLCAnM2dwJywgJ2ZsYWMnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnYXVkaW8nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChbJ21wNCcsICd3ZWJtJywgJ29ndiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCd2aWRlbycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbGUuZXh0ZW5zaW9uID09PSAncGRmJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdwZGYnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIHJlcGxhY2VkIGJ5IHRoZSAncGF0aCcgZGF0YSBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGlmICghKGZpbGUucGFyZW50Lm5hbWUgPT09ICcvJyB8fCBmaWxlLnBhcmVudC5uYW1lID09PSAnJykpIHtcbiAgICAgICAgLy8gICBjbGFzc2VzLnB1c2goYGZvbGRlci0ke2ZpbGUucGFyZW50Lm5hbWVcbiAgICAgICAgLy8gICAgICAgLnJlcGxhY2UoJyAnLCAnXycpfWApO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIGNsYXNzZXMucHVzaCgncm9vdCcpO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdub3RlJyk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlPy5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgIGlmICgnaW1hZ2UnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCd0YWdzJyBpbiBjYWNoZS5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gcGFyc2VGcm9udE1hdHRlclRhZ3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3ModGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgnY3NzY2xhc3MnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6ZXMgPSBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkoY2FjaGUuZnJvbnRtYXR0ZXIsICdjc3NjbGFzcycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenplcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLmNsYXp6ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhY2hlPy50YWdzKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3MoY2FjaGUudGFncy5tYXAoKHQpID0+IHQudGFnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBbQ0FUX0RBTkdMSU5HXTtcbn07XG5jb25zdCBub2RlRnJvbUZpbGUgPSBhc3luYyBmdW5jdGlvbiAoZmlsZSwgcGx1Z2luLCBzZXR0aW5ncywgaWQpIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICAgIGlkID0gVml6SWQudG9JZChmaWxlLm5hbWUsIENPUkVfU1RPUkVfSUQpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IHBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnID8gZmlsZS5iYXNlbmFtZSA6IGZpbGUubmFtZTtcbiAgICBjb25zdCBjbGFzc2VzID0gZ2V0Q2xhc3NlcyhmaWxlLCBwbHVnaW4uYXBwLm1ldGFkYXRhQ2FjaGUpLmpvaW4oJyAnKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aDogZmlsZS5wYXRoLFxuICAgIH07XG4gICAgaWYgKFsncG5nJywgJ2pwZycsICdqcGVnJywgJ2dpZicsICdibXAnLCAnc3ZnJywgJ3RpZmYnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRhdGFbJ3Jlc291cmNlX3VybCddID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoZmlsZS5wYXRoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHsgfVxuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucmVhZENvbnRlbnQgJiYgZmlsZS5leHRlbnNpb24gPT0gJ21kJykge1xuICAgICAgICBkYXRhWydjb250ZW50J10gPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgfVxuICAgIGNvbnN0IGZyb250bWF0dGVyID0gY2FjaGU/LmZyb250bWF0dGVyO1xuICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICBPYmplY3Qua2V5cyhmcm9udG1hdHRlcikuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCEoayA9PT0gJ3Bvc2l0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUZpZWxkID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cmwuIHRocm93cyBlcnJvciBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW1hZ2VGaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gaW1hZ2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoaW1hZ2VGaWVsZCl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5jb25zdCBub2RlRGFuZ2xpbmcgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpZDogVml6SWQudG9JZChwYXRoLCBDT1JFX1NUT1JFX0lEKSxcbiAgICAgICAgICAgIG5hbWU6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzZXM6ICdkYW5nbGluZycsXG4gICAgfTtcbn07XG5jb25zdCB3aWtpbGlua1JlZ2V4ID0gJ1xcXFxbXFxcXFsoW15cXFxcXVxcXFxyXFxcXG5dKz8pXFxcXF1cXFxcXSc7XG5jb25zdCBuYW1lUmVnZXggPSAnW15cXFxcV1xcXFxkXVxcXFx3Kic7XG5jb25zdCByZWdleEVzY2FwZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xufTtcbmNvbnN0IHBhcnNlVHlwZWRMaW5rID0gZnVuY3Rpb24gKGxpbmssIGxpbmUsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgc29tZXRoaW5nIHNwZWNpZmljIEkgdXNlLCBidXQgc2hvdWxkbid0IGtlZXAgYmVpbmcgaW4gdGhpcyByZXBvLlxuICAgIGNvbnN0IHJlZ2V4UHVibGlzaGVkSW4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleEVzY2FwZSh0eXBlZExpbmtQcmVmaXgpfSAocHVibGlzaGVkSW4pIChcXFxcZFxcXFxkXFxcXGRcXFxcZCkgKCR7d2lraWxpbmtSZWdleH0sPyAqKSskYCk7XG4gICAgY29uc3QgbWF0Y2hQSSA9IHJlZ2V4UHVibGlzaGVkSW4uZXhlYyhsaW5lKTtcbiAgICBpZiAoIShtYXRjaFBJID09PSBudWxsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3M6ICd0eXBlLXB1Ymxpc2hlZEluJyxcbiAgICAgICAgICAgIGlzSW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICB5ZWFyOiBtYXRjaFBJWzJdLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwdWJsaXNoZWRJbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBJbnR1aXRpb246IFN0YXJ0IHdpdGggdGhlIHR5cGVkIGxpbmsgcHJlZml4LiBUaGVuIGEgbmVvNGogbmFtZSAobmFtZVJlZ2V4KS5cbiAgICAvLyBUaGVuIG9uZSBvciBtb3JlIG9mIHRoZSB3aWtpbGluayBncm91cDogd2lraWxpbmsgcmVnZXggc2VwYXJhdGVkIGJ5IG9wdGlvbmFsIGNvbW1hIGFuZCBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4RXNjYXBlKHR5cGVkTGlua1ByZWZpeCl9ICgke25hbWVSZWdleH0pICgke3dpa2lsaW5rUmVnZXh9LD8gKikrJGApO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKTtcbiAgICBjb25zdCBzcGxpdExpbmsgPSBsaW5rLm9yaWdpbmFsLnNwbGl0KCd8Jyk7XG4gICAgbGV0IGFsaWFzID0gbnVsbDtcbiAgICBpZiAoc3BsaXRMaW5rLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYWxpYXMgPSBzcGxpdExpbmsuc2xpY2UoMSkuam9pbigpLnNsaWNlKDAsIC0yKTtcbiAgICB9XG4gICAgaWYgKCEobWF0Y2ggPT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbGFzczogYHR5cGUtJHttYXRjaFsxXX1gLFxuICAgICAgICAgICAgaXNJbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGFsaWFzOiBhbGlhcyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbmNvbnN0IHBhcnNlUmVmQ2FjaGUgPSBmdW5jdGlvbiAocmVmLCBjb250ZW50LCBpZCwgc291cmNlLCB0YXJnZXQsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W3JlZi5wb3NpdGlvbi5zdGFydC5saW5lXTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbnRleHQ6IGxpbmUsXG4gICAgICAgIGVkZ2VDb3VudDogMSxcbiAgICB9O1xuICAgIGNvbnN0IHNwbGl0TGluayA9IHJlZi5vcmlnaW5hbC5zcGxpdCgnfCcpO1xuICAgIGlmIChzcGxpdExpbmsubGVuZ3RoID4gMSkge1xuICAgICAgICBkYXRhWydhbGlhcyddID0gc3BsaXRMaW5rLnNsaWNlKDEpLmpvaW4oKS5zbGljZSgwLCAtMik7XG4gICAgfVxuICAgIGxldCBjbGFzc2VzID0gJyc7XG4gICAgY29uc3QgdHlwZWRMaW5rID0gcGFyc2VUeXBlZExpbmsocmVmLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xuICAgIGlmICh0eXBlZExpbmsgPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NlcyA9IGAke2NsYXNzZXN9IGlubGluZWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0geyAuLi50eXBlZExpbmsucHJvcGVydGllcywgLi4uZGF0YSB9O1xuICAgICAgICBjbGFzc2VzID0gYCR7Y2xhc3Nlc30gJHt0eXBlZExpbmsuY2xhc3N9YDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5cbmNvbnN0IGdldFBsdWdpbiA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCdqdWdnbCcgaW4gYXBwLnBsdWdpbnMucGx1Z2lucykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBhcHAucGx1Z2lucy5wbHVnaW5zWydqdWdnbCddO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCB7IFZpeklkLCBnZXRDbGFzc2VzLCBnZXRQbHVnaW4sIG5vZGVEYW5nbGluZywgbm9kZUZyb21GaWxlLCBwYXJzZVJlZkNhY2hlLCBwYXJzZVR5cGVkTGluayB9O1xuIiwgIi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGNvbW1vbmx5IHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2lucy5cclxuICogQG1vZHVsZSBvYnNpZGlhbi1jb21tdW5pdHktbGliXHJcbiAqL1xyXG5pbXBvcnQgKiBhcyBmZWF0aGVyIGZyb20gXCJmZWF0aGVyLWljb25zXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIE1hcmtkb3duUmVuZGVyZXIsIE1hcmtkb3duVmlldywgTW9kYWwsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgcmVxdWVzdCwgVEZpbGUsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbi8qKlxyXG4gKiBZb3UgY2FuIGF3YWl0IHRoaXMgRnVuY3Rpb24gdG8gZGVsYXkgZXhlY3V0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gbXNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0KGRlbGF5KSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcclxufVxyXG4vKipcclxuICogQWRkcyBhbGwgb2ZmaWNpYWwgRmVhdGhlciBJY29ucyB0byBPYnNpZGlhbi5cclxuICogaHR0cHM6Ly9mZWF0aGVyaWNvbnMuY29tL1xyXG4gKlxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKlxyXG4gKiBAZGVwcmVjYXRlZCBBcyBvZiBPYnNpZGlhbiAwLjEzLjI3IHRoaXMgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYmVjYXVzZSBPYnNpZGlhbiBzaGlwcyB3aXRoIGBsdWNpZGVgLCBhIG1haW50YWluZWQgZm9yayBvZiBmZWF0aGVyLiAoaHR0cHM6Ly9sdWNpZGUuZGV2LylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxGZWF0aGVySWNvbnMoYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBPYmplY3QudmFsdWVzKGZlYXRoZXIuaWNvbnMpLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgICBjb25zdCBzdmcgPSBpLnRvU3ZnKGF0dHIpO1xyXG4gICAgICAgIGFkZEljb24oYGZlYXRoZXItJHtpLm5hbWV9YCwgc3ZnKTtcclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGEgc3BlY2lmaWMgRmVhdGhlciBJY29uIHRvIE9ic2lkaWFuLlxyXG4gKlxyXG4gKiBAcGFyYW0gbmFtZSBvZmZpY2lhbCBOYW1lIG9mIHRoZSBJY29uIChodHRwczovL2ZlYXRoZXJpY29ucy5jb20vKVxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJY29uIG5hbWVcclxuICpcclxuICogQGRlcHJlY2F0ZWQgQXMgb2YgT2JzaWRpYW4gMC4xMy4yNyB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIGJlY2F1c2UgT2JzaWRpYW4gc2hpcHMgd2l0aCBgbHVjaWRlYCwgYSBtYWludGFpbmVkIGZvcmsgb2YgZmVhdGhlci4gKGh0dHBzOi8vbHVjaWRlLmRldi8pXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkRmVhdGhlckljb24obmFtZSwgYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBpZiAoZmVhdGhlci5pY29uc1tuYW1lXSkge1xyXG4gICAgICAgIGNvbnN0IGljb25OYW1lID0gYGZlYXRoZXItJHtuYW1lfWA7XHJcbiAgICAgICAgYWRkSWNvbihpY29uTmFtZSwgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZyhhdHRyKSk7XHJcbiAgICAgICAgcmV0dXJuIGljb25OYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYFRoaXMgSWNvbiAoJHtuYW1lfSkgZG9lc24ndCBleGlzdCBpbiB0aGUgRmVhdGhlciBMaWJyYXJ5LmApO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDb252ZXJ0IGEgYmFzZTY0IFN0cmluZyB0byBhbiBBcnJheUJ1ZmZlci5cclxuICogWW91IGNhbiB0aGVuIHVzZSB0aGUgQXJyYXlCdWZmZXIgdG8gc2F2ZSB0aGUgYXNzZXQgdG8gZGlzay5cclxuICpcclxuICogQHBhcmFtIGJhc2U2NCBiYXNlNjQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cclxuICogQHJldHVybnMgQXJyYXlCdWZmZXJcclxuICogQGRlcHJlY2F0ZWQgT2JzaWRpYW4gb2ZmZXJzIGl0J3Mgb3duIG1ldGhvZCBhcyBvZiAwLjE0LjVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xyXG4gICAgY29uc3QgYmluYXJ5X3N0cmluZyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlfc3RyaW5nLmxlbmd0aDtcclxuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlfc3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgYW4gdW5kb2N1bWVudGVkIEFQSSBvZiBPYnNpZGlhbi5cclxuICpcclxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBGaWxlbmFtZSBmb3IgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBmb3JtYXQgVGhlIEZpbGVmb3JtYXQgb2YgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlIFRoZSBTb3VyY2VmaWxlIGZyb20gd2hlcmUgdGhlIEF0dGFjaG1lbnQgZ2V0cyBhZGRlZCwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgQXR0YWNobWVudCBGb2xkZXIgbWlnaHQgYmUgZGlmZmVyZW50IGJhc2VkIG9uIHdoZXJlIGl0IGdldHMgaW5zZXJ0ZWQuXHJcbiAqIEByZXR1cm5zIFRoZSBBdHRhY2htZW50IFBhdGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoZmlsZU5hbWUsIGZvcm1hdCwgc291cmNlRmlsZSkge1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgZm9ybWF0LCBzb3VyY2VGaWxlKTtcclxufVxyXG4vKipcclxuICogQ29weSBgY29udGVudGAgdG8gdGhlIHVzZXJzIGNsaXBib2FyZC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gYmUgY29waWVkIHRvIGNsaXBib2FyZC5cclxuICogQHBhcmFtIHsoKSA9PiBhbnl9IHN1Y2Nlc3MgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIHRleHQgaXMgc3VjY2Vzc2Z1bGx5IGNvcGllZC4gRGVmYXVsdCB0aHJvd3MgYSBuZXcgYE5vdGljZWBcclxuICogQHBhcmFtIHsocmVhc29uPykgPT4gYW55fSBmYWlsdXJlIFRoZSBjYWxsYmFjayB0byBydW4gd2hlbiB0ZXh0IHdhcyBub3QgYWJsZSB0byBiZSBjb3BpZWQuIERlZmF1bHQgdGhyb3dzIGEgbmV3IGBOb3RpY2VgLCBhbmQgY29uc29sZSBsb2dzIHRoZSBlcnJvci5gXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weShjb250ZW50LCBzdWNjZXNzID0gKCkgPT4gbmV3IE5vdGljZShcIkNvcGllZCB0byBjbGlwYm9hcmRcIiksIGZhaWx1cmUgPSAocmVhc29uKSA9PiB7XHJcbiAgICBuZXcgTm90aWNlKFwiQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkXCIpO1xyXG4gICAgY29uc29sZS5sb2coeyByZWFzb24gfSk7XHJcbn0pIHtcclxuICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnQpLnRoZW4oc3VjY2VzcywgZmFpbHVyZSk7XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGFuIGVkaXRvciwgY2hlY2sgaWYgc29tZXRoaW5nIGlzIHNlbGVjdGVkIGFuZCByZXR1cm4gdGhhdCBzZWxlY3Rpb24sIG90aGVyd2lzZSByZXR1cm4gdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBlZGl0b3JcclxuICogQHBhcmFtICB7RWRpdG9yfSBlZGl0b3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Gcm9tRWRpdG9yKGVkaXRvcikge1xyXG4gICAgaWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpKVxyXG4gICAgICAgIHJldHVybiBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGVkaXRvci5nZXRWYWx1ZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhbmQgcmV0dXJuIHRoYXQgc2VsZWN0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcGFyYW0gIHtib29sZWFufSBbY2FjaGVkPXRydWVdIFVzZSBgY2FjaGVkUmVhZGAgb3IgYHJlYWRgLiBgY2FjaGVkUmVhZGAgYnkgZGVmYXVsdC5cclxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IGBudWxsYCBpZiBub3QgZm9jdXNzZWQgb24gYSBtYXJrZG93biBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uRnJvbUN1cnJGaWxlKGNhY2hlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHRleHQgPSAoX2EgPSB3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpO1xyXG4gICAgaWYgKHRleHQpXHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjdGl2ZUZpbGVDb250ZW50KGNhY2hlZCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBub3RlTmFtZWAgaXMgdGhlIG5hbWUgb2YgYSBub3RlIHRoYXQgZXhpc3RzIGluIHRoZSB2YXVsdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBub3RlTmFtZSBCYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBzZWFyY2ggZm9yLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtzb3VyY2VQYXRoPVwiXCJdIE9wdGlvbmFsIGZpbGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS4gRGVmYXVsdCBpcyB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcmV0dXJucyBib29sZWFuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJblZhdWx0ID0gKG5vdGVOYW1lLCBzb3VyY2VQYXRoID0gXCJcIikgPT4gISFhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlTmFtZSwgc291cmNlUGF0aCk7XHJcbi8qKlxyXG4gKiBXaGVuIGhvdmVyaW5nIGEgbGluayBnb2luZyB0byBgdG9gLCBzaG93IHRoZSBPYnNpZGlhbiBob3Zlci1wcmV2aWV3IG9mIHRoYXQgbm90ZS5cclxuICpcclxuICogWW91IHByb2JhYmx5IGhhdmUgdG8gaG9sZCBkb3duIGBDdHJsYCB3aGVuIGhvdmVyaW5nIHRoZSBsaW5rIGZvciB0aGUgcHJldmlldyB0byBhcHBlYXIhXHJcbiAqIEBwYXJhbSAge01vdXNlRXZlbnR9IGV2ZW50XHJcbiAqIEBwYXJhbSAge1lvdXJWaWV3fSB2aWV3IFRoZSB2aWV3IHdpdGggdGhlIGxpbmsgYmVpbmcgaG92ZXJlZFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIFRoZSBiYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBwcmV2aWV3LlxyXG4gKiBAdGVtcGxhdGUgWW91clZpZXcgVGhlIFZpZXdUeXBlIG9mIHlvdXIgdmlld1xyXG4gKiBAcmV0dXJucyB2b2lkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaG92ZXJQcmV2aWV3KGV2ZW50LCB2aWV3LCB0bykge1xyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBldmVudC50YXJnZXQ7XHJcbiAgICBhcHAud29ya3NwYWNlLnRyaWdnZXIoXCJob3Zlci1saW5rXCIsIHtcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBzb3VyY2U6IHZpZXcuZ2V0Vmlld1R5cGUoKSxcclxuICAgICAgICBob3ZlclBhcmVudDogdmlldyxcclxuICAgICAgICB0YXJnZXRFbCxcclxuICAgICAgICBsaW5rdGV4dDogdG8sXHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hcmtkb3duIG5vdGUgbmFtZWQgYG5ld05hbWVgIGluIHRoZSB1c2VyJ3MgcHJlZmZlcmVkIG5ldy1ub3RlLWZvbGRlci5cclxuICogQHBhcmFtICB7c3RyaW5nfSBuZXdOYW1lIE5hbWUgb2YgbmV3IG5vdGUgKHdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtICB7c3RyaW5nfSBbY3VyckZpbGVQYXRoPVwiXCJdIEZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBub3RlLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBmaWxlLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxURmlsZT59IG5ldyBURmlsZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld01ETm90ZShuZXdOYW1lLCBjdXJyRmlsZVBhdGggPSBcIlwiKSB7XHJcbiAgICBjb25zdCBuZXdGaWxlRm9sZGVyID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGVQYXRoKS5wYXRoO1xyXG4gICAgY29uc3QgbmV3RmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVGb2xkZXJ9JHtuZXdGaWxlRm9sZGVyID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIn0ke2FkZE1EKG5ld05hbWUpfWApO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUobmV3RmlsZVBhdGgsIFwiXCIpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGQgJy5tZCcgdG8gYG5vdGVOYW1lYCBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRoICcubWQnIG9uIHRoZSBlbmQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWRkTUQgPSAobm90ZU5hbWUpID0+IHtcclxuICAgIHJldHVybiBub3RlTmFtZS5tYXRjaCgvXFwuTUQkfFxcLm1kJC9tKSA/IG5vdGVOYW1lIDogbm90ZU5hbWUgKyBcIi5tZFwiO1xyXG59O1xyXG4vKipcclxuICogU3RyaXAgJy5tZCcgb2ZmIHRoZSBlbmQgb2YgYSBub3RlIG5hbWUgdG8gZ2V0IGl0cyBiYXNlbmFtZS5cclxuICpcclxuICogV29ya3Mgd2l0aCB0aGUgZWRnZWNhc2Ugd2hlcmUgYSBub3RlIGhhcyAnLm1kJyBpbiBpdHMgYmFzZW5hbWU6IGBPYnNpZGlhbi5tZC5tZGAsIGZvciBleGFtcGxlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRob3V0ICcubWQnXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RyaXBNRCA9IChub3RlTmFtZSkgPT4ge1xyXG4gICAgaWYgKG5vdGVOYW1lLm1hdGNoKC9cXC5NRCR8XFwubWQkL20pKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vdGVOYW1lLnNwbGl0KC9cXC5NRCR8XFwubWQkL20pLnNsaWNlKDAsIC0xKS5qb2luKFwiLm1kXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBub3RlTmFtZTtcclxufTtcclxuLyoqXHJcbiAqIFdoZW4gY2xpY2tpbmcgYSBsaW5rLCBjaGVjayBpZiB0aGF0IG5vdGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgbGVhZiwgYW5kIHN3aXRjaCB0byB0aGF0IGxlYWYsIGlmIHNvLiBPdGhlcndpc2UsIG9wZW4gdGhlIG5vdGUgaW4gYSBuZXcgcGFuZS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkZXN0IE5hbWUgb2Ygbm90ZSB0byBvcGVuLiBJZiB5b3Ugd2FudCB0byBvcGVuIGEgbm9uLW1kIG5vdGUsIGJlIHN1cmUgdG8gYWRkIHRoZSBmaWxlIGV4dGVuc2lvbi5cclxuICogQHBhcmFtICB7TW91c2VFdmVudH0gZXZlbnRcclxuICogQHBhcmFtICB7e2NyZWF0ZU5ld0ZpbGU6Ym9vbGVhbn19IFtvcHRpb25zPXtjcmVhdGVOZXdGaWxlOnRydWV9XSBXaGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYGRlc3RgIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4gSWYgYGZhbHNlYCwgc2ltcGx5IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbi5cclxuICogQHJldHVybnMgUHJvbWlzZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCwgb3B0aW9ucyA9IHsgY3JlYXRlTmV3RmlsZTogdHJ1ZSB9KSB7XHJcbiAgICBjb25zdCB7IHdvcmtzcGFjZSB9ID0gYXBwO1xyXG4gICAgbGV0IGRlc3RGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVzdCwgXCJcIik7XHJcbiAgICAvLyBJZiBkZXN0IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcclxuICAgIGlmICghZGVzdEZpbGUgJiYgb3B0aW9ucy5jcmVhdGVOZXdGaWxlKSB7XHJcbiAgICAgICAgZGVzdEZpbGUgPSBhd2FpdCBjcmVhdGVOZXdNRE5vdGUoZGVzdCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghZGVzdEZpbGUgJiYgIW9wdGlvbnMuY3JlYXRlTmV3RmlsZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgb3BlblxyXG4gICAgY29uc3QgbGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlbiA9IFtdO1xyXG4gICAgLy8gRm9yIGFsbCBvcGVuIGxlYXZlcywgaWYgdGhlIGxlYXZlJ3MgYmFzZW5hbWUgaXMgZXF1YWwgdG8gdGhlIGxpbmsgZGVzdGluYXRpb24sIHJhdGhlciBhY3RpdmF0ZSB0aGF0IGxlYWYgaW5zdGVhZCBvZiBvcGVuaW5nIGl0IGluIHR3byBwYW5lc1xyXG4gICAgd29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gKF9hID0gbGVhZi52aWV3KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsZTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgJiYgZmlsZS5iYXNlbmFtZSArIFwiLlwiICsgZmlsZS5leHRlbnNpb24gPT09IGRlc3QpIHtcclxuICAgICAgICAgICAgICAgIGxlYXZlc1dpdGhEZXN0QWxyZWFkeU9wZW4ucHVzaChsZWFmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gUmF0aGVyIHN3aXRjaCB0byBpdCBpZiBpdCBpcyBvcGVuXHJcbiAgICBpZiAobGVhdmVzV2l0aERlc3RBbHJlYWR5T3Blbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlblswXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgbW9kZSA9IGFwcC52YXVsdC5nZXRDb25maWcoXCJkZWZhdWx0Vmlld01vZGVcIik7XHJcbiAgICAgICAgY29uc3QgbGVhZiA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShcIk1ldGFcIilcclxuICAgICAgICAgICAgPyB3b3Jrc3BhY2Uuc3BsaXRBY3RpdmVMZWFmKClcclxuICAgICAgICAgICAgOiB3b3Jrc3BhY2UuZ2V0VW5waW5uZWRMZWFmKCk7XHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgYXdhaXQgbGVhZi5vcGVuRmlsZShkZXN0RmlsZSwgeyBhY3RpdmU6IHRydWUsIG1vZGUgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGEgbGlzdCBvZiByZXNvbHZlZCBsaW5rcyBmcm9tIGFwcC5tZXRhZGF0YUNhY2hlLCBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gXHJcbiAqIEBwYXJhbSAge1Jlc29sdmVkTGlua3N9IHJlc29sdmVkTGlua3NcclxuICogQHBhcmFtICB7c3RyaW5nfSBmcm9tIE5vdGUgbmFtZSB3aXRoIGxpbmsgbGVhdmluZyAoV2l0aCBvciB3aXRob3V0ICcubWQnKVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIE5vdGUgbmFtZSB3aXRoIGxpbmsgYXJyaXZpbmcgKFdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0ZWQ9dHJ1ZV0gT25seSBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gLiBJZiBub3QgZGlyZWN0ZWQsIGNoZWNrIGluIGJvdGggZGlyZWN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2VkKHJlc29sdmVkTGlua3MsIGZyb20sIHRvLCBkaXJlY3RlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYSwgX2I7XHJcbiAgICBmcm9tID0gYWRkTUQoZnJvbSk7XHJcbiAgICB0byA9IGFkZE1EKHRvKTtcclxuICAgIGNvbnN0IGZyb21UbyA9IChfYSA9IHJlc29sdmVkTGlua3NbZnJvbV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXNPd25Qcm9wZXJ0eSh0byk7XHJcbiAgICBpZiAoIWZyb21UbyAmJiAhZGlyZWN0ZWQpIHtcclxuICAgICAgICBjb25zdCB0b0Zyb20gPSAoX2IgPSByZXNvbHZlZExpbmtzW3RvXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhhc093blByb3BlcnR5KGZyb20pO1xyXG4gICAgICAgIHJldHVybiB0b0Zyb207XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZyb21UbztcclxufVxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIGxpbmsgYGZyb21gIFx1MjE5MiBgdG9gIGlzIHJlc29sdmVkIG9yIG5vdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZyb21cclxuICogQHJldHVybnMgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb2x2ZWQodG8sIGZyb20pIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHsgcmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcbiAgICByZXR1cm4gKChfYSA9IHJlc29sdmVkTGlua3MgPT09IG51bGwgfHwgcmVzb2x2ZWRMaW5rcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzb2x2ZWRMaW5rc1thZGRNRChmcm9tKV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVthZGRNRCh0byldKSA+IDA7XHJcbn1cclxuLyoqXHJcbiAqIE9wZW4geW91ciB2aWV3IG9uIHRoZSBjaG9zZW4gYHNpZGVgIGlmIGl0IGlzbid0IGFscmVhZHkgb3BlblxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdUeXBlXHJcbiAqIEBwYXJhbSAge0NvbnN0cnVjdG9yPFlvdXJWaWV3Pn0gdmlld0NsYXNzIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvZiB5b3VyIHZpZXdcclxuICogQHBhcmFtICB7XCJsZWZ0XCJ8XCJyaWdodFwifSBbc2lkZT1cInJpZ2h0XCJdXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPFlvdXJWaWV3Pn0gVGhlIG9wZW5lZCB2aWV3XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblZpZXcodmlld1R5cGUsIHZpZXdDbGFzcywgc2lkZSA9IFwicmlnaHRcIikge1xyXG4gICAgbGV0IGxlYWYgPSBudWxsO1xyXG4gICAgZm9yIChsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKHZpZXdUeXBlKSkge1xyXG4gICAgICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiB2aWV3Q2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlYWYudmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoeyB0eXBlOiBcImVtcHR5XCIgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBsZWFmID1cclxuICAgICAgICAobGVhZiAhPT0gbnVsbCAmJiBsZWFmICE9PSB2b2lkIDAgPyBsZWFmIDogc2lkZSA9PT0gXCJyaWdodFwiKVxyXG4gICAgICAgICAgICA/IGFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKVxyXG4gICAgICAgICAgICA6IGFwcC53b3Jrc3BhY2UuZ2V0TGVmdExlYWYoZmFsc2UpO1xyXG4gICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xyXG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGxlYWYudmlldztcclxufVxyXG4vKipcclxuICogQ2hlY2sgd2hpY2ggc2lkZSBvZiB0aGUgd29ya3NwYWNlIHlvdXIgYHZpZXdUeXBlYCBpcyBvbiwgYW5kIHNhdmUgaXQgaW50byBgcGx1Z2luLnNldHRpbmdzW3NldHRpbmdOYW1lXWAuXHJcbiAqXHJcbiAqICoqVGlwKio6IFJ1biB0aGlzIGZ1bmN0aW9uIG9uIGBwbHVnaW4udW5sb2FkYCB0byBzYXZlIHRoZSBsYXN0IHNpZGUgeW91ciB2aWV3IHdhcyBvbiB3aGVuIGNsb3NpbmcsIHRoZW4ge0BsaW5rIG9wZW5WaWV3fSBvbiB0aGUgc2FtZSBzaWRlIGl0IHdhcyBsYXN0LlxyXG4gKiBAcGFyYW0gIHtZb3VyUGx1Z2lufSBwbHVnaW5cclxuICogQHBhcmFtICB7c3RyaW5nfSB2aWV3VHlwZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNldHRpbmdOYW1lXHJcbiAqIEByZXR1cm5zIHtcImxlZnRcIiB8IFwicmlnaHRcIn0gYHNpZGVgXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVZpZXdTaWRlKHBsdWdpbiwgdmlld1R5cGUsIHNldHRpbmdOYW1lKSB7XHJcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlld1R5cGUpWzBdO1xyXG4gICAgaWYgKCFsZWFmKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKGBPYnNpZGlhbi1Db21tdW5pdHktTGliOiBObyBpbnN0YW5jZSBvZiAnJHt2aWV3VHlwZX0nIG9wZW4sIGNhbm5vdCBzYXZlIHNpZGVgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGNvbnN0IHNpZGUgPSBsZWFmLmdldFJvb3QoKS5zaWRlO1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBwbHVnaW4uc2V0dGluZ3Nbc2V0dGluZ05hbWVdID0gc2lkZTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgcmV0dXJuIHNpZGU7XHJcbn1cclxuLyoqXHJcbiAqIEEgTW9kYWwgdXNlZCBpbiB7QGxpbmsgYWRkUmVuZGVyZWRNYXJrZG93bkJ1dHRvbn0gdG8gZGlzcGxheSByZW5kZXJlZCBtYXJrZG93biBmcm9tIGEgcmF3IHN0cmluZywgb3IgZmV0Y2hlZCBmcm9tIGEgcHJvdmlkZWQgdXJsLlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9OTXdNNTBFLnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gc291cmNlIFJhdyBtYXJrZG93biBjb250ZW50IG9yIHVybCB0byBmaW5kIHJhdyBtYXJrZG93bi5cclxuICogQHBhcmFtICB7Ym9vbGVhbn0gZmV0Y2ggVHJ1ZSBcdTIxOTIgZmV0Y2ggbWFya2Rvd24gZnJvbSBgc291cmNlYCBhcyB1cmwuIEZhbHNlIFx1MjE5MiBgc291cmNlYCBpcyBhbHJlYWR5IGEgbWFya2Rvd24gc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlbmRlcmVkTWFya2Rvd25Nb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbiwgc291cmNlLCBmZXRjaCkge1xyXG4gICAgICAgIHN1cGVyKGFwcCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICAgICAgdGhpcy5mZXRjaCA9IGZldGNoO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25PcGVuKCkge1xyXG4gICAgICAgIGxldCB7IGNvbnRlbnRFbCwgc291cmNlLCBwbHVnaW4sIGZldGNoIH0gPSB0aGlzO1xyXG4gICAgICAgIGxldCBjb250ZW50ID0gc291cmNlO1xyXG4gICAgICAgIGlmIChmZXRjaCkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuY3JlYXRlRGl2KHsgdGV4dDogYFdhaXRpbmcgZm9yIGNvbnRlbnQgZnJvbTogJyR7c291cmNlfSdgIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVxdWVzdCh7IHVybDogc291cmNlIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9nRGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJPQ0wtUmVuZGVyZWRNYXJrZG93bk1vZGFsXCIgfSk7XHJcbiAgICAgICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihjb250ZW50LCBsb2dEaXYsIFwiXCIsIHBsdWdpbik7XHJcbiAgICB9XHJcbiAgICBvbkNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEFkZCBhIGJ1dHRvbiB0byBhbiBIVE1MRUxlbWVudCwgd2hpY2gsIHdoZW4gY2xpY2tlZCwgcG9wcyB1cCBhIHtAbGluayBSZW5kZXJlZE1hcmtkb3duTW9kYWx9IHNob3dpbmcgcmVuZGVyZWQgbWFya2Rvd24uXHJcbiAqXHJcbiAqIFVzZSBgZmV0Y2hgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1hcmtkb3duIHN0cmluZyBuZWVkcyB0byBiZSBmZXRjaGVkLCBvciBpZiBpdCBoYXMgYmVlbiBwcm92aWRlZCBhcyBhIHN0cmluZyBhbHJlYWR5LlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9IaTRneXl2LnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBjb250YWluZXJFbCBIVE1MRWxlbWVudCB0byBhZGQgdGhlIGJ1dHRvbiB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNvdXJjZSBSYXcgbWFya2Rvd24gY29udGVudCBvciB1cmwgdG8gZmluZCByYXcgbWFya2Rvd24uXHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IGZldGNoIFRydWUgXHUyMTkyIGZldGNoIG1hcmtkb3duIGZyb20gYHNvdXJjZWAgYXMgdXJsLiBGYWxzZSBcdTIxOTIgYHNvdXJjZWAgaXMgYWxyZWFkeSBhIG1hcmtkb3duIHN0cmluZy5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkaXNwbGF5VGV4dCBUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGJ1dHRvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZW5kZXJlZE1hcmtkb3duQnV0dG9uKHBsdWdpbiwgY29udGFpbmVyRWwsIHNvdXJjZSwgZmV0Y2gsIGRpc3BsYXlUZXh0KSB7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IGRpc3BsYXlUZXh0IH0sIChidXQpID0+IGJ1dC5vbkNsaWNrRXZlbnQoKCkgPT4ge1xyXG4gICAgICAgIG5ldyBSZW5kZXJlZE1hcmtkb3duTW9kYWwocGx1Z2luLCBzb3VyY2UsIGZldGNoKS5vcGVuKCk7XHJcbiAgICB9KSk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBhcHAubWV0YWRhdGFDYWNoZS5SZXNvbHZlZExpbmtzYCBoYXZlIGZ1bGx5IGluaXRhbGlzZWQuXHJcbiAqXHJcbiAqIFVzZWQgd2l0aCB7QGxpbmsgd2FpdEZvclJlc29sdmVkTGlua3N9LlxyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG5vRmlsZXMgTnVtYmVyIG9mIGZpbGVzIGluIHlvdXIgdmF1bHQuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVkTGlua3NDb21wbGV0ZShub0ZpbGVzKSB7XHJcbiAgICBjb25zdCB7IHJlc29sdmVkTGlua3MgfSA9IGFwcC5tZXRhZGF0YUNhY2hlO1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc29sdmVkTGlua3MpLmxlbmd0aCA9PT0gbm9GaWxlcztcclxufVxyXG4vKipcclxuICogV2FpdCBmb3IgYGFwcC5tZXRhZGF0YUNhY2hlLlJlc29sdmVkTGlua3NgIHRvIGhhdmUgZnVsbHkgaW5pdGlhbGlzZWQuXHJcbiAqIEBwYXJhbSAge251bWJlcn0gW2RlbGF5PTEwMDBdIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTUwXSBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGNoZWNrIGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvciBhbmQgYnJlYWtpbmcgb3V0IG9mIHRoZSBsb29wLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JSZXNvbHZlZExpbmtzKGRlbGF5ID0gMTAwMCwgbWF4ID0gNTApIHtcclxuICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIHdoaWxlICghcmVzb2x2ZWRMaW5rc0NvbXBsZXRlKG5vRmlsZXMpICYmIGkgPCBtYXgpIHtcclxuICAgICAgICBhd2FpdCB3YWl0KGRlbGF5KTtcclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBpZiAoaSA9PT0gbWF4KSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJPYnNpZGlhbi1Db21tdW5pdHktTGliOiBSZXNvbHZlZExpbmtzIGRpZCBub3QgZmluaXNoIGluaXRpYWxpc2luZy4gYG1heGAgaXRlcmF0aW9ucyB3YXMgcmVhY2hlZCBmaXJzdC5cIik7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSBjb250ZW50IG9mIGEgbm90ZSBoYXMgWUFNTC4gSWYgc28sIHJldHVybiBhbiBhcnJheSBvZiB0aGUgWUFNTCBhbmQgdGhlIHJlc3Qgb2YgdGhlIG5vdGUuIElmIG5vdCwgcmV0dXJuIGBbJycsIGNvbnRlbnRdYFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvbnRlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50KSB7XHJcbiAgICBpZiAoIS9eLS0tXFxuLy50ZXN0KGNvbnRlbnQpKVxyXG4gICAgICAgIHJldHVybiBbXCJcIiwgY29udGVudF07XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBjb250ZW50LnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHNwbGl0cy5zbGljZSgwLCAyKS5qb2luKFwiLS0tXCIpICsgXCItLS1cIixcclxuICAgICAgICAgICAgc3BsaXRzLnNsaWNlKDIpLmpvaW4oXCItLS1cIiksXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHtib29sZWFufSBjYWNoZWQgUmV0dXJuIGNhY2hlZCBmaWxlIGNvbnRlbnQgKipvcioqIHJldHVybiB3aGF0J3Mgb24gZGlzay5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVGaWxlQ29udGVudChjYWNoZWQgPSB0cnVlKSB7XHJcbiAgICBjb25zdCBjdXJyRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgaWYgKCEoY3VyckZpbGUgaW5zdGFuY2VvZiBURmlsZSkpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoY2FjaGVkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChjdXJyRmlsZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUge1xyXG4gIEJDU2V0dGluZ3MsXHJcbiAgRGlyZWN0aW9ucyxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IElKdWdnbFNldHRpbmdzIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1BVFJJWF9WSUVXID0gXCJCQy1tYXRyaXhcIjtcclxuLy8gZXhwb3J0IGNvbnN0IFNUQVRTX1ZJRVcgPSBcIkJDLXN0YXRzXCI7XHJcbmV4cG9ydCBjb25zdCBEVUNLX1ZJRVcgPSBcIkJDLWR1Y2tzXCI7XHJcbmV4cG9ydCBjb25zdCBUUkVFX1ZJRVcgPSBcIkJDLXRyZWVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OID0gXCJCQy10cmFpbC1pY29uXCI7XHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OX1NWRyA9XHJcbiAgJzxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ4LjgsNGMtNiwwLTEzLjUsMC41LTE5LjcsMy4zUzE3LjksMTUuOSwxNy45LDI1YzAsNSwyLjYsOS43LDYuMSwxMy45czguMSw4LjMsMTIuNiwxMi4zczksNy44LDEyLjIsMTEuNSBjMy4yLDMuNyw1LjEsNy4xLDUuMSwxMC4yYzAsMTQuNC0xMy40LDE5LjMtMTMuNCwxOS4zYy0wLjcsMC4yLTEuMiwwLjgtMS4zLDEuNXMwLjEsMS40LDAuNywxLjljMC42LDAuNSwxLjMsMC42LDIsMC4zIGMwLDAsMTYuMS02LjEsMTYuMS0yM2MwLTQuNi0yLjYtOC44LTYuMS0xMi44Yy0zLjUtNC04LjEtNy45LTEyLjYtMTEuOGMtNC41LTMuOS04LjktNy45LTEyLjItMTEuOGMtMy4yLTMuOS01LjItNy43LTUuMi0xMS40IGMwLTcuOCwzLjYtMTEuNiw4LjgtMTRTNDMsOCw0OC44LDhjNC42LDAsOS4zLDAsMTEsMGMwLjcsMCwxLjQtMC40LDEuNy0xYzAuMy0wLjYsMC4zLTEuNCwwLTJzLTEtMS0xLjctMUM1OC4zLDQsNTMuNCw0LDQ4LjgsNCBMNDguOCw0eiBNNzguMSw0Yy0wLjYsMC0xLjIsMC4yLTEuNiwwLjdsLTguOSw5LjljLTAuNSwwLjYtMC43LDEuNC0wLjMsMi4yYzAuMywwLjcsMSwxLjIsMS44LDEuMmgwLjFsLTIuOCwyLjYgYy0wLjYsMC42LTAuOCwxLjQtMC41LDIuMmMwLjMsMC44LDEsMS4zLDEuOSwxLjNoMS4zbC00LjUsNC42Yy0wLjYsMC42LTAuNywxLjQtMC40LDIuMmMwLjMsMC43LDEsMS4yLDEuOCwxLjJoMTB2NCBjMCwwLjcsMC40LDEuNCwxLDEuOGMwLjYsMC40LDEuNCwwLjQsMiwwYzAuNi0wLjQsMS0xLDEtMS44di00aDEwYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMS0xLjYtMC40LTIuMkw4Ni45LDI0aDEuMyBjMC44LDAsMS42LTAuNSwxLjktMS4zYzAuMy0wLjgsMC4xLTEuNi0wLjUtMi4ybC0yLjgtMi42aDAuMWMwLjgsMCwxLjUtMC41LDEuOC0xLjJjMC4zLTAuNywwLjItMS42LTAuMy0yLjJsLTguOS05LjkgQzc5LjEsNC4zLDc4LjYsNCw3OC4xLDRMNzguMSw0eiBNNzgsOWw0LjQsNC45aC0wLjdjLTAuOCwwLTEuNiwwLjUtMS45LDEuM2MtMC4zLDAuOC0wLjEsMS42LDAuNSwyLjJsMi44LDIuNmgtMS4xIGMtMC44LDAtMS41LDAuNS0xLjgsMS4yYy0wLjMsMC43LTAuMSwxLjYsMC40LDIuMmw0LjUsNC42SDcwLjhsNC41LTQuNmMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0xLjEgbDIuOC0yLjZjMC42LTAuNiwwLjgtMS40LDAuNS0yLjJjLTAuMy0wLjgtMS0xLjMtMS45LTEuM2gtMC43TDc4LDl6IE01Mi40LDEyYy00LjEsMC03LjEsMC41LTkuNCwxLjVjLTIuMywxLTMuOCwyLjUtNC41LDQuMyBjLTAuNywxLjgtMC41LDMuNiwwLjEsNS4yYzAuNiwxLjUsMS41LDIuOSwyLjUsMy45YzUuNCw1LjQsMTguMSwxMi42LDI5LjYsMjFjNS44LDQuMiwxMS4yLDguNiwxNS4xLDEzYzMuOSw0LjQsNi4yLDguNyw2LjIsMTIuNCBjMCwxNC41LTEyLjksMTguNy0xMi45LDE4LjdjLTAuNywwLjItMS4yLDAuOC0xLjQsMS41czAuMSwxLjUsMC43LDEuOWMwLjYsMC41LDEuMywwLjYsMiwwLjNjMCwwLDE1LjYtNS42LDE1LjYtMjIuNSBjMC01LjMtMi45LTEwLjMtNy4yLTE1LjFDODQuNiw1My42LDc5LDQ5LDczLjEsNDQuN2MtMTEuOC04LjYtMjQuOC0xNi4zLTI5LjItMjAuNmMtMC42LTAuNi0xLjItMS41LTEuNi0yLjQgYy0wLjMtMC45LTAuNC0xLjctMC4xLTIuNGMwLjMtMC43LDAuOC0xLjQsMi4zLTJjMS41LTAuNyw0LjEtMS4yLDcuOC0xLjJjNC45LDAsOS40LDAuMSw5LjQsMC4xYzAuNywwLDEuNC0wLjMsMS44LTEgYzAuNC0wLjYsMC40LTEuNCwwLTIuMWMtMC40LTAuNi0xLjEtMS0xLjgtMUM2MS45LDEyLjEsNTcuMywxMiw1Mi40LDEyTDUyLjQsMTJ6IE0yNCw0NmMtMC41LDAtMS4xLDAuMi0xLjQsMC42TDkuMiw2MC41IGMtMC42LDAuNi0wLjcsMS40LTAuNCwyLjJjMC4zLDAuNywxLDEuMiwxLjgsMS4yaDNsLTYuNSw2LjhjLTAuNiwwLjYtMC43LDEuNC0wLjQsMi4yczEsMS4yLDEuOCwxLjJIMTNsLTguNSw4LjYgQzQsODMuMiwzLjgsODQsNC4yLDg0LjhDNC41LDg1LjUsNS4yLDg2LDYsODZoMTZ2NS40YzAsMC43LDAuNCwxLjQsMSwxLjhjMC42LDAuNCwxLjQsMC40LDIsMGMwLjYtMC40LDEtMSwxLTEuOFY4NmgxNiBjMC44LDAsMS41LTAuNSwxLjgtMS4yYzAuMy0wLjcsMC4xLTEuNi0wLjQtMi4yTDM1LDc0aDQuNGMwLjgsMCwxLjUtMC41LDEuOC0xLjJzMC4yLTEuNi0wLjQtMi4ybC02LjUtNi44aDMgYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMi0xLjYtMC40LTIuMkwyNS40LDQ2LjZDMjUuMSw0Ni4yLDI0LjUsNDYsMjQsNDZMMjQsNDZ6IE0yNCw1MC45bDguNyw5aC0zIGMtMC44LDAtMS41LDAuNS0xLjgsMS4ycy0wLjIsMS42LDAuNCwyLjJsNi41LDYuOGgtNC41Yy0wLjgsMC0xLjUsMC41LTEuOCwxLjJjLTAuMywwLjctMC4xLDEuNiwwLjQsMi4ybDguNSw4LjZIMTAuOGw4LjUtOC42IGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC00LjVsNi41LTYuOGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0zTDI0LDUwLjl6XCIvPic7XHJcblxyXG5leHBvcnQgY29uc3QgRFVDS19JQ09OID0gXCJCQy1kdWNrLWljb25cIjtcclxuZXhwb3J0IGNvbnN0IERVQ0tfSUNPTl9TVkcgPVxyXG4gICc8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZD1cIk03MiwzMWMwLTEuNS0xLjItMi44LTIuOC0yLjhjLTEuNSwwLTIuOCwxLjItMi44LDIuOHMxLjIsMi44LDIuOCwyLjhDNzAuOCwzMy44LDcyLDMyLjYsNzIsMzF6IE04MC40LDQ3LjdjMTAuNywwLDE5LjQtOC43LDE5LjQtMTkuNEg4OC40Yy0wLjEtMC42LTAuMS0xLjEtMC4yLTEuN2MtMS42LTcuMS03LjMtMTIuOC0xNC4zLTE0NGMtMS42LTAuNC0zLjEtMC41LTQuNi0wLjVjLTEwLjcsMC0xOS40LDguNy0xOS40LDE5LjR2MTMuOWgtOS40Yy02LjgsMC0xMy42LTIuNC0xOC4yLTcuM2MtMC43LTAuNy0xLjYtMS4xLTIuNC0xMWMtMS43LDAtMy4zLDEuMy0zLjMsMy4zYzAsMTYuNCwxMi41LDMxLDI4LjYsMzIuNmMxLjYsMC4yLDMuMS0xLjEsMy4xLTIuOHYtMi44YzAtMS40LTEtMi42LTIuNC0yLjdjLTcuOS0wOS0xNC44LTYuMi0xOC40LTEzLjVjNC4xLDEuNiw4LjUsMi41LDEzLjEsMi41bDE3LjcsMC4xVjMxYzAtNi4xLDUtMTEuMSwxMS4xLTExLjFjMC45LDAsMS44LDAuMSwyLjcsMC4zYzMuOSwwLjksNy4yLDQuMiw4LjEsOC4xQzgxNCwzNC40LDc4LDM5LjEsNzQsNDFsLTQuNywyLjN2MTIuNGwyLjEsMi40YzEuNSwxLjgsMy40LDQuNywzLjUsOC44YzAuMSwzLjQtMS4zLDYuNy0zLjksOS40Yy0zLDMtNyw0LjgtMTEuMiw0LjhINDMuOWMtMSwwLTIuMS0wMS0zLjItMC4yQzI1LjIsNzkuNSwxMi4zLDY4LjEsOC43LDUzLjJoNS4xYy0xLjItMi43LTItNS41LTIuNS04LjNINS40Yy0zLjMsMC02LDMtNS41LDYuM2MyLjksMjAuMywxOS40LDM2LjEsNDAsMzhjMS4zLDAuMSwyLjYsMDIsNCwwLjJoMTUuOGMxMi41LDAsMjMuNy0xMC4yLDIzLjQtMjIuN2MtMC4xLTUuNC0yLjItMTAuMy01LjYtMTQuMXYtNC45SDgwLjRMODAuNCw0Ny43elwiLz4nO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0TGlua3NSZWdleCA9IG5ldyBSZWdFeHAoL1xcW1xcWyguKz8pXFxdXFxdL2cpO1xyXG5leHBvcnQgY29uc3QgZHJvcEhlYWRlck9yQWxpYXMgPSBuZXcgUmVnRXhwKC9cXFtcXFsoW14jfF0rKVxcXVxcXS8pO1xyXG5cclxuLyoqIEEgbWV0YS1yZWdleCB0aGF0IHRha2VzIGluIGEgc3RyaW5nIG9mIHRoZSBmb3JtIGAvcmVnZXgvZmxhZ3NgLCBhbmQgcmV0dXJucyAyIGdyb3VwcywgdGhlIGlubmVyIGByZWdleGAsIGFuZCB0aGUgYGZsYWdzYC4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZ05GbGFncyA9IG5ldyBSZWdFeHAoL14uKC4qPylcXFcoXFx3KikkLyk7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUlMX0xFTkdUSFMgPSBbXHJcbiAgJ1Nob3J0ZXN0JyxcclxuICAnTG9uZ2VzdCcsXHJcbiAgJ0FsbCdcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IFZJU1RZUEVTID0gW1xyXG4gIFwiRm9yY2UgRGlyZWN0ZWQgR3JhcGhcIixcclxuICBcIlRpZHkgVHJlZVwiLFxyXG4gIFwiQ2lyY2xlIFBhY2tpbmdcIixcclxuICBcIkVkZ2UgQnVuZGxpbmdcIixcclxuICBcIkFyYyBEaWFncmFtXCIsXHJcbiAgXCJTdW5idXJzdFwiLFxyXG4gIFwiVHJlZSBNYXBcIixcclxuICBcIkljaWNsZVwiLFxyXG4gIFwiUmFkaWFsIFRyZWVcIixcclxuXSBhcyBjb25zdDtcclxuXHJcbi8qIEFsbCA1IHBvc3NpYmxlIGRpcmVjdGlvbnMuICovXHJcbmV4cG9ydCBjb25zdCBESVJFQ1RJT05TID0gW1widXBcIiwgXCJzYW1lXCIsIFwiZG93blwiLCBcIm5leHRcIiwgXCJwcmV2XCJdIGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIEFuIGFycm93IGZvciBlYWNoIHtAbGluayBESVJFQ1RJT05TfSB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBBUlJPV19ESVJFQ1RJT05TOiB7IFtkaXIgaW4gRGlyZWN0aW9uc106IHN0cmluZyB9ID0ge1xyXG4gIHVwOiBcIlx1MjE5MVwiLFxyXG4gIHNhbWU6IFwiXHUyMTk0XCIsXHJcbiAgZG93bjogXCJcdTIxOTNcIixcclxuICBuZXh0OiBcIlx1MjE5MlwiLFxyXG4gIHByZXY6IFwiXHUyMTkwXCIsXHJcbn07XHJcbmV4cG9ydCBjb25zdCBSRUxBVElPTlMgPSBbXCJQYXJlbnRcIiwgXCJTaWJsaW5nXCIsIFwiQ2hpbGRcIl0gYXMgY29uc3Q7XHJcbmV4cG9ydCBjb25zdCBSRUFsQ0xPU0VEID0gW1wiUmVhbFwiLCBcIkNsb3NlZFwiXTtcclxuZXhwb3J0IGNvbnN0IEFMTFVOTElOS0VEID0gW1wiQWxsXCIsIFwiTm8gVW5saW5rZWRcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfVFlQRVMgPSBbXCJ0cmVlXCIsIFwianVnZ2xcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfRklFTERTID0gW1xyXG4gIFwidHlwZVwiLFxyXG4gIFwiZGlyXCIsXHJcbiAgXCJmaWVsZHNcIixcclxuICBcImRlcHRoXCIsXHJcbiAgXCJ0aXRsZVwiLFxyXG4gIFwiZmxhdFwiLFxyXG4gIFwiY29udGVudFwiLFxyXG4gIFwiZnJvbVwiLFxyXG4gIFwiaW1wbGllZFwiLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX0NCX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IHtcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICBhdXRvQWRkTm9kZXM6IGZhbHNlLFxyXG4gIGF1dG9FeHBhbmQ6IGZhbHNlLFxyXG4gIGF1dG9ab29tOiBmYWxzZSxcclxuICBjb3JlU3RvcmU6IFwiY29yZVwiLFxyXG4gIGV4cGFuZEluaXRpYWw6IGZhbHNlLFxyXG4gIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICBmaWx0ZXI6IFwiXCIsXHJcbiAgaGVpZ2h0OiBcIjc1MHB4XCIsXHJcbiAgaG92ZXJFZGdlczogZmFsc2UsXHJcbiAgbGF5b3V0OiBcImZvcmNlLWRpcmVjdGVkXCIsXHJcbiAgbGltaXQ6IDI1MCxcclxuICBtZXJnZUVkZ2VzOiB0cnVlLFxyXG4gIG1ldGFLZXlIb3ZlcjogdHJ1ZSxcclxuICBtb2RlOiBcIndvcmtzcGFjZVwiLFxyXG4gIG5hdmlnYXRvcjogdHJ1ZSxcclxuICBvcGVuV2l0aFNoaWZ0OiBmYWxzZSxcclxuICByZWFkQ29udGVudDogdHJ1ZSxcclxuICBzdHlsZUdyb3VwczogW10sXHJcbiAgdG9vbGJhcjogdHJ1ZSxcclxuICB3aWR0aDogXCIxMDAlXCIsXHJcbiAgem9vbVNwZWVkOiAxLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX1RSQUlMX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcbiAgSlVHR0xfQ0JfREVGQVVMVFMsXHJcbiAge1xyXG4gICAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICAgIGF1dG9ab29tOiBmYWxzZSxcclxuICAgIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICAgIGhlaWdodDogXCIzMDBweFwiLFxyXG4gICAgcmVhZENvbnRlbnQ6IGZhbHNlLFxyXG4gICAgdG9vbGJhcjogZmFsc2UsXHJcbiAgICBuYXZpZ2F0b3I6IGZhbHNlLFxyXG4gIH1cclxuKTtcclxuQ09ERUJMT0NLX0ZJRUxEUy5wdXNoKC4uLk9iamVjdC5rZXlzKEpVR0dMX0NCX0RFRkFVTFRTKSk7XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtVc2VySGllciA9ICgpOiBVc2VySGllciA9PiB7XHJcbiAgcmV0dXJuIHsgdXA6IFtdLCBzYW1lOiBbXSwgZG93bjogW10sIG5leHQ6IFtdLCBwcmV2OiBbXSB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgYmxhbmtEaXJPYmpzID0gKCk6IHsgW2RpciBpbiBEaXJlY3Rpb25zXToge30gfSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHVwOiB7fSxcclxuICAgIHNhbWU6IHt9LFxyXG4gICAgZG93bjoge30sXHJcbiAgICBuZXh0OiB7fSxcclxuICAgIHByZXY6IHt9LFxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtSZWFsTkltcGxpZWQgPSAoKTogUmVhbE5JbXBsaWVkID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgdXA6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIGRvd246IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHNhbWU6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIG5leHQ6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHByZXY6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFtcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfSV9SRUZMRVhJVkUsXHJcbiAgQkNfSV9QQVJFTlQsXHJcbl0gPSBbXHJcbiAgICBcIkJDLUF1bnRcIixcclxuICAgIFwiQkMtQ291c2luXCIsXHJcbiAgICBcIkJDLVNpYmxpbmctMVwiLFxyXG4gICAgXCJCQy1TaWJsaW5nLTJcIixcclxuICAgIFwiQkMtUmVmbGV4aXZlXCIsXHJcbiAgICBcIkJDLVBhcmVudFwiLFxyXG4gIF07XHJcblxyXG5leHBvcnQgY29uc3QgW1xyXG4gIEJDX0ZPTERFUl9OT1RFLFxyXG4gIEJDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlMsXHJcbiAgQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFLFxyXG4gIEJDX1RBR19OT1RFLFxyXG4gIEJDX1RBR19OT1RFX0ZJRUxELFxyXG4gIEJDX1RBR19OT1RFX0VYQUNULFxyXG4gIEJDX0xJTktfTk9URSxcclxuICBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICBCQ19EVl9OT1RFLFxyXG4gIEJDX0RWX05PVEVfRklFTEQsXHJcbiAgQkNfSUdOT1JFLFxyXG4gIEJDX0lHTk9SRV9ERU5EUk9OLFxyXG4gIEJDX0hJREVfVFJBSUwsXHJcbiAgQkNfT1JERVIsXHJcbl0gPSBbXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlXCIsXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlLXN1YmZvbGRlcnNcIixcclxuICAgIFwiQkMtZm9sZGVyLW5vdGUtcmVjdXJzaXZlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWZpZWxkXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWV4YWN0XCIsXHJcbiAgICBcIkJDLWxpbmstbm90ZVwiLFxyXG4gICAgXCJCQy10cmF2ZXJzZS1ub3RlXCIsXHJcbiAgICBcIkJDLXJlZ2V4LW5vdGVcIixcclxuICAgIFwiQkMtcmVnZXgtbm90ZS1maWVsZFwiLFxyXG4gICAgXCJCQy1kYXRhdmlldy1ub3RlXCIsXHJcbiAgICBcIkJDLWRhdGF2aWV3LW5vdGUtZmllbGRcIixcclxuICAgIFwiQkMtaWdub3JlXCIsXHJcbiAgICBcIkJDLWlnbm9yZS1kZW5kcm9uXCIsXHJcbiAgICBcIkJDLWhpZGUtdHJhaWxcIixcclxuICAgIFwiQkMtb3JkZXJcIixcclxuICBdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJDX0ZJRUxEU19JTkZPID0gW1xyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIGZvbGRlci1ub3RlLiBBbGwgb3RoZXIgbm90ZXMgaW4gdGhpcyBmb2xkZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JhcGggd2l0aCB0aGUgZmllbGQgbmFtZSBzcGVjaWZpZWQgaW4gdGhpcyBrZXkncyB2YWx1ZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9TVUJGT0xERVJTLFxyXG4gICAgZGVzYzogXCJMaW5rIHRvIG5vdGVzIGluIHN1YmZvbGRlcnMgd2l0aCB0aGUgZ2l2ZW4gZmllbGQuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiBcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IFwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgICBkZXNjOiBcIlJlY3Vyc2l2ZWx5IGFkZCBub3RlcyBpbiBzdWJmb2xkZXJzIHRvIHRoZSBmb2xkZXJub3RlIG9mIF90aGF0XyBzdWJmb2xkZXIuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdGFnLW5vdGUuIEFsbCBvdGhlciBub3RlcyB3aXRoIHRoaXMgdGFnIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBUYWcgTm90ZXMgPiBEZWZhdWx0IEZpZWxkYCwgb3IgdXNpbmcgdGhlIGZpZWxkTmFtZSB5b3Ugc3BlY2lmeSB3aXRoIGBCQy10YWctbm90ZS1maWVsZDogZmllbGROYW1lYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJyNcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6ICNcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UQUdfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyB0YWctbm90ZSB0byB1c2VcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFX0VYQUNULFxyXG4gICAgZGVzYzogXCJPbmx5IGxvb2sgZm9yIG5vdGVzIHdpdGggdGhlIGV4YWN0IHRhZy4gaS5lLiBgI0FgIHdvbid0IG1hdGNoIGAjQS9CYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19MSU5LX05PVEUsXHJcbiAgICBkZXNjOiBcIlNldCB0aGlzIG5vdGUgYXMgYSBCcmVhZGNydW1icyBsaW5rLW5vdGUuIEFsbCBsaW5rcyBsZWF2aW5nIHRoaXMgbm90ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBncmFwaCB3aXRoIHRoZSBmaWVsZCBuYW1lIHNwZWNpZmllZCBpbiB0aGlzIGtleSdzIHZhbHVlLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdHJhdmVyc2Utbm90ZS4gU3RhcnRpbmcgZnJvbSB0aGlzIG5vdGUsIHRoZSBPYnNpZGlhbiBncmFwaCB3aWxsIGJlIHRyYXZlcnNlZCBpbiBkZXB0aC1maXJzdCBvcmRlciwgYW5kIGFsbCBub3RlcyBhbG9uZyB0aGUgd2F5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnlcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIHJlZ2V4LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgcmVndWxhciBleHByZXNzaW9uIChvZiB0aGUgZm9ybSAnL3JlZ2V4L2ZsYWdzJykuIEFsbCBub3RlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBSZWdleCBOb3RlcyA+IERlZmF1bHQgRmllbGRgLCBvciB1c2luZyB0aGUgZmllbGROYW1lIHlvdSBzcGVjaWZ5IGluICdCQy1yZWdleC1ub3RlLWZpZWxkJy5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6ICcvXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiAvXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyByZWdleC1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIERhdGF2aWV3LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgRGF0YXZpZXcgYGZyb21gIHF1ZXJ5LiBBbGwgbm90ZXMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgd2lsbCBiZSBhZGRlZCB0byB0aGUgQkMgZ3JhcGggdXNpbmcgdGhlIGRlZmF1bHQgZmllbGROYW1lIHNwZWNpZmllZCBpbiBgU2V0dGluZ3MgPiBBbHRlcm5hdGl2ZSBIaWVyYXJjaGllcyA+IERhdGF2aWV3IE5vdGVzID4gRGVmYXVsdCBGaWVsZGAsIG9yIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnkgaW4gJ0JDLWRhdGF2aWV3LW5vdGUtZmllbGQnLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJ1wiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyBEYXRhdmlldy1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSUdOT1JFLFxyXG4gICAgZGVzYzogXCJUZWxscyBCcmVhZGNydW1icyB0byBpZ25vcmUgYSBub3RlIGZyb20gaXRzIGluZGV4IGVudGlyZWx5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgQnJlYWRjcnVtYnMgdG8gaW5kZXggbm90ZXMsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBzaG93IHRoZW0gaW4gdGhlIGdyYXBoLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19JR05PUkVfREVORFJPTixcclxuICAgIGRlc2M6IFwiVGVsbHMgQnJlYWRjcnVtYnMgdG8gbm90IHRyZWF0IHRoaXMgbm90ZSBhcyBhIGRlbmRyb24gbm90ZSAob25seSB1c2VmdWwgaWYgdGhlIG5vdGUgbmFtZSBoYXMgeW91IGRlbmRyb24gc3BsaXR0ZXIgaW4gaXQsIHVzdWFsbHkgYSBwZXJpb2QgYC5gKS5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6IHRydWVcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IHRydWVcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSElERV9UUkFJTCxcclxuICAgIGRlc2M6IFwiRG9uJ3Qgc2hvdyB0aGUgdHJhaWwgaW4gdGhpcyBub3RlXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX09SREVSLFxyXG4gICAgZGVzYzogXCJTZXQgdGhlIG9yZGVyIG9mIHRoaXMgbm90ZSBpbiB0aGUgTWF0cml4IHZpZXcuIEEgbG93ZXIgdmFsdWUgcGxhY2VzIHRoaXMgbm90ZSBoaWdoZXIgaW4gdGhlIG9yZGVyLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBCQ19BTFRTID0gQkNfRklFTERTX0lORk8uZmlsdGVyKChmKSA9PiBmLmFsdCkubWFwKChmKSA9PiBmLmZpZWxkKTtcclxuXHJcbmV4cG9ydCBjb25zdCBJTExFR0FMX0ZJTEVOQU1FX0NIQVJTID0gW1xyXG4gIFwiXFxcXFwiLFxyXG4gIFwiL1wiLFxyXG4gIFwiOlwiLFxyXG4gIFwiKlwiLFxyXG4gIFwiP1wiLFxyXG4gICdcIicsXHJcbiAgXCI8XCIsXHJcbiAgXCI+XCIsXHJcbiAgXCJ8XCIsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgREFUQVZJRVdfTUlTU0lORyA9XHJcbiAgXCJUaGUgRGF0YXZpZXcgcGx1Z2luIG11c3QgYmUgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHdvcmtcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBBUElfTkFNRSA9IFwiQkNBUElcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBCQ1NldHRpbmdzID0ge1xyXG4gIGFkZERlbmRyb25Ob3RlczogZmFsc2UsXHJcbiAgYWRkRGF0ZU5vdGVzOiBmYWxzZSxcclxuICBhbGlhc2VzSW5JbmRleDogZmFsc2UsXHJcbiAgYWxwaGFTb3J0QXNjOiB0cnVlLFxyXG4gIGFsdExpbmtGaWVsZHM6IFtdLFxyXG4gIENTVlBhdGhzOiBcIlwiLFxyXG4gIGNyZWF0ZUluZGV4SW5kZW50OiAnICAnLFxyXG4gIGRhdGVGb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxyXG4gIGRhdGVOb3RlRm9ybWF0OiBcInl5eXktTU0tZGRcIixcclxuICBkYXRlTm90ZUZpZWxkOiBcIm5leHRcIixcclxuICBkYXRhdmlld05vdGVGaWVsZDogXCJ1cFwiLFxyXG4gIGRhdGVOb3RlQWRkTW9udGg6IFwiXCIsXHJcbiAgZGF0ZU5vdGVBZGRZZWFyOiBcIlwiLFxyXG4gIGRlYnVnTW9kZTogXCJXQVJOXCIsXHJcbiAgZGVuZHJvbk5vdGVEZWxpbWl0ZXI6IFwiLlwiLFxyXG4gIGRlbmRyb25Ob3RlRmllbGQ6IFwidXBcIixcclxuICBkdldhaXRUaW1lOiA1MDAwLFxyXG4gIGVuYWJsZUFscGhhU29ydDogdHJ1ZSxcclxuICBlbmFibGVSZWxhdGlvblN1Z2dlc3RvcjogZmFsc2UsXHJcbiAgZmllbGRTdWdnZXN0b3I6IHRydWUsXHJcbiAgZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlczogZmFsc2UsXHJcbiAganVnZ2xMYXlvdXQ6IFwiaGllcmFyY2h5XCIsXHJcbiAgbGltaXRXcml0ZUJDQ2hlY2tib3hlczogW10sXHJcbiAgQ0hFQ0tCT1hfU1RBVEVTX09WRVJXUklUVEVOOiBmYWxzZSxcclxuICBncmlkRGVmYXVsdERlcHRoOiAyNSxcclxuICBoaWVyYXJjaHlOb3RlczogW1wiXCJdLFxyXG4gIGhpZXJhcmNoeU5vdGVJc1BhcmVudDogZmFsc2UsXHJcbiAgSE5VcEZpZWxkOiBcIlwiLFxyXG4gIGluZGV4Tm90ZXM6IFtcIlwiXSxcclxuICBuYW1pbmdTeXN0ZW1GaWVsZDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1SZWdleDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1TcGxpdDogXCIuXCIsXHJcbiAgbmFtaW5nU3lzdGVtRW5kc1dpdGhEZWxpbWl0ZXI6IGZhbHNlLFxyXG4gIHJlZnJlc2hPbk5vdGVDaGFuZ2U6IGZhbHNlLFxyXG4gIHVzZUFsbE1ldGFkYXRhOiB0cnVlLFxyXG4gIG9wZW5NYXRyaXhPbkxvYWQ6IHRydWUsXHJcbiAgb3BlbkR1Y2tPbkxvYWQ6IGZhbHNlLFxyXG4gIG9wZW5Eb3duT25Mb2FkOiB0cnVlLFxyXG4gIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbDogZmFsc2UsXHJcbiAgc2hvd05hbWVPclR5cGU6IHRydWUsXHJcbiAgc2hvd1JlbGF0aW9uVHlwZTogdHJ1ZSxcclxuICByZWdleE5vdGVGaWVsZDogXCJcIixcclxuICByZWxTdWdnZXN0b3JUcmlnZ2VyOiBcIlxcXFxcIixcclxuICBybExlYWY6IHRydWUsXHJcbiAgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGU6IGZhbHNlLFxyXG4gIHNob3dBbGxBbGlhc2VzOiB0cnVlLFxyXG4gIHNob3dCQ3M6IHRydWUsXHJcbiAgc2hvd0JDc0luRWRpdExQTW9kZTogZmFsc2UsXHJcbiAgc2hvd1JlZnJlc2hOb3RpY2U6IHRydWUsXHJcbiAgc2hvd0ltcGxpZWRSZWxhdGlvbnM6IHRydWUsXHJcbiAgc2hvd1RyYWlsOiB0cnVlLFxyXG4gIHNob3dHcmlkOiB0cnVlLFxyXG4gIHNob3dKdWdnbDogZmFsc2UsXHJcbiAgc2hvd1ByZXZOZXh0OiB0cnVlLFxyXG4gIHNvcnRCeU5hbWVTaG93QWxpYXM6IGZhbHNlLFxyXG4gIHNxdWFyZURpcmVjdGlvbnNPcmRlcjogWzAsIDEsIDIsIDMsIDRdLFxyXG4gIGxpbWl0VHJhaWxDaGVja2JveGVzOiBbXSxcclxuICBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzOiBbXSxcclxuICBzaG93QWxsOiAnQWxsJyxcclxuICBub1BhdGhNZXNzYWdlOiBgVGhpcyBub3RlIGhhcyBubyByZWFsIG9yIGltcGxpZWQgcGFyZW50c2AsXHJcbiAgdGFnTm90ZUZpZWxkOiBcIlwiLFxyXG4gIHRocmVhZEludG9OZXdQYW5lOiBmYWxzZSxcclxuICB0aHJlYWRpbmdUZW1wbGF0ZTogXCJ7e2ZpZWxkfX0gb2Yge3tjdXJyZW50fX1cIixcclxuICB0aHJlYWRpbmdEaXJUZW1wbGF0ZXM6IHsgdXA6IFwiXCIsIHNhbWU6IFwiXCIsIGRvd246IFwiXCIsIG5leHQ6IFwiXCIsIHByZXY6IFwiXCIgfSxcclxuICB0aHJlYWRVbmRlckN1cnNvcjogZmFsc2UsXHJcbiAgdHJhaWxTZXBlcmF0b3I6IFwiXHUyMTkyXCIsXHJcbiAgdHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmc6IGZhbHNlLFxyXG4gIHRyaW1EZW5kcm9uTm90ZXM6IGZhbHNlLFxyXG4gIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGg6IHRydWUsXHJcbiAgdXNlckhpZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHVwOiBbXCJ1cFwiXSxcclxuICAgICAgc2FtZTogW1wic2FtZVwiXSxcclxuICAgICAgZG93bjogW1wiZG93blwiXSxcclxuICAgICAgbmV4dDogW1wibmV4dFwiXSxcclxuICAgICAgcHJldjogW1wicHJldlwiXSxcclxuICAgIH0sXHJcbiAgXSxcclxuICB3cml0ZUJDc0lubGluZTogZmFsc2UsXHJcbiAgc2hvd1dyaXRlQWxsQkNzQ21kOiBmYWxzZSxcclxuICB2aXNHcmFwaDogXCJGb3JjZSBEaXJlY3RlZCBHcmFwaFwiLFxyXG4gIHZpc1JlbGF0aW9uOiBcIlBhcmVudFwiLFxyXG4gIHZpc0Nsb3NlZDogXCJSZWFsXCIsXHJcbiAgdmlzQWxsOiBcIkFsbFwiLFxyXG4gIHdpa2lsaW5rSW5kZXg6IHRydWUsXHJcbiAgaW1wbGllZFJlbGF0aW9uczoge1xyXG4gICAgc2libGluZ0lkZW50aXR5OiBmYWxzZSxcclxuICAgIHNhbWVQYXJlbnRJc1NpYmxpbmc6IHRydWUsXHJcbiAgICBzaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmc6IGZhbHNlLFxyXG4gICAgc2libGluZ3NQYXJlbnRJc1BhcmVudDogZmFsc2UsXHJcbiAgICBwYXJlbnRzU2libGluZ3NJc1BhcmVudHM6IGZhbHNlLFxyXG4gICAgcGFyZW50c1BhcmVudHNJc1BhcmVudDogZmFsc2UsXHJcbiAgICBjb3VzaW5zSXNTaWJsaW5nOiBmYWxzZSxcclxuICB9LFxyXG4gIHJlZnJlc2hPbk5vdGVTYXZlOiBmYWxzZSxcclxuICBzaG93VXBJbkp1Z2dsOiBmYWxzZVxyXG59O1xyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgSXRlbVZpZXcsIFRGaWxlLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IERlYnVnZ2VyIH0gZnJvbSBcInNyYy9EZWJ1Z2dlclwiO1xyXG5pbXBvcnQgTWF0cml4IGZyb20gXCIuLi9Db21wb25lbnRzL01hdHJpeC5zdmVsdGVcIjtcclxuaW1wb3J0IHtcclxuICBBUlJPV19ESVJFQ1RJT05TLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRGlyZWN0aW9ucyxcclxuICBFZGdlQXR0cixcclxuICBpbnRlcm5hbExpbmtPYmosXHJcbiAgU3F1YXJlSXRlbSxcclxuICBTcXVhcmVQcm9wcyxcclxuICBVc2VySGllcixcclxufSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldE9wcERpciwgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0Q3VyckZpbGUsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBjbG9zZWRHLCBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBuZWlnaGJvdXJzID0gYmxhbmtSZWFsTkltcGxpZWQoKTtcclxuICBpZiAoIWNsb3NlZEcpIHJldHVybiBuZWlnaGJvdXJzO1xyXG5cclxuICBjbG9zZWRHLmZvckVhY2hFZGdlKGN1cnJOb2RlLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyLCBpbXBsaWVkIH0gPSBhIGFzIEVkZ2VBdHRyO1xyXG5cclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZWlnaGJvdXJzW2Rpcl0ucmVhbHMucHVzaCh7IHRvOiB0LCBmaWVsZCwgaW1wbGllZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5laWdoYm91cnNbZ2V0T3BwRGlyKGRpcildLmltcGxpZWRzLnB1c2goe1xyXG4gICAgICAgIHRvOiBzLFxyXG4gICAgICAgIGZpZWxkOiBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXSxcclxuICAgICAgICBpbXBsaWVkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIG5laWdoYm91cnM7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0cml4VmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogTWF0cml4O1xyXG4gIGRiOiBEZWJ1Z2dlcjtcclxuXHJcbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIobGVhZik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIocGx1Z2luKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLm9ubG9hZCgpO1xyXG4gICAgY29uc3QgeyBwbHVnaW4gfSA9IHRoaXM7XHJcblxyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dChcclxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyYXcoKSxcclxuICAgICAgICBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3XHJcbiAgICAgICAgICA/IGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcuYXBpXHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IHBsdWdpbi5zZXR0aW5ncy5kdldhaXRUaW1lXHJcbiAgICAgICAgICA6IDMwMDBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gTUFUUklYX1ZJRVc7XHJcbiAgfVxyXG4gIGdldERpc3BsYXlUZXh0KCkge1xyXG4gICAgcmV0dXJuIFwiQnJlYWRjcnVtYnMgTWF0cml4XCI7XHJcbiAgfVxyXG4gIGljb24gPSBUUkFJTF9JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGdldEFsdChub2RlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHsgcGx1Z2luIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgeyBhbHRMaW5rRmllbGRzLCBzaG93QWxsQWxpYXNlcyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gICAgaWYgKCFhbHRMaW5rRmllbGRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gZHYgRmlyc3RcclxuICAgIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICAgIGlmIChkdikge1xyXG4gICAgICBjb25zdCBwYWdlID0gZHYucGFnZShub2RlKTtcclxuICAgICAgaWYgKCFwYWdlKSByZXR1cm4gbnVsbDtcclxuICAgICAgZm9yIChjb25zdCBhbHQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGFnZVthbHRdIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm9kZSwgXCJcIik7XHJcbiAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgeyBmcm9udG1hdHRlciB9ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgYWx0RmllbGQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgICBjb25zdCBhcnI6IHN0cmluZ1tdID1cclxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gc3BsaXRBbmRUcmltKHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9JbnRlcm5hbExpbmtPYmogPSAoXHJcbiAgICB0bzogc3RyaW5nLFxyXG4gICAgcmVhbFEgPSB0cnVlLFxyXG4gICAgcGFyZW50OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgaW1wbGllZD86IHN0cmluZ1xyXG4gICk6IGludGVybmFsTGlua09iaiA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0byxcclxuICAgICAgY2xzOiBsaW5rQ2xhc3ModG8sIHJlYWxRKSxcclxuICAgICAgYWx0OiB0aGlzLmdldEFsdCh0byksXHJcbiAgICAgIG9yZGVyOiB0aGlzLmdldE9yZGVyKHRvKSxcclxuICAgICAgcGFyZW50LFxyXG4gICAgICBpbXBsaWVkLFxyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICAvLyBBTkNIT1IgUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkIGxpbmtzXHJcblxyXG4gIHJlbW92ZUR1cGxpY2F0ZUltcGxpZWQoXHJcbiAgICByZWFsczogaW50ZXJuYWxMaW5rT2JqW10sXHJcbiAgICBpbXBsaWVkczogaW50ZXJuYWxMaW5rT2JqW11cclxuICApOiBpbnRlcm5hbExpbmtPYmpbXSB7XHJcbiAgICBjb25zdCByZWFsVG9zID0gcmVhbHMubWFwKChyZWFsKSA9PiByZWFsLnRvKTtcclxuICAgIHJldHVybiBpbXBsaWVkcy5maWx0ZXIoKGltcGxpZWQpID0+ICFyZWFsVG9zLmluY2x1ZGVzKGltcGxpZWQudG8pKTtcclxuICB9XHJcblxyXG4gIGdldE9yZGVyID0gKG5vZGU6IHN0cmluZykgPT5cclxuICAgIE51bWJlci5wYXJzZUludCh0aGlzLnBsdWdpbi5tYWluRy5nZXROb2RlQXR0cmlidXRlKG5vZGUsIFwib3JkZXJcIikpO1xyXG5cclxuICBzb3J0SXRlbXNBbHBoYSA9IChhOiBpbnRlcm5hbExpbmtPYmosIGI6IGludGVybmFsTGlua09iaikgPT4ge1xyXG4gICAgY29uc3QgeyBzb3J0QnlOYW1lU2hvd0FsaWFzLCBhbHBoYVNvcnRBc2MgfSA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgY29uc3QgYVRvU29ydCA9IChzb3J0QnlOYW1lU2hvd0FsaWFzID8gYS50byA6IGEuYWx0ID8/IGEudG8pLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBiVG9Tb3J0ID0gKHNvcnRCeU5hbWVTaG93QWxpYXMgPyBiLnRvIDogYi5hbHQgPz8gYi50bykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBsZXNzID0gYWxwaGFTb3J0QXNjID8gLTEgOiAxO1xyXG4gICAgY29uc3QgbW9yZSA9IGFscGhhU29ydEFzYyA/IDEgOiAtMTtcclxuXHJcbiAgICByZXR1cm4gYVRvU29ydCA8IGJUb1NvcnQgPyBsZXNzIDogbW9yZTtcclxuICB9O1xyXG5cclxuICBnZXRIaWVyU3F1YXJlcyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGN1cnJGaWxlOiBURmlsZSk6IFNxdWFyZVByb3BzW11bXSB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgbWFpbkcsIHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IGVuYWJsZUFscGhhU29ydCwgc3F1YXJlRGlyZWN0aW9uc09yZGVyIH0gPSBzZXR0aW5ncztcclxuICAgIGlmICghbWFpbkcpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBjdXJyRmlsZTtcclxuICAgIGlmICghbWFpbkcuaGFzTm9kZShiYXNlbmFtZSkpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IHJlYWxzbkltcGxpZWRzID0gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW4sIGJhc2VuYW1lKTtcclxuXHJcbiAgICByZXR1cm4gdXNlckhpZXJzLm1hcCgoaGllcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFJlYWxOSW1wbGllZCA9IGJsYW5rUmVhbE5JbXBsaWVkKCkgYXMgdW5rbm93biBhcyB7XHJcbiAgICAgICAgW2RpciBpbiBEaXJlY3Rpb25zXToge1xyXG4gICAgICAgICAgcmVhbHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgICAgaW1wbGllZHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXN1bHRzRmlsdGVyID0gKFxyXG4gICAgICAgIGl0ZW06IFNxdWFyZUl0ZW0sXHJcbiAgICAgICAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gICAgICAgIG9wcERpcjogRGlyZWN0aW9ucyxcclxuICAgICAgICBhcnJvdzogc3RyaW5nXHJcbiAgICAgICkgPT5cclxuICAgICAgICBoaWVyW2Rpcl0uaW5jbHVkZXMoaXRlbS5maWVsZCkgfHxcclxuICAgICAgICAoaXRlbS5maWVsZC5pbmNsdWRlcyhgPCR7YXJyb3d9PmApICYmXHJcbiAgICAgICAgICBoaWVyW29wcERpcl0uaW5jbHVkZXMoaXRlbS5maWVsZC5zcGxpdChcIiA8XCIpWzBdKSk7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGRpciBpbiByZWFsc25JbXBsaWVkcykge1xyXG4gICAgICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIgYXMgRGlyZWN0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgYXJyb3cgPSBBUlJPV19ESVJFQ1RJT05TW2Rpcl07XHJcbiAgICAgICAgY29uc3QgeyByZWFscywgaW1wbGllZHMgfSA9IHJlYWxzbkltcGxpZWRzW2Rpcl07XHJcblxyXG4gICAgICAgIGZpbHRlcmVkUmVhbE5JbXBsaWVkW2Rpcl0ucmVhbHMgPSByZWFsc1xyXG4gICAgICAgICAgLmZpbHRlcigocmVhbCkgPT5cclxuICAgICAgICAgICAgcmVzdWx0c0ZpbHRlcihyZWFsLCBkaXIgYXMgRGlyZWN0aW9ucywgb3BwRGlyLCBhcnJvdylcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgIHRoaXMudG9JbnRlcm5hbExpbmtPYmooaXRlbS50bywgdHJ1ZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZmlsdGVyZWRSZWFsTkltcGxpZWRbZGlyXS5pbXBsaWVkcyA9IGltcGxpZWRzXHJcbiAgICAgICAgICAuZmlsdGVyKChpbXBsaWVkKSA9PlxyXG4gICAgICAgICAgICByZXN1bHRzRmlsdGVyKGltcGxpZWQsIGRpciBhcyBEaXJlY3Rpb25zLCBvcHBEaXIsIGFycm93KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT5cclxuICAgICAgICAgICAgdGhpcy50b0ludGVybmFsTGlua09iaihpdGVtLnRvLCBmYWxzZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHtcclxuICAgICAgICB1cDogeyByZWFsczogcnUsIGltcGxpZWRzOiBpdSB9LFxyXG4gICAgICAgIHNhbWU6IHsgcmVhbHM6IHJzLCBpbXBsaWVkczogaXMgfSxcclxuICAgICAgICBkb3duOiB7IHJlYWxzOiByZCwgaW1wbGllZHM6IGlkIH0sXHJcbiAgICAgICAgbmV4dDogeyByZWFsczogcm4sIGltcGxpZWRzOiBpTiB9LFxyXG4gICAgICAgIHByZXY6IHsgcmVhbHM6IHJwLCBpbXBsaWVkczogaXAgfSxcclxuICAgICAgfSA9IGZpbHRlcmVkUmVhbE5JbXBsaWVkO1xyXG5cclxuICAgICAgLy8gIVNFQ1RJT05cclxuXHJcbiAgICAgIFtpdSwgaXMsIGlkLCBpTiwgaXBdID0gW1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChydSwgaXUpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycywgaXMpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChyZCwgaWQpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChybiwgaU4pLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycCwgaXApLFxyXG4gICAgICBdO1xyXG5cclxuICAgICAgY29uc3QgaVNhbWVOb0R1cDogaW50ZXJuYWxMaW5rT2JqW10gPSBbXTtcclxuICAgICAgaXMuZm9yRWFjaCgoaW1wU2liKSA9PiB7XHJcbiAgICAgICAgaWYgKGlTYW1lTm9EdXAuZXZlcnkoKG5vRHVwKSA9PiBub0R1cC50byAhPT0gaW1wU2liLnRvKSkge1xyXG4gICAgICAgICAgaVNhbWVOb0R1cC5wdXNoKGltcFNpYik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaXMgPSBpU2FtZU5vRHVwO1xyXG5cclxuICAgICAgY29uc3QgZ2V0RmllbGRJbkhpZXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgICAgIGhpZXJbZGlyXVswXVxyXG4gICAgICAgICAgPyBoaWVyW2Rpcl0uam9pbihcIiwgXCIpXHJcbiAgICAgICAgICA6IGAke2hpZXJbZ2V0T3BwRGlyKGRpcildLmpvaW4oXCIsXCIpfSR7QVJST1dfRElSRUNUSU9OU1tkaXJdfWA7XHJcblxyXG4gICAgICBjb25zdCBzcXVhcmVzID0gW3J1LCBycywgcmQsIHJuLCBycCwgaXUsIGlzLCBpZCwgaU4sIGlwXTtcclxuXHJcbiAgICAgIGlmIChlbmFibGVBbHBoYVNvcnQpXHJcbiAgICAgICAgc3F1YXJlcy5mb3JFYWNoKChzcSkgPT4gc3Euc29ydCh0aGlzLnNvcnRJdGVtc0FscGhhKSk7XHJcblxyXG4gICAgICBzcXVhcmVzLmZvckVhY2goKHNxKSA9PiBzcS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikpO1xyXG5cclxuICAgICAgaW5mbyhbXHJcbiAgICAgICAgeyBydSB9LFxyXG4gICAgICAgIHsgcnMgfSxcclxuICAgICAgICB7IHJkIH0sXHJcbiAgICAgICAgeyBybiB9LFxyXG4gICAgICAgIHsgcnAgfSxcclxuICAgICAgICB7IGl1IH0sXHJcbiAgICAgICAgeyBpcyB9LFxyXG4gICAgICAgIHsgaWQgfSxcclxuICAgICAgICB7IGlOIH0sXHJcbiAgICAgICAgeyBpcCB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGNvbnN0IHNxdWFyZSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJ1LFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpdSxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInVwXCIpLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJlYWxJdGVtczogcnMsXHJcbiAgICAgICAgICBpbXBsaWVkSXRlbXM6IGlzLFxyXG4gICAgICAgICAgZmllbGQ6IGdldEZpZWxkSW5IaWVyKFwic2FtZVwiKSxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJkLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpZCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcImRvd25cIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJuLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpTixcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcIm5leHRcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJwLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpcCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInByZXZcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuXHJcbiAgICAgIHJldHVybiBzcXVhcmVEaXJlY3Rpb25zT3JkZXIubWFwKChvcmRlcikgPT4gc3F1YXJlW29yZGVyXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB7IGNvbnRlbnRFbCwgZGIsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgICAgZGIuc3RhcnQyRyhcIkRyYXcgTWF0cml4IFZpZXdcIik7XHJcbiAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgICAgY29uc3QgeyB1c2VySGllcnMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICAgICAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgaGllclNxdWFyZXMgPSB0aGlzLmdldEhpZXJTcXVhcmVzKHVzZXJIaWVycywgY3VyckZpbGUpLmZpbHRlcihcclxuICAgICAgICAoc3F1YXJlQXJyKSA9PlxyXG4gICAgICAgICAgc3F1YXJlQXJyLnNvbWUoXHJcbiAgICAgICAgICAgIChzcSkgPT4gc3EucmVhbEl0ZW1zLmxlbmd0aCArIHNxLmltcGxpZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBuZXcgTWF0cml4KHtcclxuICAgICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgICBwcm9wczogeyBoaWVyU3F1YXJlcywgbWF0cml4VmlldzogdGhpcywgY3VyckZpbGUgfSxcclxuICAgICAgfSlcclxuXHJcblxyXG4gICAgICBkYi5lbmQyRygpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGVycm9yKGVycik7XHJcbiAgICAgIHRoaXMuZGIuZW5kMkcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IGRlYnVnLCBpbmZvLCBsZXZlbHMgfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRGVidWdnZXIge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBkZWJ1Z0xlc3NUaGFuID0gKGxldmVsOiBudW1iZXIpID0+XHJcbiAgICBsZXZlbHNbdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlXSA8IGxldmVsO1xyXG5cclxuICBzdGFydDJHKGdyb3VwOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMykpIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoZ3JvdXApO1xyXG4gIH1cclxuICBlbmQyRyguLi5tc2dzOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuZGVidWdMZXNzVGhhbigzKSkge1xyXG4gICAgICBpZiAobXNncy5sZW5ndGgpIGluZm8oLi4ubXNncyk7XHJcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnQxRyhncm91cDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Z0xlc3NUaGFuKDIpKSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGdyb3VwKTtcclxuICB9XHJcbiAgZW5kMUcoLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMikpIHtcclxuICAgICAgaWYgKG1zZ3MubGVuZ3RoKSBkZWJ1ZyguLi5tc2dzKTtcclxuICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRHcyguLi5ncm91cHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnN0YXJ0MkcoZ3JvdXBzWzBdKTtcclxuICAgIGlmIChncm91cHNbMV0pIHRoaXMuc3RhcnQxRyhncm91cHNbMV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5kIGEgZGVidWcgYW5kIGluZm8gZ3JvdXAsIGxvZ2dpbmcgYG1zZ3NgIGluIGBlbmREZWJ1Z0dyb3VwYFxyXG4gICAqIEBwYXJhbSAgezF8Mn0gY291bnQgVGhlIG51bWJlciBvZiBncm91cHMgdG8gZW5kLiBgMWAgZW5kcyBUcmFjZSwgMiBlbmRzIGJvdGhcclxuICAgKiBAcGFyYW0gIHthbnlbXX0gLi4ubXNnc1xyXG4gICAqL1xyXG4gIGVuZEdzKGNvdW50OiAxIHwgMiwgLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmIChjb3VudCA9PT0gMSkgdGhpcy5lbmQyRyguLi5tc2dzKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZDFHKCk7XHJcbiAgICAgIHRoaXMuZW5kMkcoLi4ubXNncyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5sZXQgc3JjX3VybF9lcXVhbF9hbmNob3I7XG5mdW5jdGlvbiBzcmNfdXJsX2VxdWFsKGVsZW1lbnRfc3JjLCB1cmwpIHtcbiAgICBpZiAoIXNyY191cmxfZXF1YWxfYW5jaG9yKSB7XG4gICAgICAgIHNyY191cmxfZXF1YWxfYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIH1cbiAgICBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmID0gdXJsO1xuICAgIHJldHVybiBlbGVtZW50X3NyYyA9PT0gc3JjX3VybF9lcXVhbF9hbmNob3IuaHJlZjtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiBpc19lbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuICAgIGlmIChzdG9yZSAhPSBudWxsICYmIHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgLi4uY2FsbGJhY2tzKSB7XG4gICAgaWYgKHN0b3JlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuICAgIGNvbnN0IHVuc3ViID0gc3RvcmUuc3Vic2NyaWJlKC4uLmNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdICYmIGZuXG4gICAgICAgID8gYXNzaWduKCQkc2NvcGUuY3R4LnNsaWNlKCksIGRlZmluaXRpb25bMV0oZm4oY3R4KSkpXG4gICAgICAgIDogJCRzY29wZS5jdHg7XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jaGFuZ2VzKGRlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uWzJdICYmIGZuKSB7XG4gICAgICAgIGNvbnN0IGxldHMgPSBkZWZpbml0aW9uWzJdKGZuKGRpcnR5KSk7XG4gICAgICAgIGlmICgkJHNjb3BlLmRpcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGV0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgoJCRzY29wZS5kaXJ0eS5sZW5ndGgsIGxldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRbaV0gPSAkJHNjb3BlLmRpcnR5W2ldIHwgbGV0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQkc2NvcGUuZGlydHkgfCBsZXRzO1xuICAgIH1cbiAgICByZXR1cm4gJCRzY29wZS5kaXJ0eTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbikge1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Qoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgY29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTtcbiAgICB1cGRhdGVfc2xvdF9iYXNlKHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBzbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHRfZm4pO1xufVxuZnVuY3Rpb24gZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlKCQkc2NvcGUpIHtcbiAgICBpZiAoJCRzY29wZS5jdHgubGVuZ3RoID4gMzIpIHtcbiAgICAgICAgY29uc3QgZGlydHkgPSBbXTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gJCRzY29wZS5jdHgubGVuZ3RoIC8gMzI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRpcnR5W2ldID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfcmVzdF9wcm9wcyhwcm9wcywga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSB7fTtcbiAgICBrZXlzID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmICgha2V5cy5oYXMoaykgJiYga1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9zbG90cyhzbG90cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5jb25zdCBoYXNfcHJvcCA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuZnVuY3Rpb24gYWN0aW9uX2Rlc3Ryb3llcihhY3Rpb25fcmVzdWx0KSB7XG4gICAgcmV0dXJuIGFjdGlvbl9yZXN1bHQgJiYgaXNfZnVuY3Rpb24oYWN0aW9uX3Jlc3VsdC5kZXN0cm95KSA/IGFjdGlvbl9yZXN1bHQuZGVzdHJveSA6IG5vb3A7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gcnVuX3Rhc2tzKG5vdykge1xuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgIGlmICghdGFzay5jKG5vdykpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRhc2suZigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRhc2tzLnNpemUgIT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IVxuICovXG5mdW5jdGlvbiBjbGVhcl9sb29wcygpIHtcbiAgICB0YXNrcy5jbGVhcigpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhc2sgdGhhdCBydW5zIG9uIGVhY2ggcmFmIGZyYW1lXG4gKiB1bnRpbCBpdCByZXR1cm5zIGEgZmFsc3kgdmFsdWUgb3IgaXMgYWJvcnRlZFxuICovXG5mdW5jdGlvbiBsb29wKGNhbGxiYWNrKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKHRhc2tzLnNpemUgPT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bGZpbGwgPT4ge1xuICAgICAgICAgICAgdGFza3MuYWRkKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgYWJvcnQoKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUcmFjayB3aGljaCBub2RlcyBhcmUgY2xhaW1lZCBkdXJpbmcgaHlkcmF0aW9uLiBVbmNsYWltZWQgbm9kZXMgY2FuIHRoZW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBET01cbi8vIGF0IHRoZSBlbmQgb2YgaHlkcmF0aW9uIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlbWFpbmluZyBub2Rlcy5cbmxldCBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHN0YXJ0X2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gZW5kX2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwcGVyX2JvdW5kKGxvdywgaGlnaCwga2V5LCB2YWx1ZSkge1xuICAgIC8vIFJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZSBsYXJnZXIgdGhhbiBpbnB1dCB2YWx1ZSBpbiB0aGUgcmFuZ2UgW2xvdywgaGlnaClcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpO1xuICAgICAgICBpZiAoa2V5KG1pZCkgPD0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG59XG5mdW5jdGlvbiBpbml0X2h5ZHJhdGUodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oeWRyYXRlX2luaXQpXG4gICAgICAgIHJldHVybjtcbiAgICB0YXJnZXQuaHlkcmF0ZV9pbml0ID0gdHJ1ZTtcbiAgICAvLyBXZSBrbm93IHRoYXQgYWxsIGNoaWxkcmVuIGhhdmUgY2xhaW1fb3JkZXIgdmFsdWVzIHNpbmNlIHRoZSB1bmNsYWltZWQgaGF2ZSBiZWVuIGRldGFjaGVkIGlmIHRhcmdldCBpcyBub3QgPGhlYWQ+XG4gICAgbGV0IGNoaWxkcmVuID0gdGFyZ2V0LmNoaWxkTm9kZXM7XG4gICAgLy8gSWYgdGFyZ2V0IGlzIDxoZWFkPiwgdGhlcmUgbWF5IGJlIGNoaWxkcmVuIHdpdGhvdXQgY2xhaW1fb3JkZXJcbiAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lID09PSAnSEVBRCcpIHtcbiAgICAgICAgY29uc3QgbXlDaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobm9kZS5jbGFpbV9vcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbXlDaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuID0gbXlDaGlsZHJlbjtcbiAgICB9XG4gICAgLypcbiAgICAqIFJlb3JkZXIgY2xhaW1lZCBjaGlsZHJlbiBvcHRpbWFsbHkuXG4gICAgKiBXZSBjYW4gcmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseSBieSBmaW5kaW5nIHRoZSBsb25nZXN0IHN1YnNlcXVlbmNlIG9mXG4gICAgKiBub2RlcyB0aGF0IGFyZSBhbHJlYWR5IGNsYWltZWQgaW4gb3JkZXIgYW5kIG9ubHkgbW92aW5nIHRoZSByZXN0LiBUaGUgbG9uZ2VzdFxuICAgICogc3Vic2VxdWVuY2Ugc3Vic2VxdWVuY2Ugb2Ygbm9kZXMgdGhhdCBhcmUgY2xhaW1lZCBpbiBvcmRlciBjYW4gYmUgZm91bmQgYnlcbiAgICAqIGNvbXB1dGluZyB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIC5jbGFpbV9vcmRlciB2YWx1ZXMuXG4gICAgKlxuICAgICogVGhpcyBhbGdvcml0aG0gaXMgb3B0aW1hbCBpbiBnZW5lcmF0aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgcmVvcmRlciBvcGVyYXRpb25zXG4gICAgKiBwb3NzaWJsZS5cbiAgICAqXG4gICAgKiBQcm9vZjpcbiAgICAqIFdlIGtub3cgdGhhdCwgZ2l2ZW4gYSBzZXQgb2YgcmVvcmRlcmluZyBvcGVyYXRpb25zLCB0aGUgbm9kZXMgdGhhdCBkbyBub3QgbW92ZVxuICAgICogYWx3YXlzIGZvcm0gYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSwgc2luY2UgdGhleSBkbyBub3QgbW92ZSBhbW9uZyBlYWNoIG90aGVyXG4gICAgKiBtZWFuaW5nIHRoYXQgdGhleSBtdXN0IGJlIGFscmVhZHkgb3JkZXJlZCBhbW9uZyBlYWNoIG90aGVyLiBUaHVzLCB0aGUgbWF4aW1hbFxuICAgICogc2V0IG9mIG5vZGVzIHRoYXQgZG8gbm90IG1vdmUgZm9ybSBhIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZS5cbiAgICAqL1xuICAgIC8vIENvbXB1dGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgLy8gbTogc3Vic2VxdWVuY2UgbGVuZ3RoIGogPT4gaW5kZXggayBvZiBzbWFsbGVzdCB2YWx1ZSB0aGF0IGVuZHMgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggalxuICAgIGNvbnN0IG0gPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGggKyAxKTtcbiAgICAvLyBQcmVkZWNlc3NvciBpbmRpY2VzICsgMVxuICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGgpO1xuICAgIG1bMF0gPSAtMTtcbiAgICBsZXQgbG9uZ2VzdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gY2hpbGRyZW5baV0uY2xhaW1fb3JkZXI7XG4gICAgICAgIC8vIEZpbmQgdGhlIGxhcmdlc3Qgc3Vic2VxdWVuY2UgbGVuZ3RoIHN1Y2ggdGhhdCBpdCBlbmRzIGluIGEgdmFsdWUgbGVzcyB0aGFuIG91ciBjdXJyZW50IHZhbHVlXG4gICAgICAgIC8vIHVwcGVyX2JvdW5kIHJldHVybnMgZmlyc3QgZ3JlYXRlciB2YWx1ZSwgc28gd2Ugc3VidHJhY3Qgb25lXG4gICAgICAgIC8vIHdpdGggZmFzdCBwYXRoIGZvciB3aGVuIHdlIGFyZSBvbiB0aGUgY3VycmVudCBsb25nZXN0IHN1YnNlcXVlbmNlXG4gICAgICAgIGNvbnN0IHNlcUxlbiA9ICgobG9uZ2VzdCA+IDAgJiYgY2hpbGRyZW5bbVtsb25nZXN0XV0uY2xhaW1fb3JkZXIgPD0gY3VycmVudCkgPyBsb25nZXN0ICsgMSA6IHVwcGVyX2JvdW5kKDEsIGxvbmdlc3QsIGlkeCA9PiBjaGlsZHJlblttW2lkeF1dLmNsYWltX29yZGVyLCBjdXJyZW50KSkgLSAxO1xuICAgICAgICBwW2ldID0gbVtzZXFMZW5dICsgMTtcbiAgICAgICAgY29uc3QgbmV3TGVuID0gc2VxTGVuICsgMTtcbiAgICAgICAgLy8gV2UgY2FuIGd1YXJhbnRlZSB0aGF0IGN1cnJlbnQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlLiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgZ2VuZXJhdGVkIGEgbG9uZ2VyIHNlcXVlbmNlLlxuICAgICAgICBtW25ld0xlbl0gPSBpO1xuICAgICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmV3TGVuLCBsb25nZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBub2RlcyAoaW5pdGlhbGx5IHJldmVyc2VkKVxuICAgIGNvbnN0IGxpcyA9IFtdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBub2Rlcywgbm9kZXMgdGhhdCB3aWxsIGJlIG1vdmVkXG4gICAgY29uc3QgdG9Nb3ZlID0gW107XG4gICAgbGV0IGxhc3QgPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IGN1ciA9IG1bbG9uZ2VzdF0gKyAxOyBjdXIgIT0gMDsgY3VyID0gcFtjdXIgLSAxXSkge1xuICAgICAgICBsaXMucHVzaChjaGlsZHJlbltjdXIgLSAxXSk7XG4gICAgICAgIGZvciAoOyBsYXN0ID49IGN1cjsgbGFzdC0tKSB7XG4gICAgICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdC0tO1xuICAgIH1cbiAgICBmb3IgKDsgbGFzdCA+PSAwOyBsYXN0LS0pIHtcbiAgICAgICAgdG9Nb3ZlLnB1c2goY2hpbGRyZW5bbGFzdF0pO1xuICAgIH1cbiAgICBsaXMucmV2ZXJzZSgpO1xuICAgIC8vIFdlIHNvcnQgdGhlIG5vZGVzIGJlaW5nIG1vdmVkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZWlyIGluc2VydGlvbiBvcmRlciBtYXRjaGVzIHRoZSBjbGFpbSBvcmRlclxuICAgIHRvTW92ZS5zb3J0KChhLCBiKSA9PiBhLmNsYWltX29yZGVyIC0gYi5jbGFpbV9vcmRlcik7XG4gICAgLy8gRmluYWxseSwgd2UgbW92ZSB0aGUgbm9kZXNcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0b01vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd2hpbGUgKGogPCBsaXMubGVuZ3RoICYmIHRvTW92ZVtpXS5jbGFpbV9vcmRlciA+PSBsaXNbal0uY2xhaW1fb3JkZXIpIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmNob3IgPSBqIDwgbGlzLmxlbmd0aCA/IGxpc1tqXSA6IG51bGw7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUodG9Nb3ZlW2ldLCBhbmNob3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIG5vZGUpIHtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzKHRhcmdldCwgc3R5bGVfc2hlZXRfaWQsIHN0eWxlcykge1xuICAgIGNvbnN0IGFwcGVuZF9zdHlsZXNfdG8gPSBnZXRfcm9vdF9mb3Jfc3R5bGUodGFyZ2V0KTtcbiAgICBpZiAoIWFwcGVuZF9zdHlsZXNfdG8uZ2V0RWxlbWVudEJ5SWQoc3R5bGVfc2hlZXRfaWQpKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaWQgPSBzdHlsZV9zaGVldF9pZDtcbiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgICAgIGFwcGVuZF9zdHlsZXNoZWV0KGFwcGVuZF9zdHlsZXNfdG8sIHN0eWxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSkge1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIGNvbnN0IHJvb3QgPSBub2RlLmdldFJvb3ROb2RlID8gbm9kZS5nZXRSb290Tm9kZSgpIDogbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmIChyb290ICYmIHJvb3QuaG9zdCkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpIHtcbiAgICBjb25zdCBzdHlsZV9lbGVtZW50ID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICBhcHBlbmRfc3R5bGVzaGVldChnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSksIHN0eWxlX2VsZW1lbnQpO1xuICAgIHJldHVybiBzdHlsZV9lbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX3N0eWxlc2hlZXQobm9kZSwgc3R5bGUpIHtcbiAgICBhcHBlbmQobm9kZS5oZWFkIHx8IG5vZGUsIHN0eWxlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKSB7XG4gICAgaWYgKGlzX2h5ZHJhdGluZykge1xuICAgICAgICBpbml0X2h5ZHJhdGUodGFyZ2V0KTtcbiAgICAgICAgaWYgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9PT0gdW5kZWZpbmVkKSB8fCAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQucGFyZW50RWxlbWVudCAhPT0gdGFyZ2V0KSkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBub2RlcyBvZiB1bmRlZmluZWQgb3JkZXJpbmdcbiAgICAgICAgd2hpbGUgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCAhPT0gbnVsbCkgJiYgKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLmNsYWltX29yZGVyID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlICE9PSB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBpbnNlcnQgaWYgdGhlIG9yZGVyaW5nIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUgbW9kaWZpZWQgb3IgdGhlIHBhcmVudCBub2RlIGlzIG5vdCB0YXJnZXRcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQgfHwgbm9kZS5wYXJlbnROb2RlICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nICYmICFhbmNob3IpIHtcbiAgICAgICAgYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9IGFuY2hvcikge1xuICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2gobm9kZSkge1xuICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfZWFjaChpdGVyYXRpb25zLCBkZXRhY2hpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnNbaV0pXG4gICAgICAgICAgICBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRfaXMobmFtZSwgaXMpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuZnVuY3Rpb24gb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcyhvYmosIGV4Y2x1ZGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChoYXNfcHJvcChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiB0cnVzdGVkKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChldmVudC5pc1RydXN0ZWQpXG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5vZGUuX19wcm90b19fKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXNjcmlwdG9yc1trZXldICYmIGRlc2NyaXB0b3JzW2tleV0uc2V0KSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHR5cGVvZiBub2RlW3Byb3BdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICcnID8gdHJ1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXAsIF9fdmFsdWUsIGNoZWNrZWQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChncm91cFtpXS5jaGVja2VkKVxuICAgICAgICAgICAgdmFsdWUuYWRkKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgdmFsdWUuZGVsZXRlKF9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRpbWVfcmFuZ2VzX3RvX2FycmF5KHJhbmdlcykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gY2hpbGRyZW4oZWxlbWVudCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5mdW5jdGlvbiBpbml0X2NsYWltX2luZm8obm9kZXMpIHtcbiAgICBpZiAobm9kZXMuY2xhaW1faW5mbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGVzLmNsYWltX2luZm8gPSB7IGxhc3RfaW5kZXg6IDAsIHRvdGFsX2NsYWltZWQ6IDAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGFpbV9ub2RlKG5vZGVzLCBwcmVkaWNhdGUsIHByb2Nlc3NOb2RlLCBjcmVhdGVOb2RlLCBkb250VXBkYXRlTGFzdEluZGV4ID0gZmFsc2UpIHtcbiAgICAvLyBUcnkgdG8gZmluZCBub2RlcyBpbiBhbiBvcmRlciBzdWNoIHRoYXQgd2UgbGVuZ3RoZW4gdGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgcmVzdWx0Tm9kZSA9ICgoKSA9PiB7XG4gICAgICAgIC8vIFdlIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZVxuICAgICAgICBmb3IgKGxldCBpID0gbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4OyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHByb2Nlc3NOb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZG9udFVwZGF0ZUxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHRyeSB0byBmaW5kIG9uZSBiZWZvcmVcbiAgICAgICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIHNvIHRoYXQgd2UgZG9uJ3QgZ28gdG9vIGZhciBiYWNrXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2Ugc3BsaWNlZCBiZWZvcmUgdGhlIGxhc3RfaW5kZXgsIHdlIGRlY3JlYXNlIGl0XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGFueSBtYXRjaGluZyBub2RlLCB3ZSBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIHJldHVybiBjcmVhdGVOb2RlKCk7XG4gICAgfSkoKTtcbiAgICByZXN1bHROb2RlLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgIG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZCArPSAxO1xuICAgIHJldHVybiByZXN1bHROb2RlO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBjcmVhdGVfZWxlbWVudCkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlTmFtZSA9PT0gbmFtZSwgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlLnB1c2goYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZS5mb3JFYWNoKHYgPT4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUodikpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sICgpID0+IGNyZWF0ZV9lbGVtZW50KG5hbWUpKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGNsYWltX3N2Z19lbGVtZW50KG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX2VsZW1lbnRfYmFzZShub2RlcywgbmFtZSwgYXR0cmlidXRlcywgc3ZnX2VsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMywgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YVN0ciA9ICcnICsgZGF0YTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YS5zdGFydHNXaXRoKGRhdGFTdHIpKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhLmxlbmd0aCAhPT0gZGF0YVN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zcGxpdFRleHQoZGF0YVN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gZGF0YVN0cjtcbiAgICAgICAgfVxuICAgIH0sICgpID0+IHRleHQoZGF0YSksIHRydWUgLy8gVGV4dCBub2RlcyBzaG91bGQgbm90IHVwZGF0ZSBsYXN0IGluZGV4IHNpbmNlIGl0IGlzIGxpa2VseSBub3Qgd29ydGggaXQgdG8gZWxpbWluYXRlIGFuIGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgYWN0dWFsIGVsZW1lbnRzXG4gICAgKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBmaW5kX2NvbW1lbnQobm9kZXMsIHRleHQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBjb21tZW50IG5vZGUgKi8gJiYgbm9kZS50ZXh0Q29udGVudC50cmltKCkgPT09IHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBjbGFpbV9odG1sX3RhZyhub2Rlcykge1xuICAgIC8vIGZpbmQgaHRtbCBvcGVuaW5nIHRhZ1xuICAgIGNvbnN0IHN0YXJ0X2luZGV4ID0gZmluZF9jb21tZW50KG5vZGVzLCAnSFRNTF9UQUdfU1RBUlQnLCAwKTtcbiAgICBjb25zdCBlbmRfaW5kZXggPSBmaW5kX2NvbW1lbnQobm9kZXMsICdIVE1MX1RBR19FTkQnLCBzdGFydF9pbmRleCk7XG4gICAgaWYgKHN0YXJ0X2luZGV4ID09PSBlbmRfaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKCk7XG4gICAgfVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgaHRtbF90YWdfbm9kZXMgPSBub2Rlcy5zcGxpY2Uoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCArIDEpO1xuICAgIGRldGFjaChodG1sX3RhZ19ub2Rlc1swXSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzW2h0bWxfdGFnX25vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICBjb25zdCBjbGFpbWVkX25vZGVzID0gaHRtbF90YWdfbm9kZXMuc2xpY2UoMSwgaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMSk7XG4gICAgZm9yIChjb25zdCBuIG9mIGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgbi5jbGFpbV9vcmRlciA9IG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZDtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHRtbFRhZ0h5ZHJhdGlvbihjbGFpbWVkX25vZGVzKTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhKHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3R5cGUoaW5wdXQsIHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpbnB1dC50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdHlsZShub2RlLCBrZXksIHZhbHVlLCBpbXBvcnRhbnQpIHtcbiAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IC0xOyAvLyBubyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkXG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIGJ1YmJsZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBidWJibGVzLCBmYWxzZSwgZGV0YWlsKTtcbiAgICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5X3NlbGVjdG9yX2FsbChzZWxlY3RvciwgcGFyZW50ID0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG59XG5jbGFzcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICB9XG4gICAgbShodG1sLCB0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmUpIHtcbiAgICAgICAgICAgIHRoaXMuZSA9IGVsZW1lbnQodGFyZ2V0Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuYyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmkoYW5jaG9yKTtcbiAgICB9XG4gICAgaChodG1sKSB7XG4gICAgICAgIHRoaXMuZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB0aGlzLm4gPSBBcnJheS5mcm9tKHRoaXMuZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydCh0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwKGh0bWwpIHtcbiAgICAgICAgdGhpcy5kKCk7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICAgICAgdGhpcy5pKHRoaXMuYSk7XG4gICAgfVxuICAgIGQoKSB7XG4gICAgICAgIHRoaXMubi5mb3JFYWNoKGRldGFjaCk7XG4gICAgfVxufVxuY2xhc3MgSHRtbFRhZ0h5ZHJhdGlvbiBleHRlbmRzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sID0gY2xhaW1lZF9ub2RlcztcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIGlmICh0aGlzLmwpIHtcbiAgICAgICAgICAgIHRoaXMubiA9IHRoaXMubDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLmMoaHRtbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydF9oeWRyYXRpb24odGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyaWJ1dGVfdG9fb2JqZWN0KGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKGVsZW1lbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHRbbm9kZS5zbG90IHx8ICdkZWZhdWx0J10gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFjdGl2ZV9kb2NzID0gbmV3IFNldCgpO1xubGV0IGFjdGl2ZSA9IDA7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBjb25zdCBkb2MgPSBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSk7XG4gICAgYWN0aXZlX2RvY3MuYWRkKGRvYyk7XG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0IHx8IChkb2MuX19zdmVsdGVfc3R5bGVzaGVldCA9IGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpLnNoZWV0KTtcbiAgICBjb25zdCBjdXJyZW50X3J1bGVzID0gZG9jLl9fc3ZlbHRlX3J1bGVzIHx8IChkb2MuX19zdmVsdGVfcnVsZXMgPSB7fSk7XG4gICAgaWYgKCFjdXJyZW50X3J1bGVzW25hbWVdKSB7XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiAnJ30ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJykuc3BsaXQoJywgJyk7XG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihuYW1lXG4gICAgICAgID8gYW5pbSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgOiBhbmltID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHByZXZpb3VzLmxlbmd0aCAtIG5leHQubGVuZ3RoO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gbmV4dC5qb2luKCcsICcpO1xuICAgICAgICBhY3RpdmUgLT0gZGVsZXRlZDtcbiAgICAgICAgaWYgKCFhY3RpdmUpXG4gICAgICAgICAgICBjbGVhcl9ydWxlcygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGl2ZV9kb2NzLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2MuX19zdmVsdGVfc3R5bGVzaGVldDtcbiAgICAgICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpKTtcbiAgICAgICAgICAgIGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlX2RvY3MuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuZnVuY3Rpb24gZ2V0QWxsQ29udGV4dHMoKSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQ7XG59XG5mdW5jdGlvbiBoYXNDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmhhcyhrZXkpO1xufVxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbmZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1tldmVudC50eXBlXTtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbi5jYWxsKHRoaXMsIGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5sZXQgZmx1c2hpbmcgPSBmYWxzZTtcbmNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKGZsdXNoaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgc2Vlbl9jYWxsYmFja3MuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAkJC51cGRhdGUoKTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgY29uc3QgZGlydHkgPSAkJC5kaXJ0eTtcbiAgICAgICAgJCQuZGlydHkgPSBbLTFdO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbihnbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX291dF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGNvbnN0IGdyb3VwID0gb3V0cm9zO1xuICAgIGdyb3VwLnIgKz0gMTtcbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ3N0YXJ0JykpO1xuICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWdyb3VwLnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXN1bHQgaW4gYGVuZCgpYCBiZWluZyBjYWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFuIHVwIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwoZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSAtIHQsIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICBnbygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdvKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVuZChyZXNldCkge1xuICAgICAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnRpY2soMSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuICAgIGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBhbmltYXRpb25fbmFtZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY2xlYXJfYW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZCA9IChwcm9ncmFtLmIgLSB0KTtcbiAgICAgICAgZHVyYXRpb24gKj0gTWF0aC5hYnMoZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhOiB0LFxuICAgICAgICAgICAgYjogcHJvZ3JhbS5iLFxuICAgICAgICAgICAgZCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IHByb2dyYW0uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHByb2dyYW0uc3RhcnQgKyBkdXJhdGlvbixcbiAgICAgICAgICAgIGdyb3VwOiBwcm9ncmFtLmdyb3VwXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKGIpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBub3coKSArIGRlbGF5LFxuICAgICAgICAgICAgYlxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBwcm9ncmFtLmdyb3VwID0gb3V0cm9zO1xuICAgICAgICAgICAgb3V0cm9zLnIgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW50cm8sIGFuZCB0aGVyZSdzIGEgZGVsYXksIHdlIG5lZWQgdG8gZG9cbiAgICAgICAgICAgIC8vIGFuIGluaXRpYWwgdGljayBhbmQvb3IgYXBwbHkgQ1NTIGFuaW1hdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGIsICdzdGFydCcpKTtcbiAgICAgICAgICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ19wcm9ncmFtICYmIG5vdyA+IHBlbmRpbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHBlbmRpbmdfcHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBydW5uaW5nX3Byb2dyYW0uYiwgcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uLCAwLCBlYXNpbmcsIGNvbmZpZy5jc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQgPSBydW5uaW5nX3Byb2dyYW0uYiwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0uYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRybyBcdTIwMTQgd2UgY2FuIHRpZHkgdXAgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRybyBcdTIwMTQgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEtLXJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FsbChydW5uaW5nX3Byb2dyYW0uZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gbm93IC0gcnVubmluZ19wcm9ncmFtLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHJ1bm5pbmdfcHJvZ3JhbS5hICsgcnVubmluZ19wcm9ncmFtLmQgKiBlYXNpbmcocCAvIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gISEocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBydW4oYikge1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZV9wcm9taXNlKHByb21pc2UsIGluZm8pIHtcbiAgICBjb25zdCB0b2tlbiA9IGluZm8udG9rZW4gPSB7fTtcbiAgICBmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZm8udG9rZW4gIT09IHRva2VuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbmZvLnJlc29sdmVkID0gdmFsdWU7XG4gICAgICAgIGxldCBjaGlsZF9jdHggPSBpbmZvLmN0eDtcbiAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGlsZF9jdHggPSBjaGlsZF9jdHguc2xpY2UoKTtcbiAgICAgICAgICAgIGNoaWxkX2N0eFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvY2sgPSB0eXBlICYmIChpbmZvLmN1cnJlbnQgPSB0eXBlKShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgbmVlZHNfZmx1c2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKGluZm8uYmxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzLmZvckVhY2goKGJsb2NrLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSBpbmRleCAmJiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrc1tpXSA9PT0gYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibG9ja3NbaV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2suZCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICAgICAgYmxvY2subShpbmZvLm1vdW50KCksIGluZm8uYW5jaG9yKTtcbiAgICAgICAgICAgIG5lZWRzX2ZsdXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrcylcbiAgICAgICAgICAgIGluZm8uYmxvY2tzW2luZGV4XSA9IGJsb2NrO1xuICAgICAgICBpZiAobmVlZHNfZmx1c2gpIHtcbiAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzX3Byb21pc2UocHJvbWlzZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudF9jb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5jYXRjaCwgMiwgaW5mby5lcnJvciwgZXJyb3IpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICAgICAgaWYgKCFpbmZvLmhhc0NhdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiB3ZSBwcmV2aW91c2x5IGhhZCBhIHRoZW4vY2F0Y2ggYmxvY2ssIGRlc3Ryb3kgaXRcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby5wZW5kaW5nKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5wZW5kaW5nLCAwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHByb21pc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHByb21pc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX2F3YWl0X2Jsb2NrX2JyYW5jaChpbmZvLCBjdHgsIGRpcnR5KSB7XG4gICAgY29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gaW5mbztcbiAgICBpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8udmFsdWVdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGlmIChpbmZvLmN1cnJlbnQgPT09IGluZm8uY2F0Y2gpIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8uZXJyb3JdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGluZm8uYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcbn1cblxuY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gd2luZG93XG4gICAgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBnbG9iYWxUaGlzXG4gICAgICAgIDogZ2xvYmFsKTtcblxuZnVuY3Rpb24gZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZCgxKTtcbiAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG59XG5mdW5jdGlvbiBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZml4X2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9rZXllZF9lYWNoKG9sZF9ibG9ja3MsIGRpcnR5LCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIG5leHQsIGdldF9jb250ZXh0KSB7XG4gICAgbGV0IG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcbiAgICBsZXQgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpID0gbztcbiAgICBjb25zdCBvbGRfaW5kZXhlcyA9IHt9O1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG4gICAgY29uc3QgbmV3X2Jsb2NrcyA9IFtdO1xuICAgIGNvbnN0IG5ld19sb29rdXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuICAgIGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgYmxvY2sgPSBsb29rdXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIGJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfa2V5cyhjdHgsIGxpc3QsIGdldF9jb250ZXh0LCBnZXRfa2V5KSB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpKTtcbiAgICAgICAgaWYgKGtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgZHVwbGljYXRlIGtleXMgaW4gYSBrZXllZCBlYWNoJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sXG5jb25zdCBib29sZWFuX2F0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgICAnYWxsb3dmdWxsc2NyZWVuJyxcbiAgICAnYWxsb3dwYXltZW50cmVxdWVzdCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXV0b2ZvY3VzJyxcbiAgICAnYXV0b3BsYXknLFxuICAgICdjaGVja2VkJyxcbiAgICAnY29udHJvbHMnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZGVmZXInLFxuICAgICdkaXNhYmxlZCcsXG4gICAgJ2Zvcm1ub3ZhbGlkYXRlJyxcbiAgICAnaGlkZGVuJyxcbiAgICAnaXNtYXAnLFxuICAgICdsb29wJyxcbiAgICAnbXVsdGlwbGUnLFxuICAgICdtdXRlZCcsXG4gICAgJ25vbW9kdWxlJyxcbiAgICAnbm92YWxpZGF0ZScsXG4gICAgJ29wZW4nLFxuICAgICdwbGF5c2lubGluZScsXG4gICAgJ3JlYWRvbmx5JyxcbiAgICAncmVxdWlyZWQnLFxuICAgICdyZXZlcnNlZCcsXG4gICAgJ3NlbGVjdGVkJ1xuXSk7XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MsIGNsYXNzZXNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlcy5jbGFzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3Nlc190b19hZGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzICs9ICcgJyArIGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IGVzY2FwZWQgPSB7XG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKGh0bWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoL1tcIicmPD5dL2csIG1hdGNoID0+IGVzY2FwZWRbbWF0Y2hdKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IGVzY2FwZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9vYmplY3Qob2JqKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZShvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBlYWNoKGl0ZW1zLCBmbikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBmbihpdGVtc1tpXSwgaSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5jb25zdCBtaXNzaW5nX2NvbXBvbmVudCA9IHtcbiAgICAkJHJlbmRlcjogKCkgPT4gJydcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZV9jb21wb25lbnQoY29tcG9uZW50LCBuYW1lKSB7XG4gICAgaWYgKCFjb21wb25lbnQgfHwgIWNvbXBvbmVudC4kJHJlbmRlcikge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3N2ZWx0ZTpjb21wb25lbnQnKVxuICAgICAgICAgICAgbmFtZSArPSAnIHRoaXM9ey4uLn0nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYDwke25hbWV9PiBpcyBub3QgYSB2YWxpZCBTU1IgY29tcG9uZW50LiBZb3UgbWF5IG5lZWQgdG8gcmV2aWV3IHlvdXIgYnVpbGQgY29uZmlnIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQsIHJhdGhlciB0aGFuIGltcG9ydGVkIGFzIHByZS1jb21waWxlZCBtb2R1bGVzYCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBkZWJ1ZyhmaWxlLCBsaW5lLCBjb2x1bW4sIHZhbHVlcykge1xuICAgIGNvbnNvbGUubG9nKGB7QGRlYnVnfSAke2ZpbGUgPyBmaWxlICsgJyAnIDogJyd9KCR7bGluZX06JHtjb2x1bW59KWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyh2YWx1ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICByZXR1cm4gJyc7XG59XG5sZXQgb25fZGVzdHJveTtcbmZ1bmN0aW9uIGNyZWF0ZV9zc3JfY29tcG9uZW50KGZuKSB7XG4gICAgZnVuY3Rpb24gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICAgICAgY29uc3QgJCQgPSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LFxuICAgICAgICAgICAgY29udGV4dDogbmV3IE1hcChjb250ZXh0IHx8IChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgeyAkJHNsb3RzID0ge30sIGNvbnRleHQgPSBuZXcgTWFwKCkgfSA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG4gICAgICAgICAgICBjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sICQkc2xvdHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgcnVuX2FsbChvbl9kZXN0cm95KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogQXJyYXkuZnJvbShyZXN1bHQuY3NzKS5tYXAoY3NzID0+IGNzcy5jb2RlKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWQ6IHJlc3VsdC50aXRsZSArIHJlc3VsdC5oZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAkJHJlbmRlclxuICAgIH07XG59XG5mdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKGJvb2xlYW4gJiYgIXZhbHVlKSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiBgICR7bmFtZX0ke3ZhbHVlID09PSB0cnVlID8gJycgOiBgPSR7dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KGVzY2FwZSh2YWx1ZSkpIDogYFwiJHt2YWx1ZX1cImB9YH1gO1xufVxuZnVuY3Rpb24gYWRkX2NsYXNzZXMoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzID8gYCBjbGFzcz1cIiR7Y2xhc3Nlc31cImAgOiAnJztcbn1cblxuZnVuY3Rpb24gYmluZChjb21wb25lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnQuJCQucHJvcHNbbmFtZV07XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29tcG9uZW50LiQkLmJvdW5kW2luZGV4XSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W2luZGV4XSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG4gICAgYmxvY2sgJiYgYmxvY2subChwYXJlbnRfbm9kZXMpO1xufVxuZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IsIGN1c3RvbUVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7XG4gICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7XG4gICAgaWYgKCFjdXN0b21FbGVtZW50KSB7XG4gICAgICAgIC8vIG9uTW91bnQgaGFwcGVucyBiZWZvcmUgdGhlIGluaXRpYWwgYWZ0ZXJVcGRhdGVcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgICAgICBpZiAob25fZGVzdHJveSkge1xuICAgICAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG4gICAgICAgICAgICAgICAgcnVuX2FsbChuZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJDtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgcnVuX2FsbCgkJC5vbl9kZXN0cm95KTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgJCQub25fZGVzdHJveSA9ICQkLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgJCQuY3R4ID0gW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmRpcnR5WzBdID09PSAtMSkge1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgICAgIGNvbXBvbmVudC4kJC5kaXJ0eS5maWxsKDApO1xuICAgIH1cbiAgICBjb21wb25lbnQuJCQuZGlydHlbKGkgLyAzMSkgfCAwXSB8PSAoMSA8PCAoaSAlIDMxKSk7XG59XG5mdW5jdGlvbiBpbml0KGNvbXBvbmVudCwgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgbm90X2VxdWFsLCBwcm9wcywgYXBwZW5kX3N0eWxlcywgZGlydHkgPSBbLTFdKSB7XG4gICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkID0ge1xuICAgICAgICBmcmFnbWVudDogbnVsbCxcbiAgICAgICAgY3R4OiBudWxsLFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICBwcm9wcyxcbiAgICAgICAgdXBkYXRlOiBub29wLFxuICAgICAgICBub3RfZXF1YWwsXG4gICAgICAgIGJvdW5kOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgLy8gbGlmZWN5Y2xlXG4gICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgb25fZGVzdHJveTogW10sXG4gICAgICAgIG9uX2Rpc2Nvbm5lY3Q6IFtdLFxuICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgY29udGV4dDogbmV3IE1hcChvcHRpb25zLmNvbnRleHQgfHwgKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSkpLFxuICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgZGlydHksXG4gICAgICAgIHNraXBfYm91bmQ6IGZhbHNlLFxuICAgICAgICByb290OiBvcHRpb25zLnRhcmdldCB8fCBwYXJlbnRfY29tcG9uZW50LiQkLnJvb3RcbiAgICB9O1xuICAgIGFwcGVuZF9zdHlsZXMgJiYgYXBwZW5kX3N0eWxlcygkJC5yb290KTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgb3B0aW9ucy5wcm9wcyB8fCB7fSwgKGksIHJldCwgLi4ucmVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0Lmxlbmd0aCA/IHJlc3RbMF0gOiByZXQ7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhbaV0sICQkLmN0eFtpXSA9IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghJCQuc2tpcF9ib3VuZCAmJiAkJC5ib3VuZFtpXSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRbaV0odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICAkJC51cGRhdGUoKTtcbiAgICByZWFkeSA9IHRydWU7XG4gICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAvLyBgZmFsc2VgIGFzIGEgc3BlY2lhbCBjYXNlIG9mIG5vIERPTSBjb21wb25lbnRcbiAgICAkJC5mcmFnbWVudCA9IGNyZWF0ZV9mcmFnbWVudCA/IGNyZWF0ZV9mcmFnbWVudCgkJC5jdHgpIDogZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIHN0YXJ0X2h5ZHJhdGluZygpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQubChub2Rlcyk7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGRldGFjaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuYygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludHJvKVxuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihjb21wb25lbnQuJCQuZnJhZ21lbnQpO1xuICAgICAgICBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IsIG9wdGlvbnMuY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIGVuZF9oeWRyYXRpbmcoKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxubGV0IFN2ZWx0ZUVsZW1lbnQ7XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgU3ZlbHRlRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25fbW91bnQgfSA9IHRoaXMuJCQ7XG4gICAgICAgICAgICB0aGlzLiQkLm9uX2Rpc2Nvbm5lY3QgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIHJ1bl9hbGwodGhpcy4kJC5vbl9kaXNjb25uZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMuIFVzZWQgd2hlbiBkZXY9ZmFsc2UuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICB9XG4gICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBPYmplY3QuYXNzaWduKHsgdmVyc2lvbjogJzMuNDMuMCcgfSwgZGV0YWlsKSwgdHJ1ZSkpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbl9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcbiAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnRfZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBpbnNlcnRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTtcbiAgICBpbnNlcnRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlJywgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gWydjYXB0dXJlJ10gOiBvcHRpb25zID8gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhvcHRpb25zKSkgOiBbXTtcbiAgICBpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdClcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7XG4gICAgaWYgKGhhc19zdG9wX3Byb3BhZ2F0aW9uKVxuICAgICAgICBtb2RpZmllcnMucHVzaCgnc3RvcFByb3BhZ2F0aW9uJyk7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01BZGRFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSB9KTtcbiAgICBlbHNlXG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0QXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhc2V0JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhJywgeyBub2RlOiB0ZXh0LCBkYXRhIH0pO1xuICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJiAhKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBhcmcpKSB7XG4gICAgICAgIGxldCBtc2cgPSAneyNlYWNofSBvbmx5IGl0ZXJhdGVzIG92ZXIgYXJyYXktbGlrZSBvYmplY3RzLic7XG4gICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGFyZyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gYXJnKSB7XG4gICAgICAgICAgICBtc2cgKz0gJyBZb3UgY2FuIHVzZSBhIHNwcmVhZCB0byBjb252ZXJ0IHRoaXMgaXRlcmFibGUgaW50byBhbiBhcnJheS4nO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHtcbiAgICBmb3IgKGNvbnN0IHNsb3Rfa2V5IG9mIE9iamVjdC5rZXlzKHNsb3QpKSB7XG4gICAgICAgIGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCBcIiR7c2xvdF9rZXl9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzIHdpdGggc29tZSBtaW5vciBkZXYtZW5oYW5jZW1lbnRzLiBVc2VkIHdoZW4gZGV2PXRydWUuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIid0YXJnZXQnIGlzIGEgcmVxdWlyZWQgb3B0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgICRkZXN0cm95KCkge1xuICAgICAgICBzdXBlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAkY2FwdHVyZV9zdGF0ZSgpIHsgfVxuICAgICRpbmplY3Rfc3RhdGUoKSB7IH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyB0byBjcmVhdGUgc3Ryb25nbHkgdHlwZWQgU3ZlbHRlIGNvbXBvbmVudHMuXG4gKiBUaGlzIG9ubHkgZXhpc3RzIGZvciB0eXBpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBiZSB1c2VkIGluIGAuZC50c2AgZmlsZXMuXG4gKlxuICogIyMjIEV4YW1wbGU6XG4gKlxuICogWW91IGhhdmUgY29tcG9uZW50IGxpYnJhcnkgb24gbnBtIGNhbGxlZCBgY29tcG9uZW50LWxpYnJhcnlgLCBmcm9tIHdoaWNoXG4gKiB5b3UgZXhwb3J0IGEgY29tcG9uZW50IGNhbGxlZCBgTXlDb21wb25lbnRgLiBGb3IgU3ZlbHRlK1R5cGVTY3JpcHQgdXNlcnMsXG4gKiB5b3Ugd2FudCB0byBwcm92aWRlIHR5cGluZ3MuIFRoZXJlZm9yZSB5b3UgY3JlYXRlIGEgYGluZGV4LmQudHNgOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFN2ZWx0ZUNvbXBvbmVudFR5cGVkIH0gZnJvbSBcInN2ZWx0ZVwiO1xuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50VHlwZWQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGBgYFxuICogVHlwaW5nIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIElERXMgbGlrZSBWUyBDb2RlIHdpdGggdGhlIFN2ZWx0ZSBleHRlbnNpb25cbiAqIHRvIHByb3ZpZGUgaW50ZWxsaXNlbnNlIGFuZCB0byB1c2UgdGhlIGNvbXBvbmVudCBsaWtlIHRoaXMgaW4gYSBTdmVsdGUgZmlsZVxuICogd2l0aCBUeXBlU2NyaXB0OlxuICogYGBgc3ZlbHRlXG4gKiA8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICogXHRpbXBvcnQgeyBNeUNvbXBvbmVudCB9IGZyb20gXCJjb21wb25lbnQtbGlicmFyeVwiO1xuICogPC9zY3JpcHQ+XG4gKiA8TXlDb21wb25lbnQgZm9vPXsnYmFyJ30gLz5cbiAqIGBgYFxuICpcbiAqICMjIyMgV2h5IG5vdCBtYWtlIHRoaXMgcGFydCBvZiBgU3ZlbHRlQ29tcG9uZW50KERldilgP1xuICogQmVjYXVzZVxuICogYGBgdHNcbiAqIGNsYXNzIEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50PHtmb286IHN0cmluZ30+IHt9XG4gKiBjb25zdCBjb21wb25lbnQ6IHR5cGVvZiBTdmVsdGVDb21wb25lbnQgPSBBU3ViY2xhc3NPZlN2ZWx0ZUNvbXBvbmVudDtcbiAqIGBgYFxuICogd2lsbCB0aHJvdyBhIHR5cGUgZXJyb3IsIHNvIHdlIG5lZWQgdG8gc2VwYXJhdGUgdGhlIG1vcmUgc3RyaWN0bHkgdHlwZWQgY2xhc3MuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudFR5cGVkIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvb3BfZ3VhcmQodGltZW91dCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmZpbml0ZSBsb29wIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgeyBIdG1sVGFnLCBIdG1sVGFnSHlkcmF0aW9uLCBTdmVsdGVDb21wb25lbnQsIFN2ZWx0ZUNvbXBvbmVudERldiwgU3ZlbHRlQ29tcG9uZW50VHlwZWQsIFN2ZWx0ZUVsZW1lbnQsIGFjdGlvbl9kZXN0cm95ZXIsIGFkZF9hdHRyaWJ1dGUsIGFkZF9jbGFzc2VzLCBhZGRfZmx1c2hfY2FsbGJhY2ssIGFkZF9sb2NhdGlvbiwgYWRkX3JlbmRlcl9jYWxsYmFjaywgYWRkX3Jlc2l6ZV9saXN0ZW5lciwgYWRkX3RyYW5zZm9ybSwgYWZ0ZXJVcGRhdGUsIGFwcGVuZCwgYXBwZW5kX2RldiwgYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQsIGFwcGVuZF9oeWRyYXRpb24sIGFwcGVuZF9oeWRyYXRpb25fZGV2LCBhcHBlbmRfc3R5bGVzLCBhc3NpZ24sIGF0dHIsIGF0dHJfZGV2LCBhdHRyaWJ1dGVfdG9fb2JqZWN0LCBiZWZvcmVVcGRhdGUsIGJpbmQsIGJpbmRpbmdfY2FsbGJhY2tzLCBibGFua19vYmplY3QsIGJ1YmJsZSwgY2hlY2tfb3V0cm9zLCBjaGlsZHJlbiwgY2xhaW1fY29tcG9uZW50LCBjbGFpbV9lbGVtZW50LCBjbGFpbV9odG1sX3RhZywgY2xhaW1fc3BhY2UsIGNsYWltX3N2Z19lbGVtZW50LCBjbGFpbV90ZXh0LCBjbGVhcl9sb29wcywgY29tcG9uZW50X3N1YnNjcmliZSwgY29tcHV0ZV9yZXN0X3Byb3BzLCBjb21wdXRlX3Nsb3RzLCBjcmVhdGVFdmVudERpc3BhdGNoZXIsIGNyZWF0ZV9hbmltYXRpb24sIGNyZWF0ZV9iaWRpcmVjdGlvbmFsX3RyYW5zaXRpb24sIGNyZWF0ZV9jb21wb25lbnQsIGNyZWF0ZV9pbl90cmFuc2l0aW9uLCBjcmVhdGVfb3V0X3RyYW5zaXRpb24sIGNyZWF0ZV9zbG90LCBjcmVhdGVfc3NyX2NvbXBvbmVudCwgY3VycmVudF9jb21wb25lbnQsIGN1c3RvbV9ldmVudCwgZGF0YXNldF9kZXYsIGRlYnVnLCBkZXN0cm95X2Jsb2NrLCBkZXN0cm95X2NvbXBvbmVudCwgZGVzdHJveV9lYWNoLCBkZXRhY2gsIGRldGFjaF9hZnRlcl9kZXYsIGRldGFjaF9iZWZvcmVfZGV2LCBkZXRhY2hfYmV0d2Vlbl9kZXYsIGRldGFjaF9kZXYsIGRpcnR5X2NvbXBvbmVudHMsIGRpc3BhdGNoX2RldiwgZWFjaCwgZWxlbWVudCwgZWxlbWVudF9pcywgZW1wdHksIGVuZF9oeWRyYXRpbmcsIGVzY2FwZSwgZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZSwgZXNjYXBlX29iamVjdCwgZXNjYXBlZCwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcywgZml4X2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfcG9zaXRpb24sIGZsdXNoLCBnZXRBbGxDb250ZXh0cywgZ2V0Q29udGV4dCwgZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlLCBnZXRfYmluZGluZ19ncm91cF92YWx1ZSwgZ2V0X2N1cnJlbnRfY29tcG9uZW50LCBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzLCBnZXRfcm9vdF9mb3Jfc3R5bGUsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBoYXNDb250ZXh0LCBoYXNfcHJvcCwgaWRlbnRpdHksIGluaXQsIGluc2VydCwgaW5zZXJ0X2RldiwgaW5zZXJ0X2h5ZHJhdGlvbiwgaW5zZXJ0X2h5ZHJhdGlvbl9kZXYsIGludHJvcywgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIsIGlzX2NsaWVudCwgaXNfY3Jvc3NvcmlnaW4sIGlzX2VtcHR5LCBpc19mdW5jdGlvbiwgaXNfcHJvbWlzZSwgbGlzdGVuLCBsaXN0ZW5fZGV2LCBsb29wLCBsb29wX2d1YXJkLCBtaXNzaW5nX2NvbXBvbmVudCwgbW91bnRfY29tcG9uZW50LCBub29wLCBub3RfZXF1YWwsIG5vdywgbnVsbF90b19lbXB0eSwgb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcywgb25EZXN0cm95LCBvbk1vdW50LCBvbmNlLCBvdXRyb19hbmRfZGVzdHJveV9ibG9jaywgcHJldmVudF9kZWZhdWx0LCBwcm9wX2RldiwgcXVlcnlfc2VsZWN0b3JfYWxsLCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3JjX3VybF9lcXVhbCwgc3RhcnRfaHlkcmF0aW5nLCBzdG9wX3Byb3BhZ2F0aW9uLCBzdWJzY3JpYmUsIHN2Z19lbGVtZW50LCB0ZXh0LCB0aWNrLCB0aW1lX3Jhbmdlc190b19hcnJheSwgdG9fbnVtYmVyLCB0b2dnbGVfY2xhc3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0LCB0cnVzdGVkLCB1cGRhdGVfYXdhaXRfYmxvY2tfYnJhbmNoLCB1cGRhdGVfa2V5ZWRfZWFjaCwgdXBkYXRlX3Nsb3QsIHVwZGF0ZV9zbG90X2Jhc2UsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfZWFjaF9hcmd1bWVudCwgdmFsaWRhdGVfZWFjaF9rZXlzLCB2YWxpZGF0ZV9zbG90cywgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsICJpbXBvcnQgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGVidWcsIGVycm9yIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgUG9zLCBURmlsZSwgVEZvbGRlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHsgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudCwgYWRkU2libGluZ3NQYXJlbnRJc1BhcmVudCwgYWRkQXVudHNVbmNsZXMsIGFkZENvdXNpbnMsIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzIH0gZnJvbSBcIi4vUmVsYXRpb25zXCI7XHJcbmltcG9ydCB7IGFkZENTVkNydW1icywgZ2V0Q1NWUm93cyB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzXCI7XHJcbmltcG9ydCB7IGFkZERhdGF2aWV3Tm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EYXRhdmlld05vdGVzXCI7XHJcbmltcG9ydCB7IGFkZERhdGVOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGVOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGREZW5kcm9uTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EZW5kcm9uTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkRm9sZGVyTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9Gb2xkZXJOb3Rlc1wiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEhOc1RvR3JhcGgsXHJcbiAgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zLFxyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvSGllcmFyY2h5Tm90ZXNcIjtcclxuaW1wb3J0IHtcclxuICBhZGRKdWdnbExpbmtzVG9HcmFwaCxcclxuICBnZXRKdWdnbExpbmtzLFxyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSnVnZ2xMaW5rc1wiO1xyXG5pbXBvcnQgeyBhZGRMaW5rTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9MaW5rTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkUmVnZXhOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1JlZ2V4Tm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkVGFnTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9UYWdOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGRUcmF2ZXJzZU5vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvVHJhdmVyc2VOb3Rlc1wiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0FMVFMsXHJcbiAgQkNfRFZfTk9URSxcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9QQVJFTlQsXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfTElOS19OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfVEFHX05PVEUsXHJcbiAgQkNfVFJBVkVSU0VfTk9URSxcclxuICBkcm9wSGVhZGVyT3JBbGlhcyxcclxuICBzcGxpdExpbmtzUmVnZXgsXHJcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ1NldHRpbmdzLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBkdkxpbmssXHJcbiAgUmF3VmFsdWUsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgYWRkRWRnZUlmTm90LFxyXG4gIGFkZE5vZGVzSWZOb3QsXHJcbiAgYnVpbGRPYnNHcmFwaCxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGZhbGxiYWNrRmllbGQsIGdldEZpZWxkSW5mbywgaXRlcmF0ZUhpZXJzIH0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0QmFzZUZyb21NRFBhdGgsXHJcbiAgZ2V0RFZBcGksXHJcbiAgZ2V0RFZCYXNlbmFtZSxcclxufSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCIuL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG5cclxuZnVuY3Rpb24gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbjogQkNQbHVnaW4sIGZpbGVzOiBURmlsZVtdKSB7XHJcbiAgY29uc3QgeyBkYiB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGFwaSA9IGdldERWQXBpKHBsdWdpbik7XHJcbiAgZGIuc3RhcnQxRyhcImdldERWTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gYXBpLnBhZ2UoZmlsZS5wYXRoKSk7XHJcblxyXG4gIGRiLmVuZDFHKHsgZnJvbnRtcyB9KTtcclxuICByZXR1cm4gZnJvbnRtcztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T2JzTWV0YWRhdGFDYWNoZShwbHVnaW46IEJDUGx1Z2luLCBmaWxlczogVEZpbGVbXSkge1xyXG4gIGNvbnN0IHsgZGIgfSA9IHBsdWdpbjtcclxuICBkYi5zdGFydDFHKFwiZ2V0T2JzTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10gPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgIHJldHVybiBmcm9udG1hdHRlciA/IHsgZmlsZSwgLi4uZnJvbnRtYXR0ZXIgfSA6IHsgZmlsZSB9O1xyXG4gIH0pO1xyXG5cclxuICBkYi5lbmQxRyh7IGZyb250bXMgfSk7XHJcbiAgcmV0dXJuIGZyb250bXM7XHJcbn1cclxuXHJcbmNvbnN0IGlzRFZQcm94eSA9IChpdGVtOiBSYXdWYWx1ZSkgPT4gdHlwZW9mIGl0ZW0uZGVmYXVsdENvbXBhcmF0b3IgPT09IFwiZnVuY3Rpb25cIlxyXG5cclxuLyoqXHJcbiAqIEtlZXAgdW53cmFwcGluZyBhIHByb3hpZWQgaXRlbSB1bnRpbCBpdCBpc24ndCBvbmUgYW55bW9yZVxyXG4gKiBAcGFyYW0gIHtSYXdWYWx1ZX0gaXRlbVxyXG4gKi9cclxuZnVuY3Rpb24gdW5wcm94eShpdGVtOiBSYXdWYWx1ZSkge1xyXG4gIGNvbnN0IHVucHJveGllZCA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlID0gW2l0ZW1dO1xyXG5cclxuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjdXJySXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XHJcblxyXG4gICAgaWYgKGlzRFZQcm94eShjdXJySXRlbSkpIHF1ZXVlLnB1c2goLi4uY3Vyckl0ZW0udmFsdWVzKTtcclxuICAgIGVsc2UgdW5wcm94aWVkLnB1c2goY3Vyckl0ZW0pO1xyXG4gIH1cclxuICByZXR1cm4gdW5wcm94aWVkO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGEgYGR2Q2FjaGVbZmllbGRdYCB2YWx1ZSwgcGFyc2UgdGhlIGxpbmsocykgb3V0IG9mIGl0XHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZX0gdmFsdWVcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRmllbGRWYWx1ZShcclxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZVxyXG4pIHtcclxuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XHJcblxyXG4gIGNvbnN0IHBhcnNlZDogc3RyaW5nW10gPSBbXTtcclxuICB0cnkge1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgY29uc3Qgc3BsaXRzID0gdmFsdWUubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KTtcclxuXHJcbiAgICAgIGlmIChzcGxpdHMgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBsaW5rTmFtZXMgPSBzcGxpdHMubWFwKChsaW5rKSA9PlxyXG4gICAgICAgICAgZ2V0QmFzZUZyb21NRFBhdGgobGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcylbMV0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBwYXJzZWQucHVzaCguLi5saW5rTmFtZXMpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXM6IFJhd1ZhbHVlW10gPSBbdmFsdWVdLmZsYXQoNCk7XHJcbiAgICAgIGRlYnVnKC4uLnJhd1ZhbHVlcyk7XHJcblxyXG4gICAgICByYXdWYWx1ZXMuZm9yRWFjaCgocmF3SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghcmF3SXRlbSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCB1blByb3hpZWQgPSB1bnByb3h5KHJhd0l0ZW0pO1xyXG4gICAgICAgIHVuUHJveGllZC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmF3QXNTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBzcGxpdHMgPSByYXdBc1N0cmluZy5tYXRjaChzcGxpdExpbmtzUmVnZXgpO1xyXG4gICAgICAgICAgICBpZiAoc3BsaXRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3RycyA9IHNwbGl0cy5tYXAoKGxpbmspID0+XHJcbiAgICAgICAgICAgICAgICBnZXRCYXNlRnJvbU1EUGF0aChsaW5rLm1hdGNoKGRyb3BIZWFkZXJPckFsaWFzKVsxXSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKC4uLnN0cnMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0QmFzZUZyb21NRFBhdGgocmF3QXNTdHJpbmcpO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKGJhc2VuYW1lLnNwbGl0KFwiI1wiKVswXS5zcGxpdChcInxcIilbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IGdldEJhc2VGcm9tTURQYXRoKHZhbHVlLnBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoYmFzZW5hbWUgIT09IHVuZGVmaW5lZCkgcGFyc2VkLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcmV0dXJuIHBhcnNlZDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1haW5HKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPE11bHRpR3JhcGg+IHtcclxuICBjb25zdCBtYWluRyA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgc2V0dGluZ3MsIGRiIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycywgQ1NWUGF0aHMsIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbCwgaGllcmFyY2h5Tm90ZXMgfSA9XHJcbiAgICAgIHNldHRpbmdzO1xyXG4gICAgZGIuc3RhcnQyRyhcImluaXRHcmFwaHNcIik7XHJcblxyXG4gICAgaWYgKHVzZXJIaWVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgZGIuZW5kMkcoKTtcclxuICAgICAgbmV3IE5vdGljZShcIllvdSBkbyBub3QgaGF2ZSBhbnkgQnJlYWRjcnVtYnMgaGllcmFyY2hpZXMgc2V0IHVwLlwiKTtcclxuICAgICAgcmV0dXJuIG1haW5HO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuICAgIGNvbnN0IGR2USA9IGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhcImRhdGF2aWV3XCIpO1xyXG5cclxuICAgIGxldCBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSA9IGR2UVxyXG4gICAgICA/IGdldERWTWV0YWRhdGFDYWNoZShwbHVnaW4sIGZpbGVzKVxyXG4gICAgICA6IGdldE9ic01ldGFkYXRhQ2FjaGUocGx1Z2luLCBmaWxlcyk7XHJcblxyXG4gICAgaWYgKGZyb250bXMuc29tZSgoZnJvbnRtKSA9PiBmcm9udG0gPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgYXdhaXQgd2FpdCgyMDAwKTtcclxuICAgICAgZnJvbnRtcyA9IGR2UVxyXG4gICAgICAgID8gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbiwgZmlsZXMpXHJcbiAgICAgICAgOiBnZXRPYnNNZXRhZGF0YUNhY2hlKHBsdWdpbiwgZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IENTVlJvd3MgPSBDU1ZQYXRocyAhPT0gXCJcIiA/IGF3YWl0IGdldENTVlJvd3MocGx1Z2luKSA6IFtdO1xyXG5cclxuICAgIGNvbnN0IGVsaWdhYmxlQWx0czogeyBbYWx0RmllbGQ6IHN0cmluZ106IGR2RnJvbnRtYXR0ZXJDYWNoZVtdIH0gPSB7fTtcclxuICAgIEJDX0FMVFMuZm9yRWFjaCgoYWx0KSA9PiAoZWxpZ2FibGVBbHRzW2FsdF0gPSBbXSkpO1xyXG5cclxuICAgIGRiLnN0YXJ0MkcoXCJhZGRGcm9udG1hdHRlclRvR3JhcGhcIik7XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgQkNfQUxUUy5mb3JFYWNoKChhbHQpID0+IHtcclxuICAgICAgICBpZiAocGFnZVthbHRdICE9PSB1bmRlZmluZWQgJiYgcGFnZVthbHRdICE9PSBudWxsKVxyXG4gICAgICAgICAgZWxpZ2FibGVBbHRzW2FsdF0ucHVzaChwYWdlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihwYWdlKTtcclxuXHJcbiAgICAgIGl0ZXJhdGVIaWVycyh1c2VySGllcnMsIChoaWVyLCBkaXIsIGZpZWxkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcGFyc2VGaWVsZFZhbHVlKHBhZ2VbZmllbGRdKTtcclxuXHJcbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKFwiPCVcIikgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoXCJ7e1wiKSkgcmV0dXJuO1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXQpO1xyXG5cclxuICAgICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgIHRhcmdldCxcclxuICAgICAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgICAgIHRhcmdldE9yZGVyXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChDU1ZSb3dzLmxlbmd0aCkgYWRkQ1NWQ3J1bWJzKG1haW5HLCBDU1ZSb3dzLCBkaXIsIGZpZWxkKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkYi5lbmQyRygpO1xyXG5cclxuICAgIC8vIFNFQ1RJT04gIEp1Z2dsIExpbmtzXHJcbiAgICBjb25zdCBqdWdnbExpbmtzID1cclxuICAgICAgYXBwLnBsdWdpbnMucGx1Z2lucy5qdWdnbCB8fCBwYXJzZUp1Z2dsTGlua3NXaXRob3V0SnVnZ2xcclxuICAgICAgICA/IGF3YWl0IGdldEp1Z2dsTGlua3MocGx1Z2luLCBmaWxlcylcclxuICAgICAgICA6IFtdO1xyXG5cclxuICAgIGlmIChqdWdnbExpbmtzLmxlbmd0aClcclxuICAgICAgYWRkSnVnZ2xMaW5rc1RvR3JhcGgoc2V0dGluZ3MsIGp1Z2dsTGlua3MsIGZyb250bXMsIG1haW5HKTtcclxuXHJcbiAgICAvLyAhU0VDVElPTiAgSnVnZ2wgTGlua3NcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXNcIik7XHJcbiAgICAvLyBTRUNUSU9OICBIaWVyYXJjaHkgTm90ZXNcclxuICAgIGRiLnN0YXJ0MkcoXCJIaWVyYXJjaHkgTm90ZXNcIik7XHJcblxyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vdGVPckZvbGRlciBvZiBoaWVyYXJjaHlOb3Rlcykge1xyXG4gICAgICAgIGlmIChub3RlT3JGb2xkZXIuZW5kc1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICBjb25zdCBmb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKFxyXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoKG5vdGVPckZvbGRlcilcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmb2xkZXIuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICBhZGRITnNUb0dyYXBoKFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRIaWVyYXJjaHlOb3RlSXRlbXMoY2hpbGQpLFxyXG4gICAgICAgICAgICAgICAgbWFpbkdcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlT3JGb2xkZXIsIFwiXCIpO1xyXG4gICAgICAgICAgaWYgKGZpbGUpXHJcbiAgICAgICAgICAgIGFkZEhOc1RvR3JhcGgoXHJcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGUpLFxyXG4gICAgICAgICAgICAgIG1haW5HXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIC8vICFTRUNUSU9OICBIaWVyYXJjaHkgTm90ZXNcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiRm9sZGVyIE5vdGVzXCIpO1xyXG4gICAgYWRkRm9sZGVyTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX0ZPTERFUl9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJUYWcgTm90ZXNcIik7XHJcbiAgICBhZGRUYWdOb3Rlc1RvR3JhcGgocGx1Z2luLCBlbGlnYWJsZUFsdHNbQkNfVEFHX05PVEVdLCBmcm9udG1zLCBtYWluRyk7XHJcbiAgICBkYi5lbmQyRygpO1xyXG4gICAgZGIuc3RhcnQyRyhcIkxpbmsgTm90ZXNcIik7XHJcbiAgICBhZGRMaW5rTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX0xJTktfTk9URV0sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiUmVnZXggTm90ZXNcIik7XHJcbiAgICBhZGRSZWdleE5vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19SRUdFWF9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIC8vIHBsdWdpbi5hZGROYW1pbmdTeXN0ZW1Ob3Rlc1RvR3JhcGgoZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuc3RhcnQyRyhcIlRyYXZlcnNlIE5vdGVzXCIpO1xyXG4gICAgYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgICAgIHBsdWdpbixcclxuICAgICAgZWxpZ2FibGVBbHRzW0JDX1RSQVZFUlNFX05PVEVdLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgYnVpbGRPYnNHcmFwaCgpXHJcbiAgICApO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJEZW5kcm9uIE5vdGVzXCIpO1xyXG4gICAgYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChwbHVnaW4sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiRGF0YXZpZXcgTm90ZXNcIik7XHJcbiAgICBhZGREYXRhdmlld05vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19EVl9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJEYXRlIE5vdGVzXCIpO1xyXG4gICAgYWRkRGF0ZU5vdGVzVG9HcmFwaChwbHVnaW4sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuXHJcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiBhZGROb2Rlc0lmTm90KG1haW5HLCBbZmlsZS5iYXNlbmFtZV0pKTtcclxuICAgIGRiLmVuZDJHKFwiZ3JhcGhzIGluaXRlZFwiLCB7IG1haW5HIH0pO1xyXG4gICAgcmV0dXJuIG1haW5HO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgZXJyb3IoZXJyKTtcclxuICAgIHBsdWdpbi5kYi5lbmQyRygpO1xyXG4gICAgcmV0dXJuIG1haW5HO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xvc2VkRyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBtYWluRywgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7XHJcbiAgICB1c2VySGllcnMsXHJcbiAgICBpbXBsaWVkUmVsYXRpb25zOiB7XHJcbiAgICAgIHNhbWVQYXJlbnRJc1NpYmxpbmcsXHJcbiAgICAgIHBhcmVudHNTaWJsaW5nc0lzUGFyZW50cyxcclxuICAgICAgY291c2luc0lzU2libGluZyxcclxuICAgICAgc2libGluZ3NTaWJsaW5nSXNTaWJsaW5nLFxyXG4gICAgICBzaWJsaW5nc1BhcmVudElzUGFyZW50LFxyXG4gICAgfSxcclxuICB9ID0gc2V0dGluZ3M7XHJcbiAgbGV0IGNsb3NlZEcgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKG1haW5HLCB1c2VySGllcnMpO1xyXG5cclxuICBpZiAoc2FtZVBhcmVudElzU2libGluZykgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudChjbG9zZWRHLCBzZXR0aW5ncyk7XHJcbiAgaWYgKHNpYmxpbmdzUGFyZW50SXNQYXJlbnQpIGFkZFNpYmxpbmdzUGFyZW50SXNQYXJlbnQoY2xvc2VkRyk7XHJcbiAgaWYgKHBhcmVudHNTaWJsaW5nc0lzUGFyZW50cykgYWRkQXVudHNVbmNsZXMoY2xvc2VkRyk7XHJcbiAgaWYgKGNvdXNpbnNJc1NpYmxpbmcpIGFkZENvdXNpbnMoY2xvc2VkRyk7XHJcbiAgaWYgKHNpYmxpbmdzU2libGluZ0lzU2libGluZykgYWRkU3RydWN0dXJhbEVxdWl2YWxlbmNlU2libGluZ3MoY2xvc2VkRyk7XHJcblxyXG4gIHJldHVybiBjbG9zZWRHO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEluZGV4KHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBpZiAoIXBsdWdpbi5hY3RpdmVMZWFmQ2hhbmdlKSBwbHVnaW4ucmVnaXN0ZXJBY3RpdmVMZWFmQ2hhbmdlRXZlbnQoKTtcclxuICBpZiAoIXBsdWdpbi5sYXlvdXRDaGFuZ2UpIHBsdWdpbi5yZWdpc3RlckxheW91dENoYW5nZUV2ZW50KCk7XHJcblxyXG4gIHBsdWdpbi5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcocGx1Z2luKTtcclxuICBwbHVnaW4uY2xvc2VkRyA9IGJ1aWxkQ2xvc2VkRyhwbHVnaW4pO1xyXG5cclxuICBmb3IgKGNvbnN0IHsgdHlwZSB9IG9mIHBsdWdpbi5WSUVXUylcclxuICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyh0eXBlKT8uZHJhdygpO1xyXG5cclxuICBpZiAocGx1Z2luLnNldHRpbmdzLnNob3dCQ3MpIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gIGlmIChwbHVnaW4uc2V0dGluZ3Muc2hvd1JlZnJlc2hOb3RpY2UpIG5ldyBOb3RpY2UoXCJCQyBJbmRleCByZWZyZXNoZWRcIik7XHJcbn1cclxuIiwgImltcG9ydCBHcmFwaCwgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGZzRnJvbU5vZGUgfSBmcm9tIFwiZ3JhcGhvbG9neS10cmF2ZXJzYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVzIH0gZnJvbSBcImdyYXBob2xvZ3ktdHlwZXNcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lfUkVGTEVYSVZFLFxyXG4gIEJDX09SREVSLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIERJUkVDVElPTlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBFZGdlQXR0cixcclxuICBOb2RlUGF0aCxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRJbmZvLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRCYXNlRnJvbU1EUGF0aCB9IGZyb20gXCIuL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlYWwgJiBpbXBsaWVkIGdyYXBocyBmb3IgYSBnaXZlbiByZWxhdGlvbiwgYW5kIHJldHVybnMgYSBuZXcgZ3JhcGhzIHdpdGggYm90aC5cclxuLy8gSXQgbWFrZXMgaW1wbGllZCByZWxhdGlvbnMgcmVhbFxyXG4vLyBUT0RPIHVzZSByZWZsZXhpdmVDbG9zdXJlIGluc3RlYWRcclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlSW1wbGllZExpbmtzKFxyXG4gIHJlYWw6IE11bHRpR3JhcGgsXHJcbiAgaW1wbGllZDogTXVsdGlHcmFwaFxyXG4pOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBjbG9zZWRHID0gcmVhbC5jb3B5KCk7XHJcbiAgaW1wbGllZC5mb3JFYWNoRWRnZSgoa2V5LCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjbG9zZWRHLm1lcmdlRWRnZSh0LCBzLCBhKTtcclxuICB9KTtcclxuICByZXR1cm4gY2xvc2VkRztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5saW5rZWROb2RlcyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgY29uc3QgY29weSA9IGcuY29weSgpO1xyXG4gIGNvcHkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgIGlmICghY29weS5kZWdyZWUobm9kZSkpIGNvcHkuZHJvcE5vZGUobm9kZSk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYSBzdWJncmFwaCBvZiBhbGwgbm9kZXMgJiBlZGdlcyB3aXRoIGBkaXJzLmluY2x1ZGVzKGEuZGlyKWBcclxuICpcclxuICogRmlsdGVyIHRoZSBnaXZlbiBncmFwaCB0byBvbmx5IGluY2x1ZGUgZWRnZXMgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbnMuXHJcbiAqIEBwYXJhbSAge011bHRpR3JhcGh9IGdcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc30gZGlyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViSW5EaXJzKGc6IE11bHRpR3JhcGgsIC4uLmRpcnM6IERpcmVjdGlvbnNbXSkge1xyXG4gIGNvbnN0IHN1YiA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgZz8uZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChkaXJzLmluY2x1ZGVzKGEuZGlyKSkge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgYWRkTm9kZXNJZk5vdChzdWIsIFtzLCB0XSwgeyBvcmRlcjogYS5vcmRlciB9KTtcclxuICAgICAgc3ViLmFkZEVkZ2UocywgdCwgYSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHN1YjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhIHN1YmdyYXBoIG9mIGFsbCBub2RlcyAmIGVkZ2VzIHdpdGggYGZpZWxkcy5pbmNsdWRlcyhhLmZpZWxkKWAuXHJcbiAqXHJcbiAqIEZpbHRlciB0aGUgZ2l2ZW4gZ3JhcGggdG8gb25seSBpbmNsdWRlIGVkZ2VzIHdpdGggdGhlIGdpdmVuIGZpZWxkcy5cclxuICogQHBhcmFtICB7TXVsdGlHcmFwaH0gZ1xyXG4gKiBAcGFyYW0gIHtzdHJpbmdbXX0gZmllbGRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViRm9yRmllbGRzKGc6IE11bHRpR3JhcGgsIGZpZWxkczogc3RyaW5nW10pIHtcclxuICBjb25zdCBzdWIgPSBuZXcgTXVsdGlHcmFwaCgpO1xyXG4gIGcuZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChmaWVsZHMuaW5jbHVkZXMoYS5maWVsZCkpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGFkZE5vZGVzSWZOb3Qoc3ViLCBbcywgdF0sIHsgb3JkZXI6IGEub3JkZXIgfSk7XHJcbiAgICAgIHN1Yi5hZGRFZGdlKHMsIHQsIGEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBzdWI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3IgZXZlcnkgZWRnZSBpbiBgZ2AsIGFkZCB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSB0byBhIGNvcHkgb2YgYGdgLlxyXG4gKlxyXG4gKiBJdCBhbHNvIHNldHMgdGhlIGF0dHJzIG9mIHRoZSByZXZlcnNlIGVkZ2VzIHRvIGBvcHBEaXJgIGFuZCBgb3BwRmllbGRzWzBdYFxyXG4gKiBAcGFyYW0gIHtNdWx0aUdyYXBofSBnXHJcbiAqIEBwYXJhbSAge1VzZXJIaWVyW119IHVzZXJIaWVyc1xyXG4gKiBAcGFyYW0gIHtib29sZWFufSBjbG9zZUFzT3Bwb3NpdGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZsZXhpdmVDbG9zdXJlKFxyXG4gIGc6IE11bHRpR3JhcGgsXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdXHJcbik6IE11bHRpR3JhcGgge1xyXG4gIGNvbnN0IGNvcHkgPSBnLmNvcHkoKTtcclxuICBjb3B5LmZvckVhY2hFZGdlKChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9XHJcbiAgICAgIGRpciA9PT0gXCJzYW1lXCIgPyBmaWVsZCA6IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoY29weSwgW3MsIHRdLCB7IG9yZGVyOiA5OTk5IH0pO1xyXG4gICAgYWRkRWRnZUlmTm90KGNvcHksIHQsIHMsIHtcclxuICAgICAgZGlyOiBvcHBEaXIsXHJcbiAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgaW1wbGllZDogQkNfSV9SRUZMRVhJVkUsXHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vZGVzSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBub2Rlczogc3RyaW5nW10sXHJcbiAgYXR0ciA9IHsgb3JkZXI6IDk5OTkgfVxyXG4pIHtcclxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgIGcudXBkYXRlTm9kZShub2RlLCAoZXhzdGFudEF0dHJzOiBBdHRyaWJ1dGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4dGFudE9yZGVyOiBudW1iZXIgfCB1bmRlZmluZWQgPSBleHN0YW50QXR0cnMub3JkZXI7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZXhzdGFudEF0dHJzLFxyXG4gICAgICAgIG9yZGVyOiBleHRhbnRPcmRlciAmJiBleHRhbnRPcmRlciA8IDk5OTkgPyBleHRhbnRPcmRlciA6IGF0dHIub3JkZXIsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRFZGdlSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICB0YXJnZXQ6IHN0cmluZyxcclxuICBhdHRyPzogQXR0cmlidXRlc1xyXG4pIHtcclxuICBpZiAoIWcuaGFzRWRnZShzb3VyY2UsIHRhcmdldCkpIGcuYWRkRWRnZShzb3VyY2UsIHRhcmdldCwgYXR0cik7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTaW5rcyA9IChnOiBNdWx0aUdyYXBoKSA9PlxyXG4gIGcuZmlsdGVyTm9kZXMoKG5vZGUpID0+IGcuaGFzTm9kZShub2RlKSAmJiAhZy5vdXREZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZXMgPSAoZzogTXVsdGlHcmFwaCkgPT5cclxuICBnLmZpbHRlck5vZGVzKChub2RlKSA9PiBnLmhhc05vZGUobm9kZSkgJiYgIWcuaW5EZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE91dE5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcub3V0TmVpZ2hib3JzKG5vZGUpIDogW107XHJcbmV4cG9ydCBjb25zdCBnZXRJbk5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcuaW5OZWlnaGJvcnMobm9kZSkgOiBbXTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyBhbGwgcGF0aHMgZnJvbSBhIHN0YXJ0aW5nIG5vZGUgdG8gYWxsIG90aGVyIHNpbmtzIGluIGEgZ3JhcGguXHJcbiAqXHJcbiAqXHJcbiAqIEBwYXJhbSB7TXVsdGlHcmFwaH0gZyAtIFRoZSBncmFwaCB0byBzZWFyY2hcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIG5vZGVcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJyYXlzLiBFYWNoIGFycmF5IGlzIGEgcGF0aC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZnNBbGxQYXRocyhnOiBNdWx0aUdyYXBoLCBzdGFydDogc3RyaW5nKTogc3RyaW5nW11bXSB7XHJcbiAgY29uc3QgcXVldWU6IE5vZGVQYXRoW10gPSBbeyBub2RlOiBzdGFydCwgcGF0aDogW10gfV07XHJcbiAgY29uc3QgdmlzaXRlZDogeyBbbm90ZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBjb25zdCBhbGxQYXRoczogc3RyaW5nW11bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDAgJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuICAgIGNvbnN0IHsgbm9kZSwgcGF0aCB9ID0gcXVldWUuc2hpZnQoKTtcclxuXHJcbiAgICBjb25zdCBleHRQYXRoID0gW25vZGUsIC4uLnBhdGhdO1xyXG4gICAgY29uc3Qgc3VjY3NOb3RWaXNpdGVkID0gZy5oYXNOb2RlKG5vZGUpXHJcbiAgICAgID8gZy5maWx0ZXJPdXROZWlnaGJvcnMoXHJcbiAgICAgICAgbm9kZSxcclxuICAgICAgICAoc3VjYykgPT4gIXZpc2l0ZWRbc3VjY10gfHwgdmlzaXRlZFtzdWNjXSA8IDVcclxuICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBzdWNjc05vdFZpc2l0ZWQubWFwKChzdWNjKSA9PiB7XHJcbiAgICAgIHZpc2l0ZWRbc3VjY10gPSB2aXNpdGVkW3N1Y2NdID8gdmlzaXRlZFtzdWNjXSArIDEgOiAxO1xyXG4gICAgICByZXR1cm4geyBub2RlOiBzdWNjLCBwYXRoOiBleHRQYXRoIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICBxdWV1ZS51bnNoaWZ0KC4uLm5ld0l0ZW1zKTtcclxuXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCAhZy5vdXREZWdyZWUobm9kZSkpIGFsbFBhdGhzLnB1c2goZXh0UGF0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBhbGxQYXRocztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0FsbFBhdGhzKGc6IE11bHRpR3JhcGgsIHN0YXJ0OiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICBjb25zdCBwYXRoc0Fycjogc3RyaW5nW11bXSA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlOiBOb2RlUGF0aFtdID0gW3sgbm9kZTogc3RhcnQsIHBhdGg6IFtdIH1dO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG4gICAgY29uc3QgeyBub2RlLCBwYXRoIH0gPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgZXh0UGF0aCA9IFtub2RlLCAuLi5wYXRoXTtcclxuXHJcbiAgICBjb25zdCBzdWNjcyA9IGcuaGFzTm9kZShub2RlKVxyXG4gICAgICA/IGcuZmlsdGVyT3V0TmVpZ2hib3JzKG5vZGUsIChuKSA9PiAhcGF0aC5pbmNsdWRlcyhuKSlcclxuICAgICAgOiBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzdWNjcykge1xyXG4gICAgICBxdWV1ZS5wdXNoKHsgbm9kZSwgcGF0aDogZXh0UGF0aCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXJtaW5hbCBub2RlXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCBzdWNjcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcGF0aHNBcnIucHVzaChleHRQYXRoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gU3BsaWNlIG9mZiB0aGUgY3VycmVudCBub3RlIGZyb20gdGhlIHBhdGhcclxuICBwYXRoc0Fyci5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBpZiAocGF0aC5sZW5ndGgpIHBhdGguc3BsaWNlKHBhdGgubGVuZ3RoIC0gMSwgMSk7XHJcbiAgfSk7XHJcbiAgaW5mbyh7IHBhdGhzQXJyIH0pO1xyXG4gIHJldHVybiBwYXRoc0FycjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUN5Y2xlcyhnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpIHtcclxuICBjb25zdCBjb3B5ID0gZy5jb3B5KCk7XHJcbiAgbGV0IHByZXZOb2RlID0gbnVsbDtcclxuICBkZnNGcm9tTm9kZShjb3B5LCBzdGFydE5vZGUsIChuKSA9PiB7XHJcbiAgICBjb3B5LmZvckVhY2hPdXROZWlnaGJvcihuLCAodCkgPT4ge1xyXG4gICAgICBpZiAodCA9PT0gcHJldk5vZGUgJiYgY29weS5oYXNFZGdlKHQsIHByZXZOb2RlKSkge1xyXG4gICAgICAgIHRyeSB7IGNvcHkuZHJvcEVkZ2UodCwgcHJldk5vZGUpIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcih0LCBwcmV2Tm9kZSwgZXJyb3IpIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHJldk5vZGUgPSBuO1xyXG4gIH0pO1xyXG4gIHJldHVybiBjb3B5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViQ2xvc2VTdWIoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICB1c2VySGllcnM6IFVzZXJIaWVyW10sXHJcbiAgLi4uZGlyczogRGlyZWN0aW9uc1tdXHJcbikge1xyXG4gIGNvbnN0IHN1YiA9IGdldFN1YkluRGlycyhnLCAuLi5kaXJzKTtcclxuICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgdXNlckhpZXJzKTtcclxuICBjb25zdCBjbG9zZWRTdWIgPSBnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXJzWzBdKTtcclxuICByZXR1cm4gY2xvc2VkU3ViO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPYnNHcmFwaCgpOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBPYnNHID0gbmV3IE11bHRpR3JhcGgoKTtcclxuICBjb25zdCB7IHJlc29sdmVkTGlua3MsIHVucmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcblxyXG4gIGZvciAoY29uc3Qgc291cmNlIGluIHJlc29sdmVkTGlua3MpIHtcclxuICAgIGlmICghc291cmNlLmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgIGNvbnN0IHNvdXJjZUJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChzb3VyY2UpO1xyXG4gICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbc291cmNlQmFzZV0pO1xyXG5cclxuICAgIGZvciAoY29uc3QgZGVzdCBpbiByZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgaWYgKCFkZXN0LmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9yIChjb25zdCBzb3VyY2UgaW4gdW5yZXNvbHZlZExpbmtzKSB7XHJcbiAgICBjb25zdCBzb3VyY2VCYXNlID0gZ2V0QmFzZUZyb21NRFBhdGgoc291cmNlKTtcclxuICAgIGFkZE5vZGVzSWZOb3QoT2JzRywgW3NvdXJjZUJhc2VdKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRlc3QgaW4gdW5yZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgaWYgKHNvdXJjZUJhc2UgPT09IGRlc3RCYXNlKSBjb250aW51ZTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluZm8oeyBPYnNHIH0pO1xyXG4gIHJldHVybiBPYnNHO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVNYWluKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoLFxyXG4gIHNvdXJjZTogc3RyaW5nLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgdGFyZ2V0OiBzdHJpbmcsXHJcbiAgc291cmNlT3JkZXI6IG51bWJlcixcclxuICB0YXJnZXRPcmRlcjogbnVtYmVyLFxyXG4gIGZpbGxPcHAgPSBmYWxzZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZGlyID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpLmZpZWxkRGlyO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbc291cmNlXSwge1xyXG4gICAgb3JkZXI6IHNvdXJjZU9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbdGFyZ2V0XSwge1xyXG4gICAgb3JkZXI6IHRhcmdldE9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGRFZGdlSWZOb3QobWFpbkcsIHNvdXJjZSwgdGFyZ2V0LCB7XHJcbiAgICBkaXIsXHJcbiAgICBmaWVsZCxcclxuICB9KTtcclxuICBpZiAoZmlsbE9wcCkge1xyXG4gICAgYWRkRWRnZUlmTm90KG1haW5HLCB0YXJnZXQsIHNvdXJjZSwge1xyXG4gICAgICBkaXI6IGdldE9wcERpcihkaXIpLFxyXG4gICAgICBmaWVsZDogZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIGRpcilbMF0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRPcmRlciA9IChmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSwgdGFyZ2V0OiBzdHJpbmcpID0+XHJcbiAgcGFyc2VJbnQoXHJcbiAgICAoZnJvbnRtcy5maW5kKChmZikgPT4gZmY/LmZpbGU/LmJhc2VuYW1lID09PSB0YXJnZXQpPy5bXHJcbiAgICAgIEJDX09SREVSXHJcbiAgICBdIGFzIHN0cmluZykgPz8gXCI5OTk5XCJcclxuICApO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZU9yZGVyID0gKGZyb250bTogZHZGcm9udG1hdHRlckNhY2hlKSA9PlxyXG4gIHBhcnNlSW50KChmcm9udG1bQkNfT1JERVJdIGFzIHN0cmluZykgPz8gXCI5OTk5XCIpO1xyXG5cclxuLyoqIFJlbWVtYmVyIHRvIGZpbHRlciBieSBoaWVyYXJjaHkgaW4gTWF0cml4VmlldyEgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlYWxuSW1wbGllZChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGN1cnJOb2RlOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zID0gbnVsbFxyXG4pOiBSZWFsTkltcGxpZWQge1xyXG4gIGNvbnN0IHJlYWxzbkltcGxpZWRzOiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmICghY2xvc2VkRy5oYXNOb2RlKGN1cnJOb2RlKSkgcmV0dXJuIHJlYWxzbkltcGxpZWRzO1xyXG4gIGNsb3NlZEcuZm9yRWFjaEVkZ2UoY3Vyck5vZGUsIChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkLCBkaXI6IGVkZ2VEaXIsIGltcGxpZWQgfSA9IGEgYXMgRWRnZUF0dHI7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBlZGdlRGlyKVswXTtcclxuXHJcbiAgICAoZGlyID8gW2RpciwgZ2V0T3BwRGlyKGRpcildIDogRElSRUNUSU9OUykuZm9yRWFjaChcclxuICAgICAgKGN1cnJEaXI6IERpcmVjdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBvcHBEaXIgPSBnZXRPcHBEaXIoY3VyckRpcik7XHJcbiAgICAgICAgLy8gUmVhbHNcclxuICAgICAgICBpZiAocyA9PT0gY3Vyck5vZGUgJiYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSkge1xyXG4gICAgICAgICAgY29uc3QgYXJyID0gcmVhbHNuSW1wbGllZHNbZWRnZURpcl0ucmVhbHM7XHJcbiAgICAgICAgICBpZiAoYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS50byA9PT0gdCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHsgdG86IHQsIGZpZWxkLCBpbXBsaWVkIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJbXBsaWVkc1xyXG4gICAgICAgIC8vIElmIGBzICE9PSBjdXJyTm9kZWAgdGhlbiBgdGAgbXVzdCBiZVxyXG4gICAgICAgIGVsc2UgaWYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBhcnIgPSByZWFsc25JbXBsaWVkc1tnZXRPcHBEaXIoZWRnZURpcildLmltcGxpZWRzO1xyXG4gICAgICAgICAgaWYgKGFyci5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udG8gPT09IHMpID09PSAtMSkge1xyXG4gICAgICAgICAgICBhcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgdG86IHMsXHJcbiAgICAgICAgICAgICAgZmllbGQ6IG9wcEZpZWxkLFxyXG4gICAgICAgICAgICAgIGltcGxpZWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gcmVhbHNuSW1wbGllZHM7XHJcbn1cclxuIiwgImltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEdldCBhbGwgdGhlIGZpZWxkcyBpbiBgZGlyYC5cclxuICogUmV0dXJucyBhbGwgZmllbGRzIGlmIGBkaXIgPT09ICdhbGwnYFxyXG4gKiBAcGFyYW0gIHtVc2VySGllcltdfSB1c2VySGllcnNcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc3xcImFsbFwifSBkaXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGRpcjogRGlyZWN0aW9ucyB8IFwiYWxsXCIgPSBcImFsbFwiXHJcbikge1xyXG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgaWYgKGRpciA9PT0gXCJhbGxcIikge1xyXG4gICAgICBESVJFQ1RJT05TLmZvckVhY2goKGVhY2hEaXIpID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2VhY2hEaXJdKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2Rpcl0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBmaWVsZHM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKTogRGlyZWN0aW9ucyA9PiB7XHJcbiAgc3dpdGNoIChkaXIpIHtcclxuICAgIGNhc2UgXCJ1cFwiOlxyXG4gICAgICByZXR1cm4gXCJkb3duXCI7XHJcbiAgICBjYXNlIFwiZG93blwiOlxyXG4gICAgICByZXR1cm4gXCJ1cFwiO1xyXG4gICAgY2FzZSBcInNhbWVcIjpcclxuICAgICAgcmV0dXJuIFwic2FtZVwiO1xyXG4gICAgY2FzZSBcIm5leHRcIjpcclxuICAgICAgcmV0dXJuIFwicHJldlwiO1xyXG4gICAgY2FzZSBcInByZXZcIjpcclxuICAgICAgcmV0dXJuIFwibmV4dFwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiAgR2V0IHRoZSBoaWVyYXJjaHkgYW5kIGRpcmVjdGlvbiB0aGF0IGBmaWVsZGAgaXMgaW5cclxuICogKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkSW5mbyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGZpZWxkOiBzdHJpbmcpIHtcclxuICBsZXQgZmllbGREaXI6IERpcmVjdGlvbnM7XHJcbiAgbGV0IGZpZWxkSGllcjogVXNlckhpZXI7XHJcblxyXG4gIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgICBpZiAoaGllcltkaXJdLmluY2x1ZGVzKGZpZWxkKSkge1xyXG4gICAgICAgIGZpZWxkRGlyID0gZGlyO1xyXG4gICAgICAgIGZpZWxkSGllciA9IGhpZXI7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4geyBmaWVsZEhpZXIsIGZpZWxkRGlyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRPcHBGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zXHJcbikge1xyXG4gIC8vIElmIHRoZSBmaWVsZCBlbmRzIHdpdGggYD5gLCBpdCBpcyBhbHJlYWR5IHRoZSBvcHBvc2l0ZSBmaWVsZCB3ZSBuZWVkIChjb21pbmcgZnJvbSBgZ2V0T3BwRmFsbGJhY2tgKVxyXG4gIGlmIChmaWVsZC5lbmRzV2l0aChcIj5cIikpIHJldHVybiBbZmllbGQuc2xpY2UoMCwgLTQpXTtcclxuXHJcbiAgY29uc3Qgb3BwRmllbGRzID0gW2ZhbGxiYWNrT3BwRmllbGQoZmllbGQsIGRpcildO1xyXG4gIGNvbnN0IHsgZmllbGRIaWVyLCBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpO1xyXG4gIGlmICghZmllbGRIaWVyIHx8ICFmaWVsZERpcikgcmV0dXJuIG9wcEZpZWxkcztcclxuXHJcbiAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGZpZWxkRGlyKTtcclxuICBvcHBGaWVsZHMudW5zaGlmdCguLi5maWVsZEhpZXJbb3BwRGlyXSk7XHJcbiAgcmV0dXJuIG9wcEZpZWxkcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGhpZXJUb1N0ciA9IChoaWVyOiBVc2VySGllcikgPT5cclxuICBESVJFQ1RJT05TLm1hcChcclxuICAgIChkaXIpID0+IGAke0FSUk9XX0RJUkVDVElPTlNbZGlyXX06ICR7aGllcltkaXJdLmpvaW4oXCIsIFwiKX1gXHJcbiAgKS5qb2luKFwiXFxuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZhbGxiYWNrRmllbGQgPSAoZmllbGQ6IHN0cmluZywgZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gIGAke2ZpZWxkfSA8JHtBUlJPV19ESVJFQ1RJT05TW2Rpcl19PmA7XHJcbmV4cG9ydCBjb25zdCBmYWxsYmFja09wcEZpZWxkID0gKGZpZWxkOiBzdHJpbmcsIGRpcjogRGlyZWN0aW9ucykgPT5cclxuICBgJHtmaWVsZH0gPCR7QVJST1dfRElSRUNUSU9OU1tnZXRPcHBEaXIoZGlyKV19PmA7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUhpZXJzKFxyXG4gIHVzZXJIaWVyczogVXNlckhpZXJbXSxcclxuICBmbjogKGhpZXI6IFVzZXJIaWVyLCBkaXI6IERpcmVjdGlvbnMsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcclxuKSB7XHJcbiAgdXNlckhpZXJzLmZvckVhY2goKGhpZXIpID0+IHtcclxuICAgIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyKSA9PiB7XHJcbiAgICAgIGhpZXJbZGlyXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGZuKGhpZXIsIGRpciwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7XHJcbiAgRnJvbnRNYXR0ZXJDYWNoZSxcclxuICBwYXJzZVlhbWwsXHJcbiAgc3RyaW5naWZ5WWFtbCxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBpc0luVmF1bHQsXHJcbiAgd2FpdCxcclxuICB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyxcclxufSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgTWV0YWVkaXRBcGkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi9nZW5lcmFsVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTZXR0aW5ncyA9ICgpID0+IGFwcC5wbHVnaW5zLnBsdWdpbnMuYnJlYWRjcnVtYnMuc2V0dGluZ3NcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyRmlsZSA9ICgpOiBURmlsZSB8IG51bGwgPT4gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClcclxuXHJcbi8qKlxyXG4gKiBHZXQgYmFzZW5hbWUgZnJvbSBhICoqTWFya2Rvd24qKiBgcGF0aGBcclxuICogQHBhcmFtICB7c3RyaW5nfSBwYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0QmFzZUZyb21NRFBhdGggPSAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3Qgc3BsaXRTbGFzaCA9IHBhdGguc3BsaXQoXCIvXCIpLmxhc3QoKTtcclxuICBpZiAoc3BsaXRTbGFzaC5lbmRzV2l0aChcIi5tZFwiKSkge1xyXG4gICAgcmV0dXJuIHNwbGl0U2xhc2guc3BsaXQoXCIubWRcIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG4gIH0gZWxzZSByZXR1cm4gc3BsaXRTbGFzaDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREVkJhc2VuYW1lID0gKGZpbGU6IFRGaWxlKSA9PiBmaWxlLmJhc2VuYW1lIHx8IGZpbGUubmFtZTtcclxuZXhwb3J0IGNvbnN0IGdldEZvbGRlck5hbWUgPSAoZmlsZTogVEZpbGUpOiBzdHJpbmcgPT5cclxuICAvL0B0cy1pZ25vcmVcclxuICBmaWxlPy5wYXJlbnQ/Lm5hbWUgfHwgZmlsZS5mb2xkZXI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVdpa2koc3RyOiBzdHJpbmcsIHdpa2lRID0gdHJ1ZSkge1xyXG4gIGxldCBjb3B5ID0gc3RyLnNsaWNlKCk7XHJcbiAgaWYgKHdpa2lRKSB7XHJcbiAgICBjb3B5ID0gXCJbW1wiICsgY29weTtcclxuICAgIGNvcHkgKz0gXCJdXVwiO1xyXG4gIH1cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BXaWtpbGlua3Moc3RyOiBzdHJpbmcpIHtcclxuICBsZXQgY29weSA9IHN0ci5zbGljZSgpO1xyXG4gIGlmIChjb3B5LnN0YXJ0c1dpdGgoXCJbW1wiKSAmJiBjb3B5LmVuZHNXaXRoKFwiXV1cIikpIGNvcHkgPSBjb3B5LnNsaWNlKDIsIC0yKTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgb3IgdXBkYXRlcyB0aGUgZ2l2ZW4geWFtbCBga2V5YCB0byBgdmFsdWVgIGluIHRoZSBnaXZlbiBURmlsZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGtleVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlXHJcbiAqIEBwYXJhbSAge1RGaWxlfSBmaWxlXHJcbiAqIEBwYXJhbSAge0Zyb250TWF0dGVyQ2FjaGV8dW5kZWZpbmVkfSBmcm9udG1hdHRlclxyXG4gKiBAcGFyYW0gIHtNZXRhZWRpdEFwaX0gYXBpXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3JlYXRlT3JVcGRhdGVZYW1sID0gYXN5bmMgKFxyXG4gIGtleTogc3RyaW5nLFxyXG4gIHZhbHVlOiBzdHJpbmcsXHJcbiAgZmlsZTogVEZpbGUsXHJcbiAgZnJvbnRtYXR0ZXI6IEZyb250TWF0dGVyQ2FjaGUgfCB1bmRlZmluZWQsXHJcbiAgYXBpOiBNZXRhZWRpdEFwaVxyXG4pID0+IHtcclxuICBjb25zdCB2YWx1ZVN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gIGlmICghZnJvbnRtYXR0ZXIgfHwgZnJvbnRtYXR0ZXJba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBpbmZvKGBDcmVhdGluZzogJHtrZXl9OiAke3ZhbHVlU3RyfWApO1xyXG4gICAgYXdhaXQgYXBpLmNyZWF0ZVlhbWxQcm9wZXJ0eShrZXksIGBbJyR7dmFsdWVTdHJ9J11gLCBmaWxlKTtcclxuICB9IGVsc2UgaWYgKFsuLi5bZnJvbnRtYXR0ZXJba2V5XV1dLmZsYXQoMykuc29tZSgodmFsKSA9PiB2YWwgPT0gdmFsdWVTdHIpKSB7XHJcbiAgICBpbmZvKFwiQWxyZWFkeSBFeGlzdHMhXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvbGRWYWx1ZUZsYXQ6IHN0cmluZ1tdID0gWy4uLltmcm9udG1hdHRlcltrZXldXV0uZmxhdCg0KTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gWy4uLm9sZFZhbHVlRmxhdCwgYCcke3ZhbHVlU3RyfSdgXTtcclxuICAgIGluZm8oYFVwZGF0aW5nOiAke2tleX06ICR7bmV3VmFsdWV9YCk7XHJcbiAgICBhd2FpdCBhcGkudXBkYXRlKGtleSwgYFske25ld1ZhbHVlLmpvaW4oXCIsIFwiKX1dYCwgZmlsZSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVlhbWwoeWFtbDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICh5YW1sID09PSBcIlwiKSB7XHJcbiAgICByZXR1cm4gYCR7a2V5fTogWycke25ld1ZhbH0nXWA7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHBhcnNlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHBhcnNlWWFtbCh5YW1sKTtcclxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW2tleV07XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBwYXJzZWRba2V5XSA9IG5ld1ZhbDtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICE9PSBuZXdWYWwpIHtcclxuICAgICAgcGFyc2VkW2tleV0gPSBbdmFsdWUsIG5ld1ZhbF07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0eXBlb2YgdmFsdWU/LlswXSA9PT0gXCJzdHJpbmdcIiAmJlxyXG4gICAgICB2YWx1ZS5pbmNsdWRlcyAmJlxyXG4gICAgICAhdmFsdWUuaW5jbHVkZXMobmV3VmFsKVxyXG4gICAgKSB7XHJcbiAgICAgIHBhcnNlZFtrZXldID0gWy4uLnZhbHVlLCBuZXdWYWxdO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSBpZiAob3RoZXIgdHlwZXMgb2YgdmFsdWVzLi4uKVxyXG4gICAgcmV0dXJuIHN0cmluZ2lmeVlhbWwocGFyc2VkKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50OiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcclxuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aChcIi0tLVxcblwiKSkgcmV0dXJuIFtcIlwiLCBjb250ZW50XTtcclxuICBlbHNlIHtcclxuICAgIGNvbnN0IHNwbGl0cyA9IGNvbnRlbnQuc3BsaXQoXCItLS1cIik7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBzcGxpdHMuc2xpY2UoMCwgMikuam9pbihcIi0tLVwiKSArIFwiLS0tXCIsXHJcbiAgICAgIHNwbGl0cy5zbGljZSgyKS5qb2luKFwiLS0tXCIpLFxyXG4gICAgXTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkcm9wSGFzaCA9ICh0YWc6IHN0cmluZykgPT5cclxuICB0YWcuc3RhcnRzV2l0aChcIiNcIikgPyB0YWcuc2xpY2UoMSkgOiB0YWc7XHJcblxyXG5leHBvcnQgY29uc3QgYWRkSGFzaCA9ICh0YWc6IHN0cmluZykgPT4gKHRhZy5zdGFydHNXaXRoKFwiI1wiKSA/IHRhZyA6IGAjJHt0YWd9YCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWx0KG5vZGU6IHN0cmluZywgcGx1Z2luOiBCQ1BsdWdpbik6IHN0cmluZyB8IG51bGwge1xyXG4gIGNvbnN0IHsgYWx0TGlua0ZpZWxkcywgc2hvd0FsbEFsaWFzZXMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuICBpZiAoYWx0TGlua0ZpZWxkcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub2RlLCBcIlwiKTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICBmb3IgKGNvbnN0IGFsdEZpZWxkIG9mIGFsdExpbmtGaWVsZHMpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG1ldGFkYXRhPy5mcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckNhY2hlKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZGF0YXZpZXdcIikpIHtcclxuICAgIGxldCBiYXNlbmFtZTogc3RyaW5nO1xyXG4gICAgd2hpbGUgKCFiYXNlbmFtZSB8fCAhYXBwLnBsdWdpbnMucGx1Z2lucy5kYXRhdmlldy5hcGkucGFnZShiYXNlbmFtZSkpIHtcclxuICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBhd2FpdCB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyhhcHApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxpbmtDbGFzcyA9ICh0bzogc3RyaW5nLCByZWFsUSA9IHRydWUpID0+XHJcbiAgYGludGVybmFsLWxpbmsgQkMtTGluayAke2lzSW5WYXVsdCh0bykgPyBcIlwiIDogXCJpcy11bnJlc29sdmVkXCJ9ICR7cmVhbFEgPyBcIlwiIDogXCJCQy1JbXBsaWVkXCJcclxuICB9YDtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREVkFwaSA9IChwbHVnaW46IEJDUGx1Z2luKSA9PlxyXG4gIGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXc/LmFwaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZVlhbWwoKTogYm9vbGVhbiB8IG51bGwge1xyXG4gIGNvbnN0IHsgd29ya3NwYWNlLCBtZXRhZGF0YUNhY2hlIH0gPSBhcHA7XHJcbiAgY29uc3QgeyBhY3RpdmVMZWFmIH0gPSB3b3Jrc3BhY2U7XHJcbiAgY29uc3Qge1xyXG4gICAgc3RhdGU6IHsgbW9kZSB9LFxyXG4gIH0gPSBhY3RpdmVMZWFmLmdldFZpZXdTdGF0ZSgpO1xyXG5cclxuICBpZiAobW9kZSAhPT0gXCJzb3VyY2VcIikgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IHsgZWRpdG9yIH0gPSBhY3RpdmVMZWFmLnZpZXc7XHJcblxyXG4gIGNvbnN0IGZpbGUgPSBnZXRDdXJyRmlsZSgpO1xyXG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBmcm9udG1hdHRlci5wb3NpdGlvbjtcclxuICBjb25zdCBjdXJyT2ZmID0gZWRpdG9yLnBvc1RvT2Zmc2V0KGVkaXRvci5nZXRDdXJzb3IoKSk7XHJcbiAgaWYgKGN1cnJPZmYgPj0gc3RhcnQub2Zmc2V0ICYmIGN1cnJPZmYgPD0gZW5kLm9mZnNldCkgcmV0dXJuIHRydWU7XHJcbiAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbn1cclxuIiwgImltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgZHJvcEhlYWRlck9yQWxpYXMsIHJlZ05GbGFncywgc3BsaXRMaW5rc1JlZ2V4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN1bShhcnI6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXNlKGFycjogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uYXJyKTtcclxuICByZXR1cm4gYXJyLm1hcCgoaXRlbSkgPT4gaXRlbSAvIG1heCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1N1YnNldCA9IDxUPihhcnIxOiBUW10sIGFycjI6IFRbXSk6IGJvb2xlYW4gPT5cclxuICBhcnIxLmV2ZXJ5KCh2YWx1ZSkgPT4gYXJyMi5pbmNsdWRlcyh2YWx1ZSkpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QW5kRHJvcChzdHI6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gKFxyXG4gICAgc3RyXHJcbiAgICAgID8ubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICA/Lm1hcCgobGluaykgPT4gbGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcyk/LlsxXSkgPz8gW11cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZHJvcFBhdGggPSAocGF0aDogc3RyaW5nKSA9PiBwYXRoLnJlcGxhY2UoL14uKlxcLy8sIFwiXCIpO1xyXG5leHBvcnQgY29uc3QgZHJvcERlbmRyb24gPSAocGF0aDogc3RyaW5nLCBzZXR0aW5nczogQkNTZXR0aW5ncykgPT5cclxuICBzZXR0aW5ncy50cmltRGVuZHJvbk5vdGVzXHJcbiAgICA/IHBhdGguc3BsaXQoc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIpLmxhc3QoKVxyXG4gICAgOiBwYXRoO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BQYXRoTkRlbmRyb24gPSAocGF0aDogc3RyaW5nLCBzZXR0aW5nczogQkNTZXR0aW5ncykgPT5cclxuICBkcm9wRGVuZHJvbihkcm9wUGF0aChwYXRoKSwgc2V0dGluZ3MpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BGb2xkZXIgPSAocGF0aDogc3RyaW5nKSA9PlxyXG4gIHBhdGguc3BsaXQoXCIvXCIpLmxhc3QoKS5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0QW5kVHJpbSA9IChmaWVsZHM6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcclxuICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMgPT09IFwiXCIpIHJldHVybiBbXTtcclxuICBlbHNlIHJldHVybiBmaWVsZHMuc3BsaXQoXCIsXCIpLm1hcCgoc3RyKSA9PiBzdHIudHJpbSgpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYWQgYW4gYXJyYXkgd2l0aCBhIGZpbGxlciB2YWx1ZSB0byBhIHNwZWNpZmllZCBsZW5ndGguXHJcbiAqIEBwYXJhbSB7VFtdfSBhcnIgLSBUaGUgYXJyYXkgdG8gcGFkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmluYWxMZW5ndGggLSBUaGUgZmluYWwgbGVuZ3RoIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGxlcj1cIlwiXSAtIFRoZSBmaWxsZXIgdG8gdXNlIGlmIHRoZSBhcnJheSBpcyB0b28gc2hvcnQuXHJcbiAqIEByZXR1cm5zIHsoVCB8IHN0cmluZylbXX0gVGhlIGFycmF5IHdpdGggdGhlIG5ldyB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFkQXJyYXk8VD4oXHJcbiAgYXJyOiBUW10sXHJcbiAgZmluYWxMZW5ndGg6IG51bWJlcixcclxuICBmaWxsZXI6IHN0cmluZyA9IFwiXCJcclxuKTogKFQgfCBzdHJpbmcpW10ge1xyXG4gIGNvbnN0IGNvcHk6IChUIHwgc3RyaW5nKVtdID0gWy4uLmFycl07XHJcbiAgY29uc3QgY3Vyckxlbmd0aCA9IGNvcHkubGVuZ3RoO1xyXG4gIGlmIChjdXJyTGVuZ3RoID4gZmluYWxMZW5ndGgpXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDdXJyZW50IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gZmluYWwgbGVuZ3RoXCIpO1xyXG4gIGVsc2UgaWYgKGN1cnJMZW5ndGggPT09IGZpbmFsTGVuZ3RoKSByZXR1cm4gY29weTtcclxuICBlbHNlIHtcclxuICAgIGZvciAobGV0IGkgPSBjdXJyTGVuZ3RoOyBpIDwgZmluYWxMZW5ndGg7IGkrKykgY29weS5wdXNoKGZpbGxlcik7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0cmFuc3Bvc2UoQSkgcmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIEEuXHJcbiAqIEBwYXJhbSB7VFtdW119IEEgLSBUaGUgbWF0cml4IHRvIHRyYW5zcG9zZS5cclxuICogQHJldHVybnMge1RbXVtdfSBBIDJEIGFycmF5IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2U8VD4oQTogVFtdW10pOiBUW11bXSB7XHJcbiAgY29uc3QgY29scyA9IEFbMF0ubGVuZ3RoO1xyXG4gIGNvbnN0IEFUOiBUW11bXSA9IFtdO1xyXG5cclxuICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykgQVQucHVzaChBLm1hcCgocm93KSA9PiByb3dbal0pKTtcclxuXHJcbiAgcmV0dXJuIEFUO1xyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gYW4gYXJyYXkgb2Ygc3RyaW5ncywgcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIHJ1bnMgb2YgY29uc2VjdXRpdmUgc3RyaW5nc1xyXG4gKiBpbiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnJcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcclxuICpcclxuICogICBgdmFsdWVgOiB0aGUgdmFsdWUgb2YgdGhlIHJ1blxyXG4gKlxyXG4gKiAgIGBmaXJzdGA6IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcnVuXHJcbiAqXHJcbiAqICAgYGxhc3RgOiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcnVuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcnVucyhcclxuICBhcnI6IHN0cmluZ1tdXHJcbik6IHsgdmFsdWU6IHN0cmluZzsgZmlyc3Q6IG51bWJlcjsgbGFzdDogbnVtYmVyIH1bXSB7XHJcbiAgY29uc3QgcnVuczogeyB2YWx1ZTogc3RyaW5nOyBmaXJzdDogbnVtYmVyOyBsYXN0OiBudW1iZXIgfVtdID0gW107XHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChpIDwgYXJyLmxlbmd0aCkge1xyXG4gICAgY29uc3QgY3VyclZhbHVlID0gYXJyW2ldO1xyXG4gICAgcnVucy5wdXNoKHsgdmFsdWU6IGN1cnJWYWx1ZSwgZmlyc3Q6IGksIGxhc3Q6IHVuZGVmaW5lZCB9KTtcclxuICAgIHdoaWxlIChjdXJyVmFsdWUgPT09IGFycltpXSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBydW5zLmxhc3QoKS5sYXN0ID0gaSAtIDE7XHJcbiAgfVxyXG4gIHJldHVybiBydW5zO1xyXG59XHJcblxyXG4vLyBTT1VSQ0UgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTk2MDkwOC9wZXJtdXRhdGlvbnMtaW4tamF2YXNjcmlwdFxyXG4vKipcclxuICogR2l2ZW4gYSBwZXJtdXRhdGlvbiwgcmV0dXJuIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhhdCBwZXJtdXRhdGlvbi5cclxuICogQHBhcmFtIHBlcm11dGF0aW9uIC0gdGhlIGFycmF5IHRvIGJlIHBlcm11dGVkXHJcbiAqIEByZXR1cm5zIGBbIFsgMSwgMiwgMyBdLCBbIDEsIDMsIDIgXSwgWyAyLCAxLCAzIF0sIFsgMiwgMywgMSBdLCBbIDMsIDEsIDIgXSwgWyAzLCAyLCAxIF0gXWBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwZXJtdXRlKHBlcm11dGF0aW9uOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gIGNvbnN0IGxlbmd0aCA9IHBlcm11dGF0aW9uLmxlbmd0aCxcclxuICAgIHJlc3VsdCA9IFtwZXJtdXRhdGlvbi5zbGljZSgpXSxcclxuICAgIGMgPSBuZXcgQXJyYXkobGVuZ3RoKS5maWxsKDApO1xyXG5cclxuICBsZXQgaSA9IDEsXHJcbiAgICBrOiBudW1iZXIsXHJcbiAgICBwOiBudW1iZXI7XHJcblxyXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XHJcbiAgICBpZiAoY1tpXSA8IGkpIHtcclxuICAgICAgayA9IGkgJSAyICYmIGNbaV07XHJcbiAgICAgIHAgPSBwZXJtdXRhdGlvbltpXTtcclxuICAgICAgcGVybXV0YXRpb25baV0gPSBwZXJtdXRhdGlvbltrXTtcclxuICAgICAgcGVybXV0YXRpb25ba10gPSBwO1xyXG4gICAgICArK2NbaV07XHJcbiAgICAgIGkgPSAxO1xyXG4gICAgICByZXN1bHQucHVzaChwZXJtdXRhdGlvbi5zbGljZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNbaV0gPSAwO1xyXG4gICAgICArK2k7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByYW5nZSA9IChuOiBudW1iZXIpID0+IFsuLi5BcnJheShuKS5rZXlzKCldO1xyXG5cclxuLyoqXHJcbiAqIFwiR2l2ZW4gdHdvIGFycmF5cywgcmV0dXJuIHRoZSBlbGVtZW50cyBpbiB0aGUgZmlyc3QgYXJyYXkgdGhhdCBhcmUgbm90IGluIHRoZSBzZWNvbmQgYXJyYXkuXCJcclxuICogQHBhcmFtIHtUW119IEEgLSB0aGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgZmlsdGVyZWRcclxuICogQHBhcmFtIHtUW119IEIgLSB0aGUgYXJyYXkgb2YgaXRlbXMgdGhhdCBhcmUgbm90IGluIEFcclxuICogQHJldHVybnMge1RbXX0gTm9uZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXBsZW1lbnQgPSA8VD4oQTogVFtdLCBCOiBUW10pID0+XHJcbiAgQS5maWx0ZXIoKGEpID0+ICFCLmluY2x1ZGVzKGEpKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzd2FwSXRlbXM8VD4oaTogbnVtYmVyLCBqOiBudW1iZXIsIGFycjogVFtdKSB7XHJcbiAgY29uc3QgbWF4ID0gYXJyLmxlbmd0aCAtIDE7XHJcbiAgaWYgKGkgPCAwIHx8IGkgPiBtYXggfHwgaiA8IDAgfHwgaiA+IG1heCkgcmV0dXJuIGFycjtcclxuICBjb25zdCB0bXAgPSBhcnJbaV07XHJcbiAgYXJyW2ldID0gYXJyW2pdO1xyXG4gIGFycltqXSA9IHRtcDtcclxuICByZXR1cm4gYXJyO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBhbiBhcnJheS5cclxuICogQHBhcmFtIHtUW119IGFyciAtIFRoZSBhcnJheSB0byBiZSBmaWx0ZXJlZC5cclxuICogQHJldHVybnMge1RbXX0gVGhlIGFycmF5IHdpdGggZHVwbGljYXRlcyByZW1vdmVkLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbW92ZUR1cGxpY2F0ZXMgPSA8VD4oYXJyOiBUW10pID0+IFsuLi5uZXcgU2V0KGFycildO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0clRvUmVnZXgoaW5wdXQ6IHN0cmluZykge1xyXG4gIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2gocmVnTkZsYWdzKTtcclxuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcclxuICBjb25zdCBbLCBpbm5lclJlZ2V4LCBmbGFnc10gPSBtYXRjaDtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGlubmVyUmVnZXgsIGZsYWdzKTtcclxuICAgIHJldHVybiByZWdleDtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICB3YXJuKGUpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBTb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcclxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ2V4KHN0cmluZykge1xyXG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgYWRkRWRnZUlmTm90IH0gZnJvbSBcIi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBCQ19JX0FVTlQsIEJDX0lfQ09VU0lOLCBCQ19JX1BBUkVOVCwgQkNfSV9TSUJMSU5HXzEsIEJDX0lfU0lCTElOR18yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncyB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZmFsbGJhY2tGaWVsZCwgZ2V0RmllbGRJbmZvIH0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudChnOiBNdWx0aUdyYXBoLCBzZXR0aW5nczogQkNTZXR0aW5ncykge1xyXG4gICAgY29uc3QgeyB1c2VySGllcnMsIHRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nIH0gPSBzZXR0aW5ncztcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgLy8gRmluZCBwYXJlbnRzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyTkF0dHIsIHMsIHBhcmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJOQXR0ci5kaXIgIT09IFwidXBcIikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBmaWVsZERpciwgZmllbGRIaWVyIH0gPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCBjdXJyTkF0dHIuZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9XHJcbiAgICAgICAgICAgICAgICBmaWVsZEhpZXIuc2FtZVswXSA/PyBmYWxsYmFja0ZpZWxkKGN1cnJOQXR0ci5maWVsZCwgZmllbGREaXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gRmluZCB0aGUgY2hpbGRyZW4gb2YgdGhvc2UgcGFyZW50c1xyXG4gICAgICAgICAgICBnLmZvckVhY2hPdXRFZGdlKHBhcmVudE5vZGUsIChrLCBhLCBzLCBpbXBsaWVkU2libGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgY3VycmVudCBub2RlIGlmIHRoZSBzZXR0aW5ncyBzYXkgdG9cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBhLmRpciAhPT0gXCJkb3duXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICAoIXRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nICYmIGltcGxpZWRTaWJsaW5nID09PSBjdXJyTilcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgYWRkRWRnZUlmTm90KGcsIGN1cnJOLCBpbXBsaWVkU2libGluZywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJzYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9TSUJMSU5HXzEsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNpYmxpbmdzUGFyZW50SXNQYXJlbnQoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHNpYmxpbmdzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyTkF0dHIsIHMsIHNpYmxpbmcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJOQXR0ci5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudHMgb2YgdGhvc2Ugc2libGluZ3NcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShzaWJsaW5nLCAoaywgYSwgcywgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIHBhcmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJ1cFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfUEFSRU5ULFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFRyYW5zaXRpdmUgY2xvc3VyZSBvZiBzaWJsaW5nc1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkU2libGluZ3NGcm9tU2libGluZ3MoZzogTXVsdGlHcmFwaCkgeyB9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQXVudHNVbmNsZXMoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHBhcmVudHMgb2YgY3VycmVudCBub2RlXHJcbiAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShjdXJyTiwgKGssIGN1cnJFQXR0ciwgcywgcGFyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY3VyckVBdHRyLmRpciAhPT0gXCJ1cFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHNpYmxpbmdzIG9mIHRob3NlIHBhcmVudHNcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShwYXJlbnROb2RlLCAoaywgYSwgcywgdW5jbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhLmRpciAhPT0gXCJzYW1lXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIHVuY2xlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyOiBcInVwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzdGFydGluZyBub2RlJ3MgcGFyZW50IGZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGN1cnJFQXR0ci5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBsaWVkOiBCQ19JX0FVTlQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ291c2lucyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgICBnLmZvckVhY2hOb2RlKChjdXJyTiwgYSkgPT4ge1xyXG4gICAgICAgIC8vIEZpbmQgcGFyZW50cyBvZiBjdXJyZW50IG5vZGVcclxuICAgICAgICBnLmZvckVhY2hPdXRFZGdlKGN1cnJOLCAoaywgY3VyckVBdHRyLCBzLCBwYXJlbnROb2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyRUF0dHIuZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuICAgICAgICAgICAgLy8gRmluZCB0aGUgc2libGluZ3Mgb2YgdGhvc2UgcGFyZW50c1xyXG4gICAgICAgICAgICBnLmZvckVhY2hPdXRFZGdlKHBhcmVudE5vZGUsIChrLCBwYXJlbnRTaWJsaW5nQXR0ciwgcywgdW5jbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTaWJsaW5nQXR0ci5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZSh1bmNsZSwgKGssIGEsIHMsIGNvdXNpbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmRpciAhPT0gXCJkb3duXCIgfHwgY3Vyck4gPT09IGNvdXNpbikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIGNvdXNpbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcGFyZW50U2libGluZ0F0dHIuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfQ09VU0lOLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFNpcyAtLT4gTWUgPC0tIEJyb1xyXG4vLyBJbXBsaWVzOiBTaXMgPC0tPiBCcm9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzKGc6IE11bHRpR3JhcGgpIHtcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgZy5mb3JFYWNoSW5FZGdlKGN1cnJOLCAoaywgYVNpcywgc2lzLCBfKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhU2lzLmRpciAhPT0gXCJzYW1lXCIpIHJldHVybjtcclxuICAgICAgICAgICAgZy5mb3JFYWNoSW5FZGdlKGN1cnJOLCAoaywgYUJybywgYnJvLCBfKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYUJyby5kaXIgIT09IFwic2FtZVwiIHx8IHNpcyA9PT0gYnJvKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoYUJyby5maWVsZCA9PT0gYVNpcy5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZEVkZ2VJZk5vdChnLCBzaXMsIGJybywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYUJyby5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9TSUJMSU5HXzIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZHJvcFdpa2lsaW5rcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGFkZEVkZ2VJZk5vdCwgYWRkTm9kZXNJZk5vdCB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q1NWUm93cyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBDU1ZQYXRocyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGNvbnN0IENTVlJvd3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIGlmIChDU1ZQYXRocyA9PT0gXCJcIikgcmV0dXJuIENTVlJvd3M7XHJcblxyXG4gIGNvbnN0IGZ1bGxQYXRoID0gbm9ybWFsaXplUGF0aChDU1ZQYXRocyk7XHJcblxyXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5yZWFkKGZ1bGxQYXRoKTtcclxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoZWFkKSA9PiBoZWFkLnRyaW0oKSk7XHJcbiAgbGluZXMuc2xpY2UoMSkuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICBjb25zdCByb3dPYmogPSB7fTtcclxuICAgIHJvd1xyXG4gICAgICAuc3BsaXQoXCIsXCIpXHJcbiAgICAgIC5tYXAoKGhlYWQpID0+IGRyb3BXaWtpbGlua3MoaGVhZC50cmltKCkpKVxyXG4gICAgICAuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIHJvd09ialtoZWFkZXJzW2ldXSA9IGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgZGVidWcoeyByb3dPYmogfSk7XHJcbiAgICBDU1ZSb3dzLnB1c2gocm93T2JqKTtcclxuICB9KTtcclxuICByZXR1cm4gQ1NWUm93cztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENTVkNydW1icyhcclxuICBnOiBNdWx0aUdyYXBoLFxyXG4gIENTVlJvd3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSxcclxuICBkaXI6IERpcmVjdGlvbnMsXHJcbiAgZmllbGQ6IHN0cmluZ1xyXG4pIHtcclxuICBDU1ZSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgYWRkTm9kZXNJZk5vdChnLCBbcm93LmZpbGVdKTtcclxuICAgIGlmIChmaWVsZCA9PT0gXCJcIiB8fCAhcm93W2ZpZWxkXSkgcmV0dXJuO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoZywgW3Jvd1tmaWVsZF1dKTtcclxuICAgIGFkZEVkZ2VJZk5vdChnLCByb3cuZmlsZSwgcm93W2ZpZWxkXSwgeyBkaXIsIGZpZWxkIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBCQ19EVl9OT1RFLCBCQ19EVl9OT1RFX0ZJRUxELCBCQ19JR05PUkUsIERBVEFWSUVXX01JU1NJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF0YXZpZXdOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBlbGlnYWJsZUFsdHM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycywgZGF0YXZpZXdOb3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICBpZiAoIWR2ICYmIGVsaWdhYmxlQWx0cy5sZW5ndGgpIHtcclxuICAgIG5ldyBOb3RpY2UoREFUQVZJRVdfTUlTU0lORyk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0RFZCYXNlbmFtZShhbHRGaWxlLmZpbGUpO1xyXG5cclxuICAgIGxldCBxdWVyeSA9IGFsdEZpbGVbQkNfRFZfTk9URV0gYXMgKHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xyXG4gICAgaWYgKHF1ZXJ5Lmhhc093blByb3BlcnR5KCdwYXRoJykpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHF1ZXJ5ID0gYFtbJHtxdWVyeS5wYXRofV1dYDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbGV0IGZpZWxkID1cclxuICAgICAgKGFsdEZpbGVbQkNfRFZfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAoZGF0YXZpZXdOb3RlRmllbGQgfHwgZmllbGRzWzBdKTtcclxuXHJcbiAgICBsZXQgdGFyZ2V0czogZHZGcm9udG1hdHRlckNhY2hlW10gPSBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRhcmdldHMgPSBkdi5wYWdlcyg8c3RyaW5nPnF1ZXJ5KS52YWx1ZXM7XHJcbiAgICB9IGNhdGNoIChlcikge1xyXG4gICAgICBuZXcgTm90aWNlKGAke3F1ZXJ5fSBpcyBub3QgYSB2YWxpZCBEYXRhdmlldyBmcm9tLXF1ZXJ5YCk7XHJcbiAgICAgIHdhcm4oZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgaWYgKHRhcmdldFtCQ19JR05PUkVdKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgdGFyZ2V0Qk4gPSBnZXREVkJhc2VuYW1lKHRhcmdldC5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXRCTik7XHJcblxyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0Qk4sXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHBvcHVsYXRlTWFpbiB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldERWQmFzZW5hbWUgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgKiBhcyBsdXhvbiBmcm9tIFwibHV4b25cIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHtcclxuICAgIGFkZERhdGVOb3RlcyxcclxuICAgIGRhdGVOb3RlQWRkTW9udGgsXHJcbiAgICBkYXRlTm90ZUFkZFllYXIsXHJcbiAgICBkYXRlTm90ZUZvcm1hdCxcclxuICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGlmICghYWRkRGF0ZU5vdGVzKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IHsgcmVnZXggfSA9IGx1eG9uLkRhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKFwiXCIsIGRhdGVOb3RlRm9ybWF0KTtcclxuICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgIGNvbnN0IHsgZmlsZSB9ID0gcGFnZTtcclxuICAgIGNvbnN0IHsgZGF5IH0gPSBmaWxlO1xyXG4gICAgaWYgKCFkYXkgfHwgIXJlZ2V4LnRlc3QoZ2V0RFZCYXNlbmFtZShmaWxlKSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0b2RheSA9IGdldERWQmFzZW5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b21vcnJvdyA9IGRheS5wbHVzKHsgZGF5czogMSB9KTtcclxuICAgIGNvbnN0IHRvbVN0ciA9IHRvbW9ycm93LnRvRm9ybWF0KGRhdGVOb3RlRm9ybWF0KTtcclxuXHJcbiAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgIHNldHRpbmdzLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgdG9kYXksXHJcbiAgICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgICAgIHRvbVN0cixcclxuICAgICAgOTk5OSxcclxuICAgICAgOTk5OSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfSUdOT1JFLCBCQ19JR05PUkVfREVORFJPTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBkdkZyb250bWF0dGVyQ2FjaGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldERlbmRyb25QYXJlbnQgPSAoZGVuZHJvbjogc3RyaW5nLCBzcGxpdHRlcjogc3RyaW5nKSA9PlxyXG4gIGRlbmRyb24uc3BsaXQoc3BsaXR0ZXIpLnNsaWNlKDAsIC0xKS5qb2luKHNwbGl0dGVyKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgYWRkRGVuZHJvbk5vdGVzLCBkZW5kcm9uTm90ZURlbGltaXRlciwgZGVuZHJvbk5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgaWYgKCFhZGREZW5kcm9uTm90ZXMpIHJldHVybjtcclxuXHJcbiAgZm9yIChjb25zdCBmcm9udG0gb2YgZnJvbnRtcykge1xyXG4gICAgaWYgKGZyb250bVtCQ19JR05PUkVfREVORFJPTl0gfHwgZnJvbnRtW0JDX0lHTk9SRV0pIGNvbnRpbnVlO1xyXG5cclxuICAgIGxldCBjdXJyID0gZ2V0RFZCYXNlbmFtZShmcm9udG0uZmlsZSk7XHJcbiAgICBsZXQgcGFyZW50ID0gZ2V0RGVuZHJvblBhcmVudChjdXJyLCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgd2hpbGUgKHBhcmVudCAhPT0gXCJcIikge1xyXG4gICAgICBjb25zdCBwYXJlbnRGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4gICAgICAgIChmbSkgPT4gZ2V0RFZCYXNlbmFtZShmbS5maWxlKSA9PT0gcGFyZW50XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyAhcGFyZW50RmlsZSBpbXBsaWVzIGEgXCJzdHViXCJcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAoIXBhcmVudEZpbGUgfHwgcGFyZW50RmlsZVtCQ19JR05PUkVfREVORFJPTl0gIT09IHRydWUpIHtcclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgY3VycixcclxuICAgICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbiAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgOTk5OSxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnIgPSBwYXJlbnQ7XHJcbiAgICAgIHBhcmVudCA9IGdldERlbmRyb25QYXJlbnQocGFyZW50LCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBleHBvcnQgZnVuY3Rpb24gYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChcclxuLy8gICBwbHVnaW46IEJDUGx1Z2luLFxyXG4vLyAgIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4vLyAgIG1haW5HOiBNdWx0aUdyYXBoXHJcbi8vICkge1xyXG4vLyAgIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuLy8gICBjb25zdCB7IGFkZERlbmRyb25Ob3RlcywgZGVuZHJvbk5vdGVEZWxpbWl0ZXIsIGRlbmRyb25Ob3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4vLyAgIGlmICghYWRkRGVuZHJvbk5vdGVzKSByZXR1cm47XHJcblxyXG4vLyAgIGZvciAoY29uc3QgZnJvbnRtIG9mIGZyb250bXMpIHtcclxuLy8gICAgIGlmIChmcm9udG1bQkNfSUdOT1JFX0RFTkRST05dKSBjb250aW51ZTtcclxuXHJcbi8vICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZnJvbnRtLmZpbGUpO1xyXG5cclxuLy8gICAgIGNvbnN0IHNwbGl0cyA9IGJhc2VuYW1lLnNwbGl0KGRlbmRyb25Ob3RlRGVsaW1pdGVyKTtcclxuLy8gICAgIGlmIChzcGxpdHMubGVuZ3RoIDw9IDEpIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IG5leHRTbGljZSA9IHNwbGl0cy5zbGljZSgwLCAtMSkuam9pbihkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbi8vICAgICBpZiAoIW5leHRTbGljZSkgY29udGludWU7XHJcbi8vICAgICBjb25zdCBuZXh0U2xpY2VGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4vLyAgICAgICAoZm0pID0+IGdldERWQmFzZW5hbWUoZm0uZmlsZSkgPT09IG5leHRTbGljZVxyXG4vLyAgICAgKTtcclxuXHJcbi8vICAgICBpZiAoIW5leHRTbGljZUZpbGUgfHwgbmV4dFNsaWNlRmlsZVtCQ19JR05PUkVfREVORFJPTl0pIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gZ2V0U291cmNlT3JkZXIoZnJvbnRtKTtcclxuLy8gICAgIGNvbnN0IHRhcmdldE9yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbmV4dFNsaWNlKTtcclxuXHJcbi8vICAgICBwb3B1bGF0ZU1haW4oXHJcbi8vICAgICAgIHNldHRpbmdzLFxyXG4vLyAgICAgICBtYWluRyxcclxuLy8gICAgICAgYmFzZW5hbWUsXHJcbi8vICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbi8vICAgICAgIG5leHRTbGljZSxcclxuLy8gICAgICAgc291cmNlT3JkZXIsXHJcbi8vICAgICAgIHRhcmdldE9yZGVyLFxyXG4vLyAgICAgICB0cnVlXHJcbi8vICAgICApO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgVEZpbGUsIFRGb2xkZXIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgQkNfRk9MREVSX05PVEVfU1VCRk9MREVSUyxcclxuICBCQ19JR05PUkUsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSwgZ2V0Rm9sZGVyTmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCBnZXRTdWJzRnJvbUZvbGRlciA9IChmb2xkZXI6IFRGb2xkZXIpID0+IHtcclxuICBjb25zdCBvdGhlck5vdGVzOiBURmlsZVtdID0gW10sXHJcbiAgICBzdWJGb2xkZXJzOiBURm9sZGVyW10gPSBbXTtcclxuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgodEFic3RyYWN0KSA9PiB7XHJcbiAgICBpZiAodEFic3RyYWN0IGluc3RhbmNlb2YgVEZpbGUpIG90aGVyTm90ZXMucHVzaCh0QWJzdHJhY3QpO1xyXG4gICAgZWxzZSBzdWJGb2xkZXJzLnB1c2godEFic3RyYWN0IGFzIFRGb2xkZXIpO1xyXG4gIH0pO1xyXG4gIHJldHVybiB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRGb2xkZXJOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBmb2xkZXJOb3RlczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZm9sZGVyTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3QgdG9wRm9sZGVyTmFtZSA9IGdldEZvbGRlck5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b3BGb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRvcEZvbGRlck5hbWUpIGFzIFRGb2xkZXI7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG90aGVyKSA9PlxyXG4gICAgICAgICAgZ2V0Rm9sZGVyTmFtZShvdGhlcikgPT09IHRvcEZvbGRlck5hbWUgJiYgb3RoZXIucGF0aCAhPT0gZmlsZS5wYXRoICYmICFvdGhlcltCQ19JR05PUkVdXHJcbiAgICAgIClcclxuICAgICAgLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICBjb25zdCBmaWVsZCA9IGFsdEZpbGVbQkNfRk9MREVSX05PVEVdIGFzIHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgZmllbGQgIT09IFwic3RyaW5nXCIgfHwgIWZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpIHJldHVybjtcclxuXHJcbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAvLyBUaGlzIGlzIGdldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmb2xkZXIgbm90ZSwgbm90IHRoZSBzb3VyY2UgcG9pbnRpbmcgdXAgdG8gaXRcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICBtYWluRyxcclxuICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfU1VCRk9MREVSU10pIHtcclxuICAgICAgY29uc3Qgc3ViZm9sZGVyRmllbGQgPSBhbHRGaWxlW0JDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlNdIGFzIHN0cmluZztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiBzdWJmb2xkZXJGaWVsZCAhPT0gXCJzdHJpbmdcIiB8fFxyXG4gICAgICAgICFmaWVsZHMuaW5jbHVkZXMoc3ViZm9sZGVyRmllbGQpXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcblxyXG4gICAgICBzdWJGb2xkZXJzLmZvckVhY2goKHN1YkZvbGRlcikgPT4ge1xyXG4gICAgICAgIHN1YkZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICAgIGJhc2VuYW1lLFxyXG4gICAgICAgICAgICAgIHN1YmZvbGRlckZpZWxkLFxyXG4gICAgICAgICAgICAgIGNoaWxkQmFzZW5hbWUsXHJcbiAgICAgICAgICAgICAgOTk5OSxcclxuICAgICAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFXSkge1xyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcbiAgICAgIGNvbnN0IGZvbGRlclF1ZXVlOiBURm9sZGVyW10gPSBbLi4uc3ViRm9sZGVyc107XHJcblxyXG4gICAgICBsZXQgY3VyckZvbGRlciA9IGZvbGRlclF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgIHdoaWxlIChjdXJyRm9sZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKGN1cnJGb2xkZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb2xkZXJOb3RlID0gY3VyckZvbGRlci5uYW1lO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBvdGhlck5vdGVzLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKCFpc0luVmF1bHQoIGZvbGRlck5vdGUsIGZvbGRlck5vdGUpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSA5OTk5OyAvLyBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudEZvbGRlck5vdGUgPSBjdXJyRm9sZGVyLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgcGFyZW50Rm9sZGVyTm90ZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgZm9sZGVyTm90ZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IGZvbGRlck5vdGUpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gOTk5OTsgLy8gZ2V0U291cmNlT3JkZXIoYWx0RmlsZSk7XHJcbiAgICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICAgIGZvbGRlck5vdGUsXHJcbiAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9sZGVyUXVldWUucHVzaCguLi5zdWJGb2xkZXJzKTtcclxuICAgICAgICBjdXJyRm9sZGVyID0gZm9sZGVyUXVldWUuc2hpZnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpcnN0IGFkZCBvdGhlck5vdGVzIHRvIGdyYXBoXHJcblxyXG4gICAgLy8gVGhlbiBpdGVyYXRlIHN1YkZvbGRlcnMgZG9pbmcgdGhlIHNhbWVcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lLCBnZXRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncywgSGllcmFyY2h5Tm90ZUl0ZW0gfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBhZGRFZGdlSWZOb3QsIGFkZE5vZGVzSWZOb3QgfSBmcm9tIFwiLi4vLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcywgZ2V0T3BwRGlyLCBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGU6IFRGaWxlKSB7XHJcbiAgY29uc3QgeyBsaXN0SXRlbXMgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICBpZiAoIWxpc3RJdGVtcykgcmV0dXJuIFtdO1xyXG5cclxuICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZmlsZSlcclxuICBjb25zdCB7IGhpZXJhcmNoeU5vdGVJc1BhcmVudCB9ID0gZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgY29uc3QgbGluZXMgPSAoYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHlOb3RlSXRlbXM6IEhpZXJhcmNoeU5vdGVJdGVtW10gPSBbXTtcclxuXHJcbiAgY29uc3QgYWZ0ZXJCdWxsZXRSZWcgPSBuZXcgUmVnRXhwKC9cXHMqWysqLV1cXHMoLiokKS8pO1xyXG4gIGNvbnN0IGRyb3BXaWtpTGlua3NSZWcgPSBuZXcgUmVnRXhwKC9cXFtcXFsoLio/KVxcXVxcXS8pO1xyXG4gIGNvbnN0IGZpZWxkUmVnID0gbmV3IFJlZ0V4cCgvKC4qPylcXFtcXFsuKj9cXF1cXF0vKTtcclxuXHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3RJdGVtcykge1xyXG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2l0ZW0ucG9zaXRpb24uc3RhcnQubGluZV07XHJcblxyXG4gICAgY29uc3QgYWZ0ZXJCdWxsZXRDdXJyID0gYWZ0ZXJCdWxsZXRSZWcuZXhlYyhsaW5lKVsxXTtcclxuICAgIGNvbnN0IG5vdGUgPSBkcm9wV2lraUxpbmtzUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXTtcclxuICAgIGxldCBmaWVsZCA9IGZpZWxkUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXS50cmltKCkgfHwgbnVsbDtcclxuXHJcbiAgICBjb25zdCB7IHBhcmVudCB9ID0gaXRlbTtcclxuICAgIGlmIChwYXJlbnQgPj0gMCkge1xyXG4gICAgICBjb25zdCBwYXJlbnROb3RlID0gbGluZXNbcGFyZW50XTtcclxuICAgICAgY29uc3QgYWZ0ZXJCdWxsZXRQYXJlbnQgPSBhZnRlckJ1bGxldFJlZy5leGVjKHBhcmVudE5vdGUpWzFdO1xyXG4gICAgICBjb25zdCBkcm9wV2lraVBhcmVudCA9IGRyb3BXaWtpTGlua3NSZWcuZXhlYyhhZnRlckJ1bGxldFBhcmVudClbMV07XHJcblxyXG4gICAgICBoaWVyYXJjaHlOb3RlSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbm90ZSxcclxuICAgICAgICBwYXJlbnQ6IGRyb3BXaWtpUGFyZW50LFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGhpZXJhcmNoeU5vdGVJdGVtcy5wdXNoKHtcclxuICAgICAgICBub3RlLFxyXG4gICAgICAgIHBhcmVudDogaGllcmFyY2h5Tm90ZUlzUGFyZW50ID8gYmFzZW5hbWUgOiBudWxsLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGhpZXJhcmNoeU5vdGVJdGVtcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhOc1RvR3JhcGgoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgaG5BcnI6IEhpZXJhcmNoeU5vdGVJdGVtW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBITlVwRmllbGQsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgdXBGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzLCBcInVwXCIpO1xyXG5cclxuICBobkFyci5mb3JFYWNoKChobkl0ZW0sIGkpID0+IHtcclxuICAgIGNvbnN0IHsgbm90ZSwgZmllbGQsIHBhcmVudCB9ID0gaG5JdGVtO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldEZpZWxkID0gZmllbGQgPz8gKEhOVXBGaWVsZCB8fCB1cEZpZWxkc1swXSk7XHJcbiAgICBjb25zdCBkaXIgPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCB0YXJnZXRGaWVsZCk/LmZpZWxkRGlyO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIHRhcmdldEZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgcyA9IG5vdGU7XHJcbiAgICAgIGNvbnN0IHQgPSBobkFycltpICsgMV0/Lm5vdGU7XHJcblxyXG4gICAgICBhZGROb2Rlc0lmTm90KG1haW5HLCBbcywgdF0pO1xyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHMsIHQsIHsgZGlyOiBvcHBEaXIsIGZpZWxkOiBvcHBGaWVsZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkZE5vZGVzSWZOb3QobWFpbkcsIFtub3RlLCBwYXJlbnRdKTtcclxuICAgICAgaWYgKHNldHRpbmdzLnNob3dVcEluSnVnZ2wpIHtcclxuICAgICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIG5vdGUsIHBhcmVudCwge1xyXG4gICAgICAgICAgZGlyLFxyXG4gICAgICAgICAgZmllbGQ6IHRhcmdldEZpZWxkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHBhcmVudCwgbm90ZSwge1xyXG4gICAgICAgIGRpcjogb3BwRGlyLFxyXG4gICAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IHBhcnNlVHlwZWRMaW5rIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHNwbGl0TGlua3NSZWdleCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBkdkZyb250bWF0dGVyQ2FjaGUsIEp1Z2dsTGluayB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFRhcmdldE9yZGVyLCBwb3B1bGF0ZU1haW4gfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbi8vIFRPRE8gSSB0aGluayBpdCdkIGJlIGJldHRlciB0byBkbyB0aGlzIHdob2xlIHRoaW5nIGFzIGFuIG9iaiBpbnN0ZWFkIG9mIEp1Z2dsTGlua1tdXHJcbi8vID0+IHtbbm90ZTogc3RyaW5nXToge3R5cGU6IHN0cmluZywgbGlua3NJbkxpbmU6IHN0cmluZ1tdfVtdfVxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SnVnZ2xMaW5rcyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGZpbGVzOiBURmlsZVtdXHJcbik6IFByb21pc2U8SnVnZ2xMaW5rW10+IHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGRiLnN0YXJ0MkcoXCJnZXRKdWdnbExpbmtzXCIpO1xyXG5cclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIC8vIEFkZCBKdWdnbCBsaW5rc1xyXG4gIGNvbnN0IHR5cGVkTGlua3NBcnI6IEp1Z2dsTGlua1tdID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcclxuICAgICAgY29uc3QganVnZ2xMaW5rOiBKdWdnbExpbmsgPSB7IGZpbGUsIGxpbmtzOiBbXSB9O1xyXG5cclxuICAgICAgLy8gVXNlIE9icyBtZXRhZGF0YWNhY2hlIHRvIGdldCB0aGUgbGlua3MgaW4gdGhlIGN1cnJlbnQgZmlsZVxyXG4gICAgICBjb25zdCBsaW5rcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKT8ubGlua3MgPz8gW107XHJcblxyXG4gICAgICBjb25zdCBjb250ZW50ID0gbGlua3MubGVuZ3RoID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiBcIlwiO1xyXG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGluZU5vID0gbGluay5wb3NpdGlvbi5zdGFydC5saW5lO1xyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsaW5lTm9dO1xyXG5cclxuICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBmb3Igd2lraWxpbmtzLCBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGxpbmsuaW5uZXJUZXh0XHJcbiAgICAgICAgY29uc3QgbGlua3NJbkxpbmUgPVxyXG4gICAgICAgICAgbGluZVxyXG4gICAgICAgICAgICAubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICAgICAgICA/Lm1hcCgobGluaykgPT4gbGluay5zbGljZSgyLCBsaW5rLmxlbmd0aCAtIDIpKVxyXG4gICAgICAgICAgICA/Lm1hcCgoaW5uZXJUZXh0KSA9PiBpbm5lclRleHQuc3BsaXQoXCJ8XCIpWzBdKSA/PyBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZWRMaW5rUHJlZml4ID1cclxuICAgICAgICAgIGFwcC5wbHVnaW5zLnBsdWdpbnMuanVnZ2w/LnNldHRpbmdzLnR5cGVkTGlua1ByZWZpeCA/PyBcIi1cIjtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyc2VkTGlua3MgPSBwYXJzZVR5cGVkTGluayhsaW5rLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHBhcnNlZExpbmtzPy5wcm9wZXJ0aWVzPy50eXBlID8/IFwiXCI7XHJcbiAgICAgICAgaWYgKGZpZWxkID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgeyBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpIHx8IHt9O1xyXG4gICAgICAgIGlmICghZmllbGREaXIpIHJldHVybjtcclxuXHJcbiAgICAgICAganVnZ2xMaW5rLmxpbmtzLnB1c2goe1xyXG4gICAgICAgICAgZGlyOiBmaWVsZERpcixcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua3NJbkxpbmUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgY29uc3QgZmlsdGVyZWRMaW5rcyA9IHR5cGVkTGlua3NBcnIubWFwKChqdWdnbExpbmspID0+IHtcclxuICAgIC8vIEZpbHRlciBvdXQgbGlua3Mgd2hvc2UgdHlwZSBpcyBub3QgaW4gYWxsRmllbGRzXHJcbiAgICBqdWdnbExpbmsubGlua3MgPSBqdWdnbExpbmsubGlua3MuZmlsdGVyKChsaW5rKSA9PlxyXG4gICAgICBhbGxGaWVsZHMuaW5jbHVkZXMobGluay5maWVsZClcclxuICAgICk7XHJcbiAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gIH0pO1xyXG4gIGRiLmVuZDJHKHsgZmlsdGVyZWRMaW5rcyB9KTtcclxuICByZXR1cm4gZmlsdGVyZWRMaW5rcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1Z2dsTGlua3NUb0dyYXBoKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIGp1Z2dsTGlua3M6IEp1Z2dsTGlua1tdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGp1Z2dsTGlua3MuZm9yRWFjaCgoanVnZ2xMaW5rKSA9PiB7XHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBqdWdnbExpbmsuZmlsZTtcclxuICAgIGp1Z2dsTGluay5saW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgbGlua3NJbkxpbmUgfSA9IGxpbms7XHJcbiAgICAgIGlmIChkaXIgPT09IFwiXCIpIHJldHVybjtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIGxpbmtzSW5MaW5lLmZvckVhY2goKGxpbmtJbkxpbmUpID0+IHtcclxuICAgICAgICAvLyBJcyB0aGlzIGEgYnVnPyBXaHkgbm90IGBnZXRTb3VyY2VPcmRlcmA/XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0c09yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbGlua0luTGluZSk7XHJcblxyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua0luTGluZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0c09yZGVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfTElOS19OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkTGlua05vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBlbGlnYWJsZUFsdHMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgbGlua05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgbGlua05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUobGlua05vdGVGaWxlKTtcclxuXHJcbiAgICBsZXQgZmllbGQgPSBhbHRGaWxlW0JDX0xJTktfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGxpbmtzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8ubGlua3M/Lm1hcCgobCkgPT4gbC5saW5rLm1hdGNoKC9bXiN8XSsvKVswXSk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8uZW1iZWRzPy5tYXAoKGwpID0+IGwubGluay5tYXRjaCgvW14jfF0rLylbMF0pO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldHMgPSBbLi4uKGxpbmtzID8/IFtdKSwgLi4uKGVtYmVkcyA/PyBbXSldO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBsaW5rTm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIGxpbmtOb3RlQmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0LFxyXG4gICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgIHRhcmdldE9yZGVyLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19JR05PUkUsIEJDX1JFR0VYX05PVEUsIEJDX1JFR0VYX05PVEVfRklFTEQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3RyVG9SZWdleCB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCByZWdleE5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIGVsaWdhYmxlQWx0cy5mb3JFYWNoKChhbHRGaWxlKSA9PiB7XHJcbiAgICBjb25zdCByZWdleE5vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgcmVnZXhOb3RlQmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKHJlZ2V4Tm90ZUZpbGUpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gc3RyVG9SZWdleChhbHRGaWxlW0JDX1JFR0VYX05PVEVdIGFzIHN0cmluZyk7XHJcbiAgICBpbmZvKHsgcmVnZXggfSk7XHJcblxyXG4gICAgbGV0IGZpZWxkID0gYWx0RmlsZVtCQ19SRUdFWF9OT1RFX0ZJRUxEXSBhcyBzdHJpbmc7XHJcbiAgICBpZiAodHlwZW9mIGZpZWxkICE9PSBcInN0cmluZ1wiIHx8ICFmaWVsZHMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICAgICBmaWVsZCA9IHJlZ2V4Tm90ZUZpZWxkIHx8IGZpZWxkc1swXTtcclxuXHJcbiAgICBjb25zdCB0YXJnZXRzID0gW107XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgaWYgKHBhZ2VbQkNfSUdOT1JFXSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgaWYgKGJhc2VuYW1lICE9PSByZWdleE5vdGVCYXNlbmFtZSAmJiByZWdleC50ZXN0KGJhc2VuYW1lKSlcclxuICAgICAgICB0YXJnZXRzLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xyXG4gICAgICBjb25zdCBzb3VyY2VPcmRlciA9IGdldFNvdXJjZU9yZGVyKGFsdEZpbGUpO1xyXG4gICAgICBjb25zdCB0YXJnZXRPcmRlciA9IGdldFRhcmdldE9yZGVyKGZyb250bXMsIHJlZ2V4Tm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIHJlZ2V4Tm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lHTk9SRSxcclxuICBCQ19UQUdfTk9URSxcclxuICBCQ19UQUdfTk9URV9FWEFDVCxcclxuICBCQ19UQUdfTk9URV9GSUVMRCxcclxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGFkZEhhc2gsIGRyb3BIYXNoLCBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldEFsbFRhZ3MgPSAoZmlsZTogVEZpbGUsIHdpdGhIYXNoID0gdHJ1ZSk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCB7IHRhZ3MsIGZyb250bWF0dGVyIH0gPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgY29uc3QgYWxsVGFnczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgdGFncz8uZm9yRWFjaCgodCkgPT4gYWxsVGFncy5wdXNoKGRyb3BIYXNoKHQudGFnKSkpO1xyXG5cclxuICBbZnJvbnRtYXR0ZXI/LnRhZ3MgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcbiAgW2Zyb250bWF0dGVyPy50YWcgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBhbGxUYWdzLm1hcCgodCkgPT4gKHdpdGhIYXNoID8gXCIjXCIgOiBcIlwiKSArIHQudG9Mb3dlckNhc2UoKSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZWxpZ2FibGVBbHRzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMsIHRhZ05vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IHRhZ05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG5cclxuICAgIGNvbnN0IHRhZ05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUodGFnTm90ZUZpbGUpO1xyXG4gICAgY29uc3QgdGFnID0gYWRkSGFzaCgoYWx0RmlsZVtCQ19UQUdfTk9URV0gYXMgc3RyaW5nKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICBpbmZvKHsgdGFnIH0pO1xyXG5cclxuICAgIGNvbnN0IGhhc1RoaXNUYWcgPSAoZmlsZTogVEZpbGUpID0+IHtcclxuICAgICAgY29uc3QgYWxsVGFncyA9IGdldEFsbFRhZ3MoZmlsZSk7XHJcbiAgICAgIHJldHVybiBhbHRGaWxlW0JDX1RBR19OT1RFX0VYQUNUXSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBhbGxUYWdzLmluY2x1ZGVzKHRhZylcclxuICAgICAgICA6IGFsbFRhZ3Muc29tZSgodCkgPT4gdC5pbmNsdWRlcyh0YWcpKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUucGF0aCAhPT0gdGFnTm90ZUZpbGUucGF0aCAmJiBoYXNUaGlzVGFnKGZpbGUpICYmICFmaWxlW0JDX0lHTk9SRV0pXHJcbiAgICAgIC5tYXAoZ2V0RFZCYXNlbmFtZSk7XHJcbiAgICBpbmZvKHsgdGFyZ2V0cyB9KTtcclxuXHJcbiAgICBsZXQgZmllbGQgPVxyXG4gICAgICAoYWx0RmlsZVtCQ19UQUdfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAodGFnTm90ZUZpZWxkIHx8IGZpZWxkc1swXSk7XHJcblxyXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YWdOb3RlQmFzZW5hbWUpO1xyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgdGFnTm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19UUkFWRVJTRV9OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRmc0FsbFBhdGhzLCBwb3B1bGF0ZU1haW4sIHJlbW92ZUN5Y2xlcyB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB0cmF2ZXJzZU5vdGVzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaCxcclxuICBvYnNHOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIHRyYXZlcnNlTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3Qgbm9DeWNsZXMgPSByZW1vdmVDeWNsZXMob2JzRywgYmFzZW5hbWUpO1xyXG5cclxuICAgIGxldCBmaWVsZCA9IGFsdEZpbGVbQkNfVFJBVkVSU0VfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFsbFBhdGhzID0gZGZzQWxsUGF0aHMobm9DeWNsZXMsIGJhc2VuYW1lKTtcclxuICAgIGluZm8oYWxsUGF0aHMpO1xyXG4gICAgY29uc3QgcmV2ZXJzZWQgPSBbLi4uYWxsUGF0aHNdLm1hcCgocGF0aCkgPT4gcGF0aC5yZXZlcnNlKCkpO1xyXG4gICAgcmV2ZXJzZWQuZm9yRWFjaCgocGF0aCkgPT4ge1xyXG4gICAgICBwYXRoLmZvckVhY2goKG5vZGUsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gcGF0aFtpICsgMV07XHJcbiAgICAgICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgbmV4dCxcclxuICAgICAgICAgIDk5OTksXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGVycm9yLCBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE1hcmtkb3duVmlldywgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IE5leHRQcmV2IGZyb20gXCIuLi9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZVwiO1xyXG5pbXBvcnQgVHJhaWxHcmlkIGZyb20gXCIuLi9Db21wb25lbnRzL1RyYWlsR3JpZC5zdmVsdGVcIjtcclxuaW1wb3J0IFRyYWlsUGF0aCBmcm9tIFwiLi4vQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlXCI7XHJcbmltcG9ydCB7XHJcbiAgQkNfSElERV9UUkFJTCxcclxuICBibGFua1JlYWxOSW1wbGllZCxcclxuICBKVUdHTF9UUkFJTF9ERUZBVUxUUyxcclxuICBUUkFJTF9MRU5HVEhTLFxyXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBFZGdlQXR0ciwgUmVhbE5JbXBsaWVkIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBiZnNBbGxQYXRocyxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFN1YkZvckZpZWxkcyxcclxuICBnZXRTdWJJbkRpcnMsXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSnVnZ2xUcmFpbCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9KdWdnbFwiO1xyXG5cclxuZnVuY3Rpb24gZ2V0TGltaXRlZFRyYWlsU3ViKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBtYWluRywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgbGltaXRUcmFpbENoZWNrYm94ZXMsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmIChcclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmV2ZXJ5KChmaWVsZCkgPT4gbGltaXRUcmFpbENoZWNrYm94ZXMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICkge1xyXG4gICAgcmV0dXJuIGdldFN1YkluRGlycyhjbG9zZWRHLCBcInVwXCIpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvcHBGaWVsZHMgPSBsaW1pdFRyYWlsQ2hlY2tib3hlc1xyXG4gICAgICAubWFwKChmaWVsZCkgPT4gZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIFwidXBcIik/LlswXSlcclxuICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xyXG4gICAgY29uc3Qgc3ViR3JhcGggPSBnZXRTdWJGb3JGaWVsZHMobWFpbkcsIFtcclxuICAgICAgLi4ubGltaXRUcmFpbENoZWNrYm94ZXMsXHJcbiAgICAgIC4uLm9wcEZpZWxkcyxcclxuICAgIF0pO1xyXG4gICAgY29uc3QgY2xvc2VkID0gZ2V0UmVmbGV4aXZlQ2xvc3VyZShzdWJHcmFwaCwgdXNlckhpZXJzKTtcclxuICAgIHJldHVybiBnZXRTdWJJbkRpcnMoY2xvc2VkLCBcInVwXCIpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnMoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGVcclxuKTogc3RyaW5nW11bXSB8IG51bGwge1xyXG4gIGNvbnN0IHsgYmFzZW5hbWUsIGV4dGVuc2lvbiB9ID0gY3VyckZpbGU7XHJcbiAgaWYgKGV4dGVuc2lvbiAhPT0gXCJtZFwiKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgY29uc3QgYWxsVHJhaWxzID0gYmZzQWxsUGF0aHMoZywgYmFzZW5hbWUpO1xyXG4gIGxldCBmaWx0ZXJlZFRyYWlscyA9IFsuLi5hbGxUcmFpbHNdO1xyXG5cclxuICBjb25zdCB7IGluZGV4Tm90ZXMsIHNob3dBbGxQYXRoc0lmTm9uZVRvSW5kZXhOb3RlIH0gPSBzZXR0aW5ncztcclxuICAvLyBGaWx0ZXIgZm9yIGluZGV4IG5vdGVzXHJcbiAgaWYgKFxyXG4gICAgLy8gV29ya3MgZm9yIGB1bmRlZmluZWRgIGFuZCBgXCJcImBcclxuICAgIGluZGV4Tm90ZXNbMF0gJiZcclxuICAgIGZpbHRlcmVkVHJhaWxzLmxlbmd0aFxyXG4gICkge1xyXG4gICAgZmlsdGVyZWRUcmFpbHMgPSBmaWx0ZXJlZFRyYWlscy5maWx0ZXIoKHRyYWlsKSA9PlxyXG4gICAgICBpbmRleE5vdGVzLmluY2x1ZGVzKHRyYWlsWzBdKVxyXG4gICAgKTtcclxuICAgIGlmIChmaWx0ZXJlZFRyYWlscy5sZW5ndGggPT09IDAgJiYgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGUpXHJcbiAgICAgIGZpbHRlcmVkVHJhaWxzID0gWy4uLmFsbFRyYWlsc107XHJcbiAgfVxyXG5cclxuICBjb25zdCBzb3J0ZWRUcmFpbHMgPSBmaWx0ZXJlZFRyYWlsc1xyXG4gICAgLmZpbHRlcigodHJhaWwpID0+IHRyYWlsLmxlbmd0aCA+IDApXHJcbiAgICAuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCk7XHJcblxyXG4gIHJldHVybiBzb3J0ZWRUcmFpbHM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5leHROUHJldihwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBtYWluRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgaWYgKCFtYWluRykgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgbmV4dE5QcmV2OiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG5cclxuICBtYWluRy5mb3JFYWNoRWRnZShjdXJyTm9kZSwgKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgaW1wbGllZCB9ID0gYSBhcyBFZGdlQXR0cjtcclxuICAgIGlmIChkaXIgIT09IFwibmV4dFwiICYmIGRpciAhPT0gXCJwcmV2XCIpIHJldHVybjtcclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZXh0TlByZXZbZGlyXS5yZWFscy5wdXNoKHsgZmllbGQsIHRvOiB0LCBpbXBsaWVkIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgb3BwRmllbGQgPSBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXTtcclxuICAgICAgbmV4dE5QcmV2W2dldE9wcERpcihkaXIpXS5pbXBsaWVkcy5wdXNoKHtcclxuICAgICAgICBmaWVsZDogb3BwRmllbGQsXHJcbiAgICAgICAgdG86IHMsXHJcbiAgICAgICAgaW1wbGllZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG5leHROUHJldjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYWlsTGVuZ3RoKGN1cnI6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIgPSAxKSB7XHJcbiAgY29uc3QgaW5kZXggPVxyXG4gICAgKFRSQUlMX0xFTkdUSFMuaW5kZXhPZihjdXJyKSArIG9mZnNldCkgJSBUUkFJTF9MRU5HVEhTLmxlbmd0aDtcclxuICByZXR1cm4gVFJBSUxfTEVOR1RIU1tpbmRleCA8IDAgPyBUUkFJTF9MRU5HVEhTLmxlbmd0aCArIGluZGV4IDogaW5kZXhdO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZHJhd1RyYWlsKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBzZXR0aW5ncywgZGIsIG1haW5HIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIG5vUGF0aE1lc3NhZ2UsXHJcbiAgICAgIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGgsXHJcbiAgICAgIHNob3dUcmFpbCxcclxuICAgICAgc2hvd0dyaWQsXHJcbiAgICAgIHNob3dKdWdnbCxcclxuICAgICAgc2hvd1ByZXZOZXh0LFxyXG4gICAgICBzaG93QkNzSW5FZGl0TFBNb2RlLFxyXG4gICAgfSA9IHNldHRpbmdzO1xyXG5cclxuICAgIGRiLnN0YXJ0MkcoXCJkcmF3VHJhaWxcIik7XHJcblxyXG4gICAgY29uc3QgYWN0aXZlTURWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcbiAgICBjb25zdCBtb2RlID0gYWN0aXZlTURWaWV3Py5nZXRNb2RlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhc2hvd0JDcyB8fFxyXG4gICAgICAhYWN0aXZlTURWaWV3IHx8XHJcbiAgICAgIChtb2RlICE9PSBcInByZXZpZXdcIiAmJiAhc2hvd0JDc0luRWRpdExQTW9kZSlcclxuICAgICkge1xyXG4gICAgICBhY3RpdmVNRFZpZXc/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoXCIuQkMtdHJhaWxcIik/LnJlbW92ZSgpO1xyXG4gICAgICByZXR1cm4gZGIuZW5kMkcoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGZpbGUgfSA9IGFjdGl2ZU1EVmlldztcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKSA/PyB7fTtcclxuXHJcblxyXG4gICAgaWYgKGZyb250bWF0dGVyPy5bQkNfSElERV9UUkFJTF0gfHwgZnJvbnRtYXR0ZXI/LltcImthbmJhbi1wbHVnaW5cIl0pIHJldHVybiBkYi5lbmQyRygpO1xyXG5cclxuICAgIGNvbnN0IHsgYmFzZW5hbWUgfSA9IGZpbGU7XHJcbiAgICBpZiAoIW1haW5HLmhhc05vZGUoYmFzZW5hbWUpKSByZXR1cm4gZGIuZW5kMkcoKTtcclxuXHJcbiAgICBjb25zdCB2aWV3ID1cclxuICAgICAgbW9kZSA9PT0gXCJwcmV2aWV3XCJcclxuICAgICAgICA/IGFjdGl2ZU1EVmlldy5wcmV2aWV3TW9kZS5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgXCJkaXYubWFya2Rvd24tcHJldmlldy12aWV3XCJcclxuICAgICAgICApXHJcbiAgICAgICAgOiBhY3RpdmVNRFZpZXcuY29udGVudEVsLnF1ZXJ5U2VsZWN0b3IoXCJkaXYubWFya2Rvd24tc291cmNlLXZpZXdcIik7XHJcblxyXG4gICAgYWN0aXZlTURWaWV3LmNvbnRhaW5lckVsXHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLkJDLXRyYWlsXCIpXHJcbiAgICAgID8uZm9yRWFjaCgodHJhaWwpID0+IHRyYWlsLnJlbW92ZSgpKTtcclxuXHJcbiAgICBjb25zdCBjbG9zZWRVcCA9IGdldExpbWl0ZWRUcmFpbFN1YihwbHVnaW4pO1xyXG4gICAgY29uc3Qgc29ydGVkVHJhaWxzID0gZ2V0QnJlYWRjcnVtYnMoc2V0dGluZ3MsIGNsb3NlZFVwLCBmaWxlKTtcclxuICAgIGluZm8oeyBzb3J0ZWRUcmFpbHMgfSk7XHJcblxyXG4gICAgY29uc3Qge1xyXG4gICAgICBuZXh0OiB7IHJlYWxzOiByTmV4dCwgaW1wbGllZHM6IGlOZXh0IH0sXHJcbiAgICAgIHByZXY6IHsgcmVhbHM6IHJQcmV2LCBpbXBsaWVkczogaVByZXYgfSxcclxuICAgIH0gPSBnZXROZXh0TlByZXYocGx1Z2luLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkXHJcbiAgICBjb25zdCBuZXh0ID0gWy4uLnJOZXh0XTtcclxuICAgIGlOZXh0LmZvckVhY2goKGkpID0+IHtcclxuICAgICAgaWYgKG5leHQuZmluZEluZGV4KChuKSA9PiBuLnRvID09PSBpLnRvKSA9PT0gLTEpXHJcbiAgICAgICAgbmV4dC5wdXNoKGkpXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHByZXYgPSBbLi4uclByZXZdO1xyXG4gICAgaVByZXYuZm9yRWFjaCgoaSkgPT4ge1xyXG4gICAgICBpZiAocHJldi5maW5kSW5kZXgoKG4pID0+IG4udG8gPT09IGkudG8pID09PSAtMSlcclxuICAgICAgICBwcmV2LnB1c2goaSlcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG5vSXRlbXMgPSAhc29ydGVkVHJhaWxzLmxlbmd0aCAmJiAhbmV4dC5sZW5ndGggJiYgIXByZXYubGVuZ3RoO1xyXG5cclxuICAgIGlmIChub0l0ZW1zICYmIG5vUGF0aE1lc3NhZ2UgPT09IFwiXCIpIHJldHVybiBkYi5lbmQyRygpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdG9yRm9yTWF4V2lkdGggPVxyXG4gICAgICBtb2RlID09PSBcInByZXZpZXdcIlxyXG4gICAgICAgID8gXCIubWFya2Rvd24tcHJldmlldy12aWV3LmlzLXJlYWRhYmxlLWxpbmUtd2lkdGggLm1hcmtkb3duLXByZXZpZXctc2l6ZXJcIlxyXG4gICAgICAgIDogXCJcIjtcclxuXHJcbiAgICBjb25zdCBlbEZvck1heFdpZHRoID1cclxuICAgICAgc2VsZWN0b3JGb3JNYXhXaWR0aCAhPT0gXCJcIlxyXG4gICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvckZvck1heFdpZHRoKVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IG1heF93aWR0aCA9IGVsRm9yTWF4V2lkdGhcclxuICAgICAgPyBnZXRDb21wdXRlZFN0eWxlKGVsRm9yTWF4V2lkdGgpLmdldFByb3BlcnR5VmFsdWUoXCJtYXgtd2lkdGhcIilcclxuICAgICAgOiBcIjEwMCVcIjtcclxuXHJcbiAgICBjb25zdCB0cmFpbERpdiA9IGNyZWF0ZURpdih7XHJcbiAgICAgIGNsczogYEJDLXRyYWlsICR7cmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aFxyXG4gICAgICAgID8gXCJpcy1yZWFkYWJsZS1saW5lLXdpZHRoIG1hcmtkb3duLXByZXZpZXctc2l6ZXIgbWFya2Rvd24tcHJldmlldy1zZWN0aW9uXCJcclxuICAgICAgICA6IFwiXCJcclxuICAgICAgICB9YCxcclxuICAgICAgYXR0cjoge1xyXG4gICAgICAgIHN0eWxlOlxyXG4gICAgICAgICAgKG1vZGUgIT09IFwicHJldmlld1wiID8gYG1heC13aWR0aDogJHttYXhfd2lkdGh9O2AgOiBcIlwiKSArXHJcbiAgICAgICAgICBcIm1hcmdpbjogMCBhdXRvOyB3aWR0aDogMTAwJTtcIixcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHBsdWdpbi52aXNpdGVkLnB1c2goW2ZpbGUucGF0aCwgdHJhaWxEaXZdKTtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gXCJwcmV2aWV3XCIpIHtcclxuICAgICAgdmlldy5xdWVyeVNlbGVjdG9yKFwiZGl2Lm1hcmtkb3duLXByZXZpZXctc2l6ZXJcIikuYmVmb3JlKHRyYWlsRGl2KTtcclxuXHJcbiAgICAgIC8vIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vYnNpZGlhbi1iYW5uZXItd3JhcHBlcicpXHJcbiAgICAgIC8vIGlmIChiYW5uZXIpIHtcclxuICAgICAgLy8gICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAvLyAgICAgY29uc3QgYmFubmVyTWFyZ2luID0gZ2V0Q29tcHV0ZWRTdHlsZShiYW5uZXIpLm1hcmdpblRvcFxyXG4gICAgICAvLyAgICAgY29uc29sZS5sb2coYmFubmVyTWFyZ2luKVxyXG4gICAgICAvLyAgICAgdHJhaWxEaXYuc3R5bGUubWFyZ2luVG9wID0gYmFubmVyTWFyZ2luO1xyXG4gICAgICAvLyAgICAgYmFubmVyLnN0eWxlLm1hcmdpblRvcCA9ICcwcHgnXHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgLy8gfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY21HdXR0ZXIgPSB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuY20tZ3V0dGVyc1wiKTtcclxuICAgICAgaWYgKGNtR3V0dGVyKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGd1dHRlckhlaWdodCA9IHRyYWlsRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuICAgICAgICAgIC8vIHNldCBwYWRkaW5nIHRvcCBvZiBndXR0ZXIgdG8gbWF0Y2ggaGVpZ2h0IG9mIHRyYWlsRGl2XHJcbiAgICAgICAgICBjbUd1dHRlci5zdHlsZS5wYWRkaW5nVG9wID0gYCR7Z3V0dGVySGVpZ2h0ICsgNH1weGA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vYnNpZGlhbi1iYW5uZXItc3BhY2VyJylcclxuICAgICAgLy8gaWYgKGJhbm5lcikge1xyXG4gICAgICAvLyAgIGNvbnNvbGUubG9nKHsgYmFubmVyIH0pXHJcbiAgICAgIC8vICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgLy8gICAgIGNvbnN0IGJhbm5lck1hcmdpbiA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoYmFubmVyKS5oZWlnaHQpXHJcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZyhiYW5uZXJNYXJnaW4pXHJcbiAgICAgIC8vICAgICB0cmFpbERpdi5zdHlsZS5tYXJnaW5Ub3AgPSBgJHtiYW5uZXJNYXJnaW4gKyAxMH1weGA7XHJcbiAgICAgIC8vICAgICBiYW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzBweCdcclxuICAgICAgLy8gICB9KVxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuY20tY29udGVudENvbnRhaW5lclwiKT8uYmVmb3JlKHRyYWlsRGl2KVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgdHJhaWxEaXYuZW1wdHkoKTtcclxuICAgIGlmIChzZXR0aW5ncy5pbmRleE5vdGVzLmluY2x1ZGVzKGJhc2VuYW1lKSkge1xyXG4gICAgICB0cmFpbERpdi5pbm5lclRleHQgPSBcIkluZGV4IE5vdGVcIjtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vSXRlbXMpIHtcclxuICAgICAgdHJhaWxEaXYuaW5uZXJUZXh0ID0gbm9QYXRoTWVzc2FnZTtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0UHJvcHMgPSB7XHJcbiAgICAgIHRhcmdldDogdHJhaWxEaXYsXHJcbiAgICAgIHByb3BzOiB7IHNvcnRlZFRyYWlscywgcGx1Z2luIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChzaG93VHJhaWwgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkgbmV3IFRyYWlsUGF0aCh0YXJnZXRQcm9wcyk7XHJcbiAgICBpZiAoc2hvd0dyaWQgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkgbmV3IFRyYWlsR3JpZCh0YXJnZXRQcm9wcyk7XHJcbiAgICBpZiAoc2hvd1ByZXZOZXh0ICYmIChuZXh0Lmxlbmd0aCB8fCBwcmV2Lmxlbmd0aCkpIHtcclxuICAgICAgbmV3IE5leHRQcmV2KHtcclxuICAgICAgICB0YXJnZXQ6IHRyYWlsRGl2LFxyXG4gICAgICAgIHByb3BzOiB7IHBsdWdpbiwgbmV4dCwgcHJldiB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzaG93SnVnZ2wgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkge1xyXG4gICAgICBjcmVhdGVKdWdnbFRyYWlsKFxyXG4gICAgICAgIHBsdWdpbixcclxuICAgICAgICB0cmFpbERpdixcclxuICAgICAgICBzb3J0ZWRUcmFpbHMsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgSlVHR0xfVFJBSUxfREVGQVVMVFNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcGx1Z2luLmRiLmVuZDJHKCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IG9wZW5PclN3aXRjaCwgaG92ZXJQcmV2aWV3IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuICBpbXBvcnQgdHlwZSB7IFNxdWFyZUl0ZW0gfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgbGlua0NsYXNzIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgbmV4dDogU3F1YXJlSXRlbVtdO1xyXG4gIGV4cG9ydCBsZXQgcHJldjogU3F1YXJlSXRlbVtdO1xyXG5cclxuICBjb25zdCBhY3RpdmVMZWFmVmlldyA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3O1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1OZXh0UHJldi1Db250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtcHJldnNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICB7I2VhY2ggcHJldiBhcyB7IGZpZWxkLCByZWFsLCB0byB9fVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwie2xpbmtDbGFzcyh0bywgcmVhbCl9IEJDLXByZXZcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB0byl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHN0cm9uZz57ZmllbGR9PC9zdHJvbmc+XHJcbiAgICAgICAgICB7dG99XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtbmV4dHNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICB7I2VhY2ggbmV4dCBhcyB7IGZpZWxkLCByZWFsLCB0byB9fVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwie2xpbmtDbGFzcyh0bywgcmVhbCl9IEJDLW5leHRcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB0byl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3RvfSA8c3Ryb25nPntmaWVsZH08L3N0cm9uZz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgey9lYWNofVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtbmV4dHMgZGl2IHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgLkJDLW5leHRzIHtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gIH1cclxuICAuQkMtcHJldnMge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gIH1cclxuXHJcbiAgLkJDLU5leHRQcmV2LUNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHtcclxuICAgIGhvdmVyUHJldmlldyxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7XHJcbiAgICBkcm9wRGVuZHJvbixcclxuICAgIHBhZEFycmF5LFxyXG4gICAgcnVucyxcclxuICAgIHRyYW5zcG9zZSxcclxuICB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBnZXRBbHQsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgc29ydGVkVHJhaWxzOiBzdHJpbmdbXVtdO1xyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuXHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgZ3JpZERlZmF1bHREZXB0aCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IGFjdGl2ZUxlYWZWaWV3ID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXc7XHJcbiAgY29uc3QgbWF4TGVuZ3RoID0gc29ydGVkVHJhaWxzLmxhc3QoKS5sZW5ndGg7XHJcblxyXG4gIC8vIFVzZSB0aGUgdXNlciBzZXR0aW5nIHRvIGxpbWl0IHRoZSBpbml0aWFsIGRlcHRoXHJcbiAgbGV0IGRlcHRoID0gTWF0aC5taW4obWF4TGVuZ3RoLCBncmlkRGVmYXVsdERlcHRoKTtcclxuXHJcbiAgbGV0IHNsaWNlZFRyYWlscyA9IHNvcnRlZFRyYWlscztcclxuICAkOiB7XHJcbiAgICBzbGljZWRUcmFpbHMgPSBbXTtcclxuICAgIHNvcnRlZFRyYWlscy5mb3JFYWNoKCh0cmFpbCkgPT4ge1xyXG4gICAgICBjb25zdCBzbGljZSA9IHRyYWlsLnNsaWNlKG1heExlbmd0aCAtIGRlcHRoKTtcclxuICAgICAgaWYgKHNsaWNlLmxlbmd0aCkgc2xpY2VkVHJhaWxzLnB1c2goc2xpY2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAkOiBwYWRkZWRUcmFpbHMgPSBzbGljZWRUcmFpbHMubWFwKCh0cmFpbCkgPT4gcGFkQXJyYXkodHJhaWwsIGRlcHRoKSk7XHJcblxyXG4gICQ6IHRyYW5zcG9zZWRUcmFpbHMgPSB0cmFuc3Bvc2UocGFkZGVkVHJhaWxzKTtcclxuICAkOiBhbGxSdW5zID0gdHJhbnNwb3NlZFRyYWlscy5tYXAocnVucyk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIkJDLWdyaWQtd3JhcHBlclwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiQkMtdHJhaWwtZ3JpZFwiXHJcbiAgICBzdHlsZT1cIlxyXG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHsnMWZyICcucmVwZWF0KHRyYW5zcG9zZWRUcmFpbHMubGVuZ3RoKX07XHJcbiAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogeycxZnIgJy5yZXBlYXQoc2xpY2VkVHJhaWxzLmxlbmd0aCl9XCJcclxuICA+XHJcbiAgICB7I2VhY2ggdHJhbnNwb3NlZFRyYWlscyBhcyBjb2wsIGl9XHJcbiAgICAgIHsjZWFjaCBhbGxSdW5zW2ldIGFzIHsgdmFsdWUsIGZpcnN0LCBsYXN0IH19XHJcbiAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIkJDLXRyYWlsLWdyaWQtaXRlbSB7dmFsdWUgPT09ICcnID8gJ0JDLWZpbGxlcicgOiAnJ31cIlxyXG4gICAgICAgICAgc3R5bGU9XCJcclxuICAgICAgICAgICAgICBncmlkLWFyZWE6IHtmaXJzdCArIDF9IC8ge2kgKyAxfSAvXHJcbiAgICAgICAgICAgICAgICAgIHtsYXN0ICsgMn0gLyB7aSArIDJ9O1wiXHJcbiAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaCh2YWx1ZSwgZSl9XHJcbiAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgYWN0aXZlTGVhZlZpZXcsIHZhbHVlKX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPXtsaW5rQ2xhc3ModmFsdWUpfT5cclxuICAgICAgICAgICAge2dldEFsdCh2YWx1ZSwgcGx1Z2luKSA/PyBkcm9wRGVuZHJvbih2YWx1ZSwgc2V0dGluZ3MpfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIHsvZWFjaH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIkJDLWdyaWQtb3B0aW9uc1wiPlxyXG4gICAgPHNwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiQkMtZ3JpZC1vcHRpb25zLWljb25cIj5cdTI2OTlcdUZFMEY8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiBjbGFzcz1cIkJDLWdyaWQtb3B0aW9ucy1vcHRpb25zXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJCQy1kZXB0aC1idXR0b25cIlxyXG4gICAgICAgICAgZGlzYWJsZWQ9e2RlcHRoID09PSAxfVxyXG4gICAgICAgICAgb246Y2xpY2s9eygpID0+IChkZXB0aCAtPSAxKX0+LTwvYnV0dG9uXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1pdGVtLWZsYWlyXCI+e2RlcHRofTwvc3Bhbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cIkJDLWRlcHRoLWJ1dHRvblwiXHJcbiAgICAgICAgICBkaXNhYmxlZD17ZGVwdGggPT09IG1heExlbmd0aH1cclxuICAgICAgICAgIG9uOmNsaWNrPXsoKSA9PiAoZGVwdGggKz0gMSl9Pis8L2J1dHRvblxyXG4gICAgICAgID5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBkaXYuQkMtZ3JpZC13cmFwcGVyIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB9XHJcblxyXG4gIGRpdi5CQy10cmFpbC1ncmlkIHtcclxuICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcclxuICAgIHdpZHRoOiBhdXRvO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgLkJDLWdyaWQtb3B0aW9ucyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDBweDtcclxuICAgIHJpZ2h0OiAwcHg7XHJcbiAgICBoZWlnaHQ6IDM1cHg7XHJcbiAgICB3aWR0aDogMzJweDtcclxuXHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xyXG5cclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHJcbiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzO1xyXG4gICAgb3ZlcmZsb3ctd3JhcDogbm9ybWFsO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcbiAgZGl2LkJDLWdyaWQtb3B0aW9uczpob3ZlciB7XHJcbiAgICBwYWRkaW5nOiA1cHg7XHJcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XHJcbiAgfVxyXG4gIGRpdi5CQy1ncmlkLW9wdGlvbnM6aG92ZXIgLkJDLWdyaWQtb3B0aW9ucy1pY29uIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAuQkMtZ3JpZC1vcHRpb25zLW9wdGlvbnMge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbiAgZGl2LkJDLWdyaWQtb3B0aW9uczpob3ZlciAuQkMtZ3JpZC1vcHRpb25zLW9wdGlvbnMge1xyXG4gICAgZGlzcGxheTogdW5zZXQ7XHJcbiAgfVxyXG5cclxuICAuQkMtZGVwdGgtYnV0dG9uIHtcclxuICAgIHBhZGRpbmc6IDNweCA1cHg7XHJcbiAgfVxyXG5cclxuICBkaXYuQkMtdHJhaWwtZ3JpZC1pdGVtIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgcGFkZGluZzogMnB4O1xyXG4gICAgZm9udC1zaXplOiBzbWFsbGVyO1xyXG4gIH1cclxuXHJcbiAgZGl2LkJDLXRyYWlsLWdyaWQtaXRlbS5CQy1maWxsZXIge1xyXG4gICAgb3BhY2l0eTogMC43O1xyXG4gIH1cclxuXHJcbiAgLyogLmRvdCB7XHJcbiAgICBoZWlnaHQ6IDVweDtcclxuICAgIHdpZHRoOiA1cHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgfSAqL1xyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQge1xyXG4gICAgaG92ZXJQcmV2aWV3LFxyXG4gICAgb3Blbk9yU3dpdGNoLFxyXG4gIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG4gIGltcG9ydCB7IGdldFRyYWlsTGVuZ3RoIH0gZnJvbSBcIi4uL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgZHJvcERlbmRyb24gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbiAgaW1wb3J0IHsgZ2V0QWx0IH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBzb3J0ZWRUcmFpbHM6IHN0cmluZ1tdW107XHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB2aWV3IH0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XHJcbiAgbGV0IHsgc2hvd0FsbCwgbm9QYXRoTWVzc2FnZSwgdHJhaWxTZXBlcmF0b3IgfSA9IHNldHRpbmdzO1xyXG5cclxuICBsZXQgdHJhaWxfbGVuZ3RoID0gc2hvd0FsbDtcclxuXHJcbiAgJDogdHJhaWxzVG9TaG93ID1cclxuICAgIHRyYWlsX2xlbmd0aCA9PSBcIkFsbFwiXHJcbiAgICAgID8gc29ydGVkVHJhaWxzXHJcbiAgICAgIDogdHJhaWxfbGVuZ3RoID09IFwiU2hvcnRlc3RcIlxyXG4gICAgICA/IFtzb3J0ZWRUcmFpbHNbMF1dXHJcbiAgICAgIDogW3NvcnRlZFRyYWlscy5sYXN0KCldO1xyXG48L3NjcmlwdD5cclxuXHJcbjxzcGFuIGNsYXNzPVwiQkMtdHJhaWwtcGF0aC1jb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwidHJhaWxzLWRpdlwiPlxyXG4gICAgeyNlYWNoIHRyYWlsc1RvU2hvdyBhcyB0cmFpbH1cclxuICAgICAgPGRpdj5cclxuICAgICAgICB7I2lmICF0cmFpbC5sZW5ndGh9XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLWVtcHR5LXRyYWlsXCI+e25vUGF0aE1lc3NhZ2V9PC9zcGFuPlxyXG4gICAgICAgIHs6ZWxzZX1cclxuICAgICAgICAgIHsjZWFjaCB0cmFpbCBhcyBjcnVtYiwgaX1cclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmsgQkMtTGlua1wiXHJcbiAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2goY3J1bWIsIGUpfVxyXG4gICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCB2aWV3LCBjcnVtYil9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7Z2V0QWx0KGNydW1iLCBwbHVnaW4pID8/IGRyb3BEZW5kcm9uKGNydW1iLCBzZXR0aW5ncyl9XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgeyNpZiBpIDwgdHJhaWwubGVuZ3RoIC0gMX1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLXRyYWlsLXNlcFwiPntcIiBcIiArIHRyYWlsU2VwZXJhdG9yICsgXCIgXCJ9PC9zcGFuPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgey9lYWNofVxyXG4gICAgICAgIHsvaWZ9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9lYWNofVxyXG4gIDwvZGl2PlxyXG5cclxuICB7I2lmIHNvcnRlZFRyYWlscy5sZW5ndGggPiAxfVxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnV0dG9uLWRpdlwiXHJcbiAgICAgICAgb246Y2xpY2s9eygpID0+ICh0cmFpbF9sZW5ndGggPSBnZXRUcmFpbExlbmd0aCh0cmFpbF9sZW5ndGgpKX1cclxuICAgICAgICBvbjpjb250ZXh0bWVudT17KGUpID0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRyYWlsX2xlbmd0aCA9IGdldFRyYWlsTGVuZ3RoKHRyYWlsX2xlbmd0aCwgLTEpO1xyXG4gICAgICAgIH19XHJcbiAgICAgID5cclxuICAgICAgICB7dHJhaWxfbGVuZ3RofVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIHsvaWZ9XHJcbjwvc3Bhbj5cclxuXHJcbjxzdHlsZT5cclxuICBzcGFuLkJDLXRyYWlsLXBhdGgtY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHR5cGUgeyBFZGdlRGVmaW5pdGlvbiwgTm9kZVNpbmd1bGFyIH0gZnJvbSBcImN5dG9zY2FwZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQge1xyXG4gIERhdGFTdG9yZUV2ZW50cyxcclxuICBnZXRQbHVnaW4sXHJcbiAgSUNvcmVEYXRhU3RvcmUsXHJcbiAgSUp1Z2dsLFxyXG4gIElKdWdnbFNldHRpbmdzLFxyXG4gIElKdWdnbFN0b3JlcyxcclxuICBub2RlRGFuZ2xpbmcsXHJcbiAgbm9kZUZyb21GaWxlLFxyXG4gIFZpeklkLFxyXG59IGZyb20gXCJqdWdnbC1hcGlcIjtcclxuaW1wb3J0IHsgaW5mbywgd2FybiB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50cywgTWV0YWRhdGFDYWNoZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgY3JlYXRlSW5kZXggfSBmcm9tIFwiLi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IEp1Z2dsQnV0dG9uIGZyb20gXCIuLi9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgSnVnZ2xEZXB0aCBmcm9tIFwiLi4vQ29tcG9uZW50cy9KdWdnbERlcHRoLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgeyBKVUdHTF9DQl9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBkZnNBbGxQYXRocyxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5jb25zdCBTVE9SRV9JRCA9IFwiY29yZVwiO1xyXG5cclxuY2xhc3MgQkNTdG9yZUV2ZW50cyBleHRlbmRzIEV2ZW50cyBpbXBsZW1lbnRzIERhdGFTdG9yZUV2ZW50cyB7IH1cclxuXHJcbmV4cG9ydCBjbGFzcyBCQ1N0b3JlIGV4dGVuZHMgQ29tcG9uZW50IGltcGxlbWVudHMgSUNvcmVEYXRhU3RvcmUge1xyXG4gIGdyYXBoOiBNdWx0aUdyYXBoO1xyXG4gIGNhY2hlOiBNZXRhZGF0YUNhY2hlO1xyXG4gIGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBncmFwaDogTXVsdGlHcmFwaCxcclxuICAgIG1ldGFkYXRhOiBNZXRhZGF0YUNhY2hlLFxyXG4gICAgZGVwdGhNYXA/OiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH1cclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7XHJcbiAgICB0aGlzLmNhY2hlID0gbWV0YWRhdGE7XHJcbiAgICB0aGlzLmRlcHRoTWFwID0gZGVwdGhNYXA7XHJcbiAgfVxyXG5cclxuICBhc1N0cmluZyhub2RlOiBOb2RlU2luZ3VsYXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWQgPSBWaXpJZC5mcm9tTm9kZShub2RlKTtcclxuICAgIHJldHVybiBpZC5pZC5zbGljZSgwLCAtMyk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlKG5vZGVJZDogVml6SWQpOiBURmlsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub2RlSWQuaWQsIFwiXCIpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29ubmVjdE5vZGVzKFxyXG4gICAgYWxsTm9kZXM6IGN5dG9zY2FwZS5Ob2RlQ29sbGVjdGlvbixcclxuICAgIG5ld05vZGVzOiBjeXRvc2NhcGUuTm9kZUNvbGxlY3Rpb24sXHJcbiAgICBncmFwaDogSUp1Z2dsXHJcbiAgKTogUHJvbWlzZTxjeXRvc2NhcGUuRWRnZURlZmluaXRpb25bXT4ge1xyXG4gICAgY29uc3QgZWRnZXM6IEVkZ2VEZWZpbml0aW9uW10gPSBbXTtcclxuICAgIGNvbnN0IG5vZGVzTGlzdFMgPSBuZXcgU2V0KFxyXG4gICAgICBhbGxOb2Rlcy5tYXAoKG5vZGUpID0+IHRoaXMuYXNTdHJpbmcobm9kZSkpLmZpbHRlcigocykgPT4gcylcclxuICAgICk7XHJcbiAgICBuZXdOb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmFzU3RyaW5nKG5vZGUpO1xyXG4gICAgICBpZiAoIXRoaXMuZ3JhcGguaGFzTm9kZShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyYXBoLmZvckVhY2hPdXRFZGdlKFxyXG4gICAgICAgIHRoaXMuYXNTdHJpbmcobm9kZSksXHJcbiAgICAgICAgKGtleSwgYXR0ciwgc291cmNlLCB0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmIChub2Rlc0xpc3RTLmhhcyh0YXJnZXQpKSB7XHJcbiAgICAgICAgICAgIGVkZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIGlkOiBgQkM6JHtzb3VyY2V9LT4ke3RhcmdldH1gLFxyXG4gICAgICAgICAgICAgICAgc291cmNlOiBWaXpJZC50b0lkKHNvdXJjZSwgU1RPUkVfSUQpICsgXCIubWRcIixcclxuICAgICAgICAgICAgICAgIHRhcmdldDogVml6SWQudG9JZCh0YXJnZXQsIFNUT1JFX0lEKSArIFwiLm1kXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBhdHRyLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgZGlyOiBhdHRyLmRpcixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGNsYXNzZXM6IGB0eXBlLSR7YXR0ci5maWVsZH0gZGlyLSR7YXR0ci5kaXJ9IGJyZWFkY3J1bWJzJGAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZGdlcyk7XHJcbiAgfVxyXG5cclxuICBnZXRFdmVudHModmlldzogSUp1Z2dsKTogRGF0YVN0b3JlRXZlbnRzIHtcclxuICAgIHJldHVybiBuZXcgQkNTdG9yZUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TmVpZ2hib3VyaG9vZChcclxuICAgIG5vZGVJZHM6IFZpeklkW10sXHJcbiAgICB2aWV3OiBJSnVnZ2xcclxuICApOiBQcm9taXNlPGN5dG9zY2FwZS5Ob2RlRGVmaW5pdGlvbltdPiB7XHJcbiAgICBjb25zdCBuZXdfbm9kZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZUlkIG9mIG5vZGVJZHMpIHtcclxuICAgICAgY29uc3QgbmFtZSA9IG5vZGVJZC5pZC5zbGljZSgwLCAtMyk7XHJcbiAgICAgIGlmICghdGhpcy5ncmFwaC5oYXNOb2RlKG5hbWUpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBuZXdfbm9kZSBvZiB0aGlzLmdyYXBoLm5laWdoYm9ycyhuYW1lKSkge1xyXG4gICAgICAgIG5ld19ub2Rlcy5wdXNoKFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXQobmV3IFZpeklkKG5ld19ub2RlICsgXCIubWRcIiwgU1RPUkVfSUQpLCB2aWV3KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBuZXdfbm9kZXM7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoTm9kZShpZDogVml6SWQsIHZpZXc6IElKdWdnbCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHN0b3JlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBTVE9SRV9JRDtcclxuICB9XHJcblxyXG4gIGdldChub2RlSWQ6IFZpeklkLCB2aWV3OiBJSnVnZ2wpOiBQcm9taXNlPGN5dG9zY2FwZS5Ob2RlRGVmaW5pdGlvbj4ge1xyXG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZ2V0RmlsZShub2RlSWQpO1xyXG4gICAgbGV0IGRlcHRoID0gMDtcclxuICAgIGlmICh0aGlzLmRlcHRoTWFwICYmIG5vZGVJZC5pZCBpbiB0aGlzLmRlcHRoTWFwKSB7XHJcbiAgICAgIGRlcHRoID0gdGhpcy5kZXB0aE1hcFtub2RlSWQuaWRdO1xyXG4gICAgfVxyXG4gICAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZGFuZ2xpbmcgPSBub2RlRGFuZ2xpbmcobm9kZUlkLmlkKTtcclxuICAgICAgZGFuZ2xpbmcuZGF0YS5kZXB0aCA9IGRlcHRoO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhbmdsaW5nKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgICBpZiAoY2FjaGUgPT09IG51bGwpIHtcclxuICAgICAgaW5mbyhcInJldHVybmluZyBlbXB0eSBjYWNoZVwiLCBub2RlSWQpO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGVEYW5nbGluZyhub2RlSWQuaWQpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbm9kZUZyb21GaWxlKGZpbGUsIHZpZXcucGx1Z2luLCB2aWV3LnNldHRpbmdzLCBub2RlSWQudG9JZCgpKS50aGVuKFxyXG4gICAgICAobm9kZSkgPT4ge1xyXG4gICAgICAgIG5vZGUuZGF0YS5kZXB0aCA9IGRlcHRoO1xyXG4gICAgICAgIHJldHVybiBub2RlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUp1Z2dsKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBpbml0aWFsTm9kZXM6IHN0cmluZ1tdLFxyXG4gIGFyZ3M6IElKdWdnbFNldHRpbmdzLFxyXG4gIGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH0gPSBudWxsXHJcbik6IElKdWdnbCB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoIWp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgIC8vIFRPRE86IEVycm9yIGhhbmRsaW5nXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGtleSBpbiBKVUdHTF9DQl9ERUZBVUxUUykge1xyXG4gICAgICBpZiAoa2V5IGluIGFyZ3MgJiYgYXJnc1trZXldID09PSB1bmRlZmluZWQpXHJcbiAgICAgICAgYXJnc1trZXldID0gSlVHR0xfQ0JfREVGQVVMVFNba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiY1N0b3JlID0gbmV3IEJDU3RvcmUoXHJcbiAgICAgIHBsdWdpbi5tYWluRyxcclxuICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUsXHJcbiAgICAgIGRlcHRoTWFwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc3RvcmVzOiBJSnVnZ2xTdG9yZXMgPSB7XHJcbiAgICAgIGNvcmVTdG9yZTogYmNTdG9yZSxcclxuICAgICAgZGF0YVN0b3JlczogW2JjU3RvcmVdLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBqdWdnbCA9IGp1Z2dsUGx1Z2luLmNyZWF0ZUp1Z2dsKHRhcmdldCwgYXJncywgc3RvcmVzLCBpbml0aWFsTm9kZXMpO1xyXG4gICAgcGx1Z2luLmFkZENoaWxkKGp1Z2dsKTtcclxuICAgIGluZm8oeyBqdWdnbCB9KTtcclxuICAgIHJldHVybiBqdWdnbDtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgd2Fybih7IGVycm9yIH0pO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVG9Tb3VyY2UoanVnZ2w6IElKdWdnbCwgc291cmNlOiBzdHJpbmcpIHtcclxuICBpZiAoIWp1Z2dsKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGp1Z2dsLm9uKFwidml6UmVhZHlcIiwgKHZpeikgPT4ge1xyXG4gICAgLy8gQWZ0ZXIgbGF5b3V0IGlzIGRvbmUsIGNlbnRlciBvbiBzb3VyY2Ugbm9kZVxyXG4gICAgdml6Lm9uZShcImxheW91dHN0b3BcIiwgKGUpID0+IHtcclxuICAgICAgY29uc3Qgdml6ID0gZS5jeTtcclxuICAgICAgY29uc3Qgbm9kZSA9IHZpei4kaWQoVml6SWQudG9JZChzb3VyY2UgKyBcIi5tZFwiLCBTVE9SRV9JRCkpO1xyXG4gICAgICB2aXouYW5pbWF0ZSh7XHJcbiAgICAgICAgY2VudGVyOiB7XHJcbiAgICAgICAgICBlbGVzOiBub2RlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZHVyYXRpb246IDI1MCxcclxuICAgICAgICBxdWV1ZTogZmFsc2UsXHJcbiAgICAgICAgem9vbTogMS43LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVG9HcmFwaChqdWdnbDogSUp1Z2dsKSB7XHJcbiAganVnZ2wub24oXCJ2aXpSZWFkeVwiLCAodml6KSA9PiB7XHJcbiAgICB2aXouZml0KHZpei5ub2RlcygpKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlRGVwdGhNYXAoXHJcbiAgcGF0aHM6IHN0cmluZ1tdW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgb2Zmc2V0ID0gMFxyXG4pOiB7IFtuYW1lOiBzdHJpbmddOiBudW1iZXIgfSB7XHJcbiAgLy8gVE9ETzogSXMgdGhlcmUgYSBCQyBmdW5jdGlvbiBmb3IgdGhpcyBhbHJlYWR5P1xyXG4gIGxldCBkZXB0aE1hcDogeyBbdmFsdWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XHJcbiAgZGVwdGhNYXBbc291cmNlICsgXCIubWRcIl0gPSAwO1xyXG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBuYW1lID0gcGF0aFtpXSArIFwiLm1kXCI7XHJcbiAgICAgIGNvbnN0IGRlcHRoID0gcGF0aC5sZW5ndGggLSBpIC0gMSArIG9mZnNldDtcclxuICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXApIHtcclxuICAgICAgICBkZXB0aE1hcFtuYW1lXSA9IE1hdGgubWluKGRlcHRoTWFwW25hbWVdLCBkZXB0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVwdGhNYXBbbmFtZV0gPSBkZXB0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBkZXB0aE1hcDtcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlRGVwdGgoanVnZ2w6IElKdWdnbCwgZGVwdGg6IG51bWJlcikge1xyXG4gIGp1Z2dsLnZpei4kKGBbZGVwdGg+JHtkZXB0aH1dYCkuYWRkQ2xhc3MoXCJmaWx0ZXJlZFwiKTtcclxuICBqdWdnbC52aXouJChgW2RlcHRoPD0ke2RlcHRofV1gKS5yZW1vdmVDbGFzcyhcImZpbHRlcmVkXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnVnZ2xUcmFpbChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXHJcbiAgcGF0aHM6IHN0cmluZ1tdW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgYXJnczogSUp1Z2dsU2V0dGluZ3NcclxuKSB7XHJcbiAgY29uc3QgdG9vbGJhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgdG9vbGJhckRpdi5hZGRDbGFzcyhcImN5LXRvb2xiYXJcIik7XHJcbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHRvb2xiYXJEaXYpO1xyXG5cclxuICBjb25zdCBzZWN0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICBzZWN0RGl2LmFkZENsYXNzKFwiY3ktdG9vbGJhci1zZWN0aW9uXCIpO1xyXG4gIHRvb2xiYXJEaXYuYXBwZW5kQ2hpbGQoc2VjdERpdik7XHJcblxyXG4gIGNvbnN0IGFtdENoaWxkcmVuID0gdGFyZ2V0LmNoaWxkcmVuLmxlbmd0aDtcclxuXHJcbiAgbGV0IGp1Z2dsVXA6IElKdWdnbCA9IG51bGw7XHJcbiAgbGV0IGp1Z2dsRG93bjogSUp1Z2dsID0gbnVsbDtcclxuXHJcbiAgbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAgIHRhcmdldDogc2VjdERpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGljb246IFwiXHUyMTkxXCIsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBpZiAoanVnZ2xVcCkge1xyXG4gICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5jbGFzc0xpc3QucmVtb3ZlKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgIGRlcHRoVXAuJHNldCh7IHZpc2libGU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqdWdnbERvd24pIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbiArIDFdLmNsYXNzTGlzdC5hZGQoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhEb3duLiRzZXQoeyB2aXNpYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgdGl0bGU6IFwiU2hvdyB1cCBncmFwaFwiLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAgIHRhcmdldDogc2VjdERpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGljb246IFwiXHUyMTkzXCIsXHJcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICBpZiAoanVnZ2xEb3duKSB7XHJcbiAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bYW10Q2hpbGRyZW4gKyAxXS5jbGFzc0xpc3QucmVtb3ZlKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgIGRlcHRoVXAuJHNldCh7IHZpc2libGU6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgaWYgKGp1Z2dsVXApIHtcclxuICAgICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5jbGFzc0xpc3QuYWRkKFwianVnZ2wtaGlkZVwiKTtcclxuICAgICAgICAgICAgZGVwdGhEb3duLiRzZXQoeyB2aXNpYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWIgPSBnZXRTdWJJbkRpcnMocGx1Z2luLm1haW5HLCBcImRvd25cIiwgXCJ1cFwiKTtcclxuICAgICAgICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgcGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycyk7XHJcbiAgICAgICAgY29uc3Qgc3ViQ2xvc2VkID0gZ2V0U3ViSW5EaXJzKGNsb3NlZCwgXCJkb3duXCIpO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3QgeyBjcmVhdGVJbmRleEluZGVudCB9ID0gcGx1Z2luLnNldHRpbmdzXHJcbiAgICAgICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhzdWJDbG9zZWQsIHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGluZGV4XHJcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcclxuICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50LmpvaW4oXCItIFwiKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZmlsdGVyKChwYWlyKSA9PiBwYWlyKTtcclxuICAgICAgICBsZXQgZGVwdGhNYXBEb3duID0gY3JlYXRlRGVwdGhNYXAoYWxsUGF0aHMsIHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgbWF4RGVwdGhEb3duID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhkZXB0aE1hcERvd24pKTtcclxuXHJcbiAgICAgICAgZGVwdGhEb3duID0gbmV3IEp1Z2dsRGVwdGgoe1xyXG4gICAgICAgICAgdGFyZ2V0OiB0b29sYmFyRGl2LFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgbWF4RGVwdGg6IG1heERlcHRoRG93bixcclxuICAgICAgICAgICAgb25VcGRhdGVEZXB0aDogKGQpID0+IHtcclxuICAgICAgICAgICAgICB1cGRhdGVEZXB0aChqdWdnbERvd24sIGQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgbm9kZXNTID0gbmV3IFNldChsaW5lcyk7XHJcbiAgICAgICAgbm9kZXNTLmFkZChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShub2Rlc1MpLm1hcCgocykgPT4gcyArIFwiLm1kXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBhcmdzRG93biA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHBsdWdpbi5zZXR0aW5ncy5qdWdnbExheW91dDtcclxuICAgICAgICBpZiAobGF5b3V0ID09PSBcImhpZXJhcmNoeVwiKSB7XHJcbiAgICAgICAgICBhcmdzRG93bi5sYXlvdXQgPSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbmFtZTogXCJkYWdyZVwiLFxyXG4gICAgICAgICAgICBhbmltYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmFua2VyOiAoZ3JhcGgpID0+IHtcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhncmFwaC5fbm9kZXMpLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gVml6SWQuZnJvbUlkKGlkKS5pZDtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIGRlcHRoTWFwRG93bikge1xyXG4gICAgICAgICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBkZXB0aE1hcERvd25bbmFtZV0gKyAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgZ3JhcGguX25vZGVzW2lkXS5yYW5rID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFyZ3NEb3duLmxheW91dCA9IGxheW91dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNGZGdkID0gbGF5b3V0ID09PSBcImNvbGFcIiB8fCBsYXlvdXQgPT09IFwiZDMtZm9yY2VcIjtcclxuICAgICAgICBpZiAoaXNGZGdkKSB7XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICBhcmdzRG93bi5mZGdkTGF5b3V0ID0gbGF5b3V0O1xyXG4gICAgICAgICAgYXJnc0Rvd24ubGF5b3V0ID0gXCJmb3JjZS1kaXJlY3RlZFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhcmdzRG93bi5hdXRvWm9vbSA9IHRydWU7XHJcbiAgICAgICAgICBhcmdzRG93bi5hbmltYXRlTGF5b3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBqdWdnbERvd24gPSBjcmVhdGVKdWdnbChwbHVnaW4sIHRhcmdldCwgbm9kZXMsIGFyZ3NEb3duLCBkZXB0aE1hcERvd24pO1xyXG5cclxuICAgICAgICBpZiAoaXNGZGdkKSB7XHJcbiAgICAgICAgICB6b29tVG9Tb3VyY2UoanVnZ2xEb3duLCBzb3VyY2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB6b29tVG9HcmFwaChqdWdnbERvd24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGp1Z2dsVXApIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbl0uYWRkQ2xhc3MoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhVcC4kc2V0KHsgdmlzaWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIHRpdGxlOiBcIlNob3cgZG93biBncmFwaFwiLFxyXG4gICAgfSxcclxuICB9KTtcclxuICBjb25zdCBkZXB0aE1hcFVwID0gY3JlYXRlRGVwdGhNYXAocGF0aHMsIHNvdXJjZSwgMSk7XHJcbiAgY29uc3QgbWF4RGVwdGhVcCA9IE1hdGgubWF4KC4uLk9iamVjdC52YWx1ZXMoZGVwdGhNYXBVcCkpO1xyXG5cclxuICBsZXQgZGVwdGhEb3duOiBKdWdnbERlcHRoO1xyXG4gIGNvbnN0IGRlcHRoVXAgPSBuZXcgSnVnZ2xEZXB0aCh7XHJcbiAgICB0YXJnZXQ6IHRvb2xiYXJEaXYsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICBtYXhEZXB0aDogbWF4RGVwdGhVcCxcclxuICAgICAgb25VcGRhdGVEZXB0aDogKGQpID0+IHtcclxuICAgICAgICB1cGRhdGVEZXB0aChqdWdnbFVwLCBkKTtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfSk7XHJcblxyXG4gIC8vIG5ldyBKdWdnbEJ1dHRvbih7XHJcbiAgLy8gICAgIHRhcmdldDogc2VjdERpdixcclxuICAvLyAgICAgcHJvcHM6IHtcclxuICAvLyAgICAgICAgIGljb246IFwiXHUyNkY2XCIsXHJcbiAgLy8gICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCJoZXJlXCIpXHJcbiAgLy8gICAgICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuWzFdLmFkZENsYXNzKFwianVnZ2wtZnVsbC1zY3JlZW5cIilcclxuICAvLyAgICAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bMV0uc2V0QXR0cihcInN0eWxlXCIsIFwiXCIpO1xyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAvLyAgICAgICAgIHRpdGxlOiBcIkZ1bGwgaGVpZ2h0XCJcclxuICAvLyAgICAgfVxyXG4gIC8vIH0pO1xyXG4gIGxldCBub2RlcyA9IEFycmF5LmZyb20oXHJcbiAgICBuZXcgU2V0KHBhdGhzLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldi5jb25jYXQoY3VyciksIFtdKSlcclxuICApO1xyXG5cclxuICBub2Rlcy5wdXNoKHNvdXJjZSk7XHJcbiAgbm9kZXMgPSBub2Rlcy5tYXAoKHMpID0+IHMgKyBcIi5tZFwiKTtcclxuXHJcbiAgY29uc3QgYXJnc1VwOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGFyZ3MpO1xyXG5cclxuICBjb25zdCBsYXlvdXQgPSBwbHVnaW4uc2V0dGluZ3MuanVnZ2xMYXlvdXQ7XHJcbiAgaWYgKGxheW91dCA9PT0gXCJoaWVyYXJjaHlcIikge1xyXG4gICAgYXJnc1VwLmxheW91dCA9IHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBuYW1lOiBcImRhZ3JlXCIsXHJcbiAgICAgIGFuaW1hdGU6IGZhbHNlLFxyXG4gICAgICByYW5rZXI6IChncmFwaCkgPT4ge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGdyYXBoLl9ub2RlcykuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBWaXpJZC5mcm9tSWQoaWQpLmlkO1xyXG4gICAgICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXBVcCkge1xyXG4gICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBtYXhEZXB0aFVwIC0gZGVwdGhNYXBVcFtuYW1lXSArIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSBtYXhEZXB0aFVwICsgMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGFyZ3NVcC5sYXlvdXQgPSBsYXlvdXQ7XHJcbiAgfVxyXG4gIGNvbnN0IGlzRmRnZCA9IGxheW91dCA9PT0gXCJjb2xhXCIgfHwgbGF5b3V0ID09PSBcImQzLWZvcmNlXCI7XHJcbiAgaWYgKGlzRmRnZCkge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgYXJnc1VwLmZkZ2RMYXlvdXQgPSBsYXlvdXQ7XHJcbiAgICBhcmdzVXAubGF5b3V0ID0gXCJmb3JjZS1kaXJlY3RlZFwiO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBhcmdzVXAuYXV0b1pvb20gPSB0cnVlO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgYXJnc1VwLmFuaW1hdGVMYXlvdXQgPSBmYWxzZTtcclxuICB9XHJcbiAganVnZ2xVcCA9IGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJnc1VwLCBkZXB0aE1hcFVwKTtcclxuICBpZiAoaXNGZGdkKSB7XHJcbiAgICB6b29tVG9Tb3VyY2UoanVnZ2xVcCwgc291cmNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgem9vbVRvR3JhcGgoanVnZ2xVcCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgY29weSB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZGZzQWxsUGF0aHMsIGdldFNpbmtzLCBnZXRTdWJJbkRpcnMgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRDdXJyRmlsZSwgbWFrZVdpa2kgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBjb3B5IG9mIGBpbmRleGAsIGRvZXNuJ3QgbXV0YXRlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluZGV4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxpYXNlc1RvSW5kZXgocGx1Z2luOiBCQ1BsdWdpbiwgaW5kZXg6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgYWxpYXNlc0luSW5kZXggfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgY29uc3QgbGluZXMgPSBpbmRleC5zbGljZSgpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBpZiAoYWxpYXNlc0luSW5kZXgpIHtcclxuICAgIGZvciAobGV0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSBjb250ZW50LmpvaW4oXCItIFwiKTtcclxuICAgICAgaWYgKCFub3RlKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm90ZSwgXCJcIik7XHJcblxyXG4gICAgICBpZiAoY3VyckZpbGUgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShjdXJyRmlsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsaWFzOiBzdHJpbmdbXSA9IGNhY2hlPy5mcm9udG1hdHRlcj8uYWxpYXMgPz8gW107XHJcbiAgICAgICAgY29uc3QgYWxpYXNlczogc3RyaW5nW10gPSBjYWNoZT8uZnJvbnRtYXR0ZXI/LmFsaWFzZXMgPz8gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbEFsaWFzZXM6IHN0cmluZ1tdID0gWy4uLlthbGlhc10uZmxhdCgzKSwgLi4uW2FsaWFzZXNdLmZsYXQoMyldO1xyXG4gICAgICAgIGlmIChhbGxBbGlhc2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGluZSArPSBgICgke2FsbEFsaWFzZXMuam9pbihcIiwgXCIpfSlgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBpbmRleCBvZiBhbGwgdGhlIHBhdGhzIGluIHRoZSBncmFwaC5cclxuICogQHBhcmFtIGFsbFBhdGhzIC0gQSBsaXN0IG9mIGFsbCBwYXRocyBmcm9tIHRoZSByb290IHRvIHRoZSBsZWF2ZXMuXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXNXaWtpbGlua3MgLSBXaGV0aGVyIHRvIHVzZSB3aWtpbGlua3MgaW5zdGVhZCBvZiBwbGFpbiB0ZXh0LlxyXG4gKiBAcmV0dXJucyBBIHN0cmluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleChcclxuICBhbGxQYXRoczogc3RyaW5nW11bXSxcclxuICBhc1dpa2lsaW5rczogYm9vbGVhbixcclxuICBpbmRlbnQgPSBcIiAgXCJcclxuKTogc3RyaW5nIHtcclxuICBsZXQgaW5kZXggPSBcIlwiO1xyXG4gIGNvbnN0IGNvcHkgPSBjbG9uZURlZXAoYWxsUGF0aHMpO1xyXG4gIGNvbnN0IHJldmVyc2VkID0gY29weS5tYXAoKHBhdGgpID0+IHBhdGgucmV2ZXJzZSgpKTtcclxuICByZXZlcnNlZC5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnNoaWZ0KCkpO1xyXG5cclxuICBjb25zdCByZWFsSW5kZW50ID0gaW5kZW50ID09PSAnXFxcXHQnID8gJ1xcdCcgOiBpbmRlbnQ7XHJcblxyXG4gIGNvbnN0IHZpc2l0ZWQ6IHtcclxuICAgIFtub2RlOiBzdHJpbmddOiAvKiogVGhlIGRlcHRocyBhdCB3aGljaCBgbm9kZWAgd2FzIHZpc2l0ZWQgKi8gbnVtYmVyW107XHJcbiAgfSA9IHt9O1xyXG5cclxuICByZXZlcnNlZC5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgcGF0aC5sZW5ndGg7IGRlcHRoKyspIHtcclxuICAgICAgY29uc3QgY3Vyck5vZGUgPSBwYXRoW2RlcHRoXTtcclxuXHJcbiAgICAgIC8vIElmIHRoYXQgbm9kZSBoYXMgYmVlbiB2aXNpdGVkIGJlZm9yZSBhdCB0aGUgY3VycmVudCBkZXB0aFxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdmlzaXRlZC5oYXNPd25Qcm9wZXJ0eShjdXJyTm9kZSkgJiZcclxuICAgICAgICB2aXNpdGVkW2N1cnJOb2RlXS5pbmNsdWRlcyhkZXB0aClcclxuICAgICAgKSBjb250aW51ZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpbmRleCArPSBgJHtyZWFsSW5kZW50LnJlcGVhdChkZXB0aCl9LSAke2FzV2lraWxpbmtzID8gbWFrZVdpa2koY3Vyck5vZGUpIDogY3Vyck5vZGVcclxuICAgICAgICAgIH1cXG5gO1xyXG5cclxuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzT3duUHJvcGVydHkoY3Vyck5vZGUpKSB2aXNpdGVkW2N1cnJOb2RlXSA9IFtdO1xyXG4gICAgICAgIHZpc2l0ZWRbY3Vyck5vZGVdLnB1c2goZGVwdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGluZGV4O1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUxvY2FsSW5kZXgocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuICBjb25zdCB7IGJhc2VuYW1lIH0gPSBnZXRDdXJyRmlsZSgpXHJcblxyXG4gIGNvbnN0IG9ubHlEb3ducyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBcImRvd25cIik7XHJcbiAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhvbmx5RG93bnMsIGJhc2VuYW1lKTtcclxuICBjb25zdCBpbmRleCA9IGFkZEFsaWFzZXNUb0luZGV4KHBsdWdpbiwgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50KSk7XHJcblxyXG4gIGluZm8oeyBpbmRleCB9KTtcclxuICBhd2FpdCBjb3B5KGluZGV4KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlHbG9iYWxJbmRleChwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgd2lraWxpbmtJbmRleCwgY3JlYXRlSW5kZXhJbmRlbnQgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBvbmx5RG93bnMgPSBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJkb3duXCIpO1xyXG4gIGNvbnN0IG9ubHlVcHMgPSBnZXRTdWJJbkRpcnMoY2xvc2VkRywgXCJ1cFwiKTtcclxuXHJcbiAgY29uc3Qgc2lua3MgPSBnZXRTaW5rcyhvbmx5VXBzKTtcclxuXHJcbiAgbGV0IGdsb2JhbEluZGV4ID0gXCJcIjtcclxuICBzaW5rcy5mb3JFYWNoKCh0ZXJtaW5hbCkgPT4ge1xyXG4gICAgZ2xvYmFsSW5kZXggKz0gdGVybWluYWwgKyBcIlxcblwiO1xyXG4gICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhvbmx5RG93bnMsIHRlcm1pbmFsKTtcclxuICAgIGdsb2JhbEluZGV4ICs9XHJcbiAgICAgIGFkZEFsaWFzZXNUb0luZGV4KHBsdWdpbiwgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rSW5kZXgsIGNyZWF0ZUluZGV4SW5kZW50KSkgKyBcIlxcblwiO1xyXG4gIH0pO1xyXG5cclxuICBpbmZvKHsgZ2xvYmFsSW5kZXggfSk7XHJcbiAgYXdhaXQgY29weShnbG9iYWxJbmRleCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRvTGluZVBhaXJzID0gKFxyXG4gIGluZGV4OiBzdHJpbmcsXHJcbiAgZmxhdCA9IGZhbHNlXHJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PlxyXG4gIGluZGV4XHJcbiAgICAuc3BsaXQoXCJcXG5cIilcclxuICAgIC5tYXAoKGxpbmUpID0+IHtcclxuICAgICAgY29uc3QgW2luZGVudCwgLi4uY29udGVudF0gPSBsaW5lLnNwbGl0KFwiLSBcIik7XHJcbiAgICAgIHJldHVybiBbZmxhdCA/IFwiXCIgOiBpbmRlbnQsIGNvbnRlbnQuam9pbihcIi0gXCIpXSBhcyBbXHJcbiAgICAgICAgc3RyaW5nLFxyXG4gICAgICAgIHN0cmluZ1xyXG4gICAgICBdO1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKHBhaXIpID0+IHBhaXJbMV0gIT09IFwiXCIpO1xyXG4iLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBleHBvcnQgbGV0IGljb247XHJcbiAgZXhwb3J0IGxldCBvbkNsaWNrOiAoKSA9PiB2b2lkO1xyXG4gIGV4cG9ydCBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBleHBvcnQgbGV0IHRpdGxlID0gXCJcIjtcclxuXHJcbiAgJDogcmVuZGVyZWRJY29uID0gaWNvbjtcclxuPC9zY3JpcHQ+XHJcblxyXG48YnV0dG9uXHJcbiAgdHlwZT1cImJ1dHRvblwiXHJcbiAgY2xhc3M9XCJqdWdnbC1idXR0b25cIlxyXG4gIG9uOmNsaWNrPXtvbkNsaWNrfVxyXG4gIGFyaWEtbGFiZWw9e3RpdGxlfVxyXG4gIHtkaXNhYmxlZH1cclxuPlxyXG4gIHtyZW5kZXJlZEljb259XHJcbjwvYnV0dG9uPlxyXG4iLCBudWxsLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgSnVnZ2xCdXR0b24gZnJvbSBcIi4vSnVnZ2xCdXR0b24uc3ZlbHRlXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgdmlzaWJsZSA9IHRydWU7XHJcbiAgZXhwb3J0IGxldCBtYXhEZXB0aDogbnVtYmVyO1xyXG4gIGV4cG9ydCBsZXQgb25VcGRhdGVEZXB0aDogKGRlcHRoOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG4gIGxldCBkZXB0aCA9IG1heERlcHRoO1xyXG48L3NjcmlwdD5cclxuXHJcbnsjaWYgdmlzaWJsZX1cclxuICA8ZGl2IGNsYXNzPVwiY3ktdG9vbGJhci1zZWN0aW9uXCI+XHJcbiAgICA8SnVnZ2xCdXR0b25cclxuICAgICAgaWNvbj1cIi1cIlxyXG4gICAgICBkaXNhYmxlZD17ZGVwdGggPD0gMH1cclxuICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgIGRlcHRoIC09IDE7XHJcbiAgICAgICAgb25VcGRhdGVEZXB0aChkZXB0aCk7XHJcbiAgICAgIH19XHJcbiAgICAvPlxyXG5cclxuICAgIDxKdWdnbEJ1dHRvbiBpY29uPXtkZXB0aH0gZGlzYWJsZWQ9e3RydWV9IG9uQ2xpY2s9e251bGx9IC8+XHJcblxyXG4gICAgPEp1Z2dsQnV0dG9uXHJcbiAgICAgIGljb249XCIrXCJcclxuICAgICAgZGlzYWJsZWQ9e2RlcHRoID49IG1heERlcHRofVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgZGVwdGggKz0gMTtcclxuICAgICAgICBvblVwZGF0ZURlcHRoKGRlcHRoKTtcclxuICAgICAgfX1cclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbnsvaWZ9XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuICBpbXBvcnQgdHlwZSBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbWF0cml4VmlldzogTWF0cml4VmlldztcclxuXHJcbiAgY29uc3QgeyBwbHVnaW4gfSA9IG1hdHJpeFZpZXc7XHJcbiAgY29uc3QgeyBhbHBoYVNvcnRBc2MsIGVuYWJsZUFscGhhU29ydCB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG48L3NjcmlwdD5cclxuXHJcbjxidXR0b25cclxuICBjbGFzcz1cIkJDLXJlZnJlc2gtYnV0dG9uXCJcclxuICBhcmlhLWxhYmVsPVwiUmVmcmVzaCBJbmRleFwiXHJcbiAgb246Y2xpY2s9e2FzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pfVxyXG4+XHJcbiAgXHUyMUJCXHJcbjwvYnV0dG9uPlxyXG5cclxueyNpZiBlbmFibGVBbHBoYVNvcnR9XHJcbiAgPGJ1dHRvblxyXG4gICAgY2xhc3M9XCJCQy1zb3J0LWJ1dHRvblwiXHJcbiAgICBhcmlhLWxhYmVsPVwiQWxwaGFiZXRpY2FsIFNvcnRpbmcgT3JkZXJcIlxyXG4gICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgcGx1Z2luLnNldHRpbmdzLmFscGhhU29ydEFzYyA9ICFhbHBoYVNvcnRBc2M7XHJcbiAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgYXdhaXQgbWF0cml4Vmlldy5kcmF3KCk7XHJcbiAgICB9fVxyXG4gID5cclxuICAgIHthbHBoYVNvcnRBc2MgPyBcIlx1MjE5N1wiIDogXCJcdTIxOThcIn1cclxuICA8L2J1dHRvbj5cclxuey9pZn1cclxuXHJcbjxzdHlsZT5cclxuICBidXR0b24ge1xyXG4gICAgcGFkZGluZzogMXB4IDZweCAycHggNnB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA2cHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3LCBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG4gIGltcG9ydCBNYXRyaXhCdXR0b25zIGZyb20gXCIuL01hdHJpeEJ1dHRvbnMuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBTcXVhcmVQcm9wcyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHsgZHJvcFBhdGhORGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgaGllclNxdWFyZXM6IFNxdWFyZVByb3BzW11bXTtcclxuICBleHBvcnQgbGV0IGN1cnJGaWxlOiBURmlsZTtcclxuICBleHBvcnQgbGV0IG1hdHJpeFZpZXc6IE1hdHJpeFZpZXc7XHJcblxyXG4gIGNvbnN0IHsgcGx1Z2luIH0gPSBtYXRyaXhWaWV3O1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuXHJcbiAgY29uc3Qge1xyXG4gICAgc2hvd0ltcGxpZWRSZWxhdGlvbnMsXHJcbiAgICBybExlYWYsXHJcbiAgICB0cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyxcclxuICAgIHNob3dSZWxhdGlvblR5cGUsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1tYXRyaXgtYnV0dG9uc1wiPlxyXG4gIDxNYXRyaXhCdXR0b25zIHttYXRyaXhWaWV3fSAvPlxyXG48L2Rpdj5cclxuXHJcbjxkaXZcclxuICBjbGFzcz1cIkJDLU1hdHJpeCAgbWFya2Rvd24tcHJldmlldy12aWV3IHtoaWVyU3F1YXJlcy5sZW5ndGhcclxuICAgID8gJydcclxuICAgIDogJ0JDLWVtcHR5LXZpZXcnfVwiXHJcbj5cclxuICB7I2VhY2ggaGllclNxdWFyZXMgYXMgc3F1YXJlc31cclxuICAgIDxkaXYgY2xhc3M9XCJCQy1tYXRyaXgtaGllclwiPlxyXG4gICAgICB7I2VhY2ggc3F1YXJlcyBhcyB7IGZpZWxkLCBpbXBsaWVkSXRlbXMsIHJlYWxJdGVtcyB9fVxyXG4gICAgICAgIHsjaWYgcmVhbEl0ZW1zLmxlbmd0aCB8fCAoc2hvd0ltcGxpZWRSZWxhdGlvbnMgJiYgaW1wbGllZEl0ZW1zLmxlbmd0aCl9XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiQkMtTWF0cml4LXNxdWFyZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlcnNcIj5cclxuICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+e2ZpZWxkfTwvaDQ+XHJcblxyXG4gICAgICAgICAgICAgIHsjaWYgc2hvd1JlbGF0aW9uVHlwZX1cclxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIkJDLU1hdHJpeC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAge3JlYWxJdGVtcy5sZW5ndGggPyBcIlJlYWxcIiA6IFwiSW1wbGllZFwifVxyXG4gICAgICAgICAgICAgICAgPC9oNj5cclxuICAgICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgeyNpZiByZWFsSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgIDxvbD5cclxuICAgICAgICAgICAgICAgIHsjZWFjaCByZWFsSXRlbXMgYXMgeyBhbHQsIGNscywgaW1wbGllZCwgdG8gfX1cclxuICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LXVua25vd24tYXJpYS1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIntjbHN9IHtpbXBsaWVkID8/ICcnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaCh0bywgZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhldmVudCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJQcmV2aWV3KGV2ZW50LCBtYXRyaXhWaWV3LCB0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXthbHQgPyB0byA6IFwiXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsLXBvc2l0aW9uPXtybExlYWYgPyBcImxlZnRcIiA6IFwicmlnaHRcIn1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7YWx0ID8/IGRyb3BQYXRoTkRlbmRyb24odG8sIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIHsvZWFjaH1cclxuICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG5cclxuICAgICAgICAgICAgeyNpZiBzaG93SW1wbGllZFJlbGF0aW9ucyAmJiBpbXBsaWVkSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlclwiPntcIiBcIn08L2g0PlxyXG4gICAgICAgICAgICAgICAgeyNpZiBpbXBsaWVkSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgICAgICB7I2lmIHNob3dSZWxhdGlvblR5cGUgJiYgcmVhbEl0ZW1zLmxlbmd0aH1cclxuICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+SW1wbGllZDwvaDY+XHJcbiAgICAgICAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxvbCBzdGFydD17cmVhbEl0ZW1zLmxlbmd0aCArIDF9PlxyXG4gICAgICAgICAgICAgICAgeyNlYWNoIGltcGxpZWRJdGVtcyBhcyB7IGFsdCwgY2xzLCBpbXBsaWVkLCB0bywgcGFyZW50IH19XHJcbiAgICAgICAgICAgICAgICAgIDxsaVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiQkMtSW1wbGllZCB7dHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcgJiZcclxuICAgICAgICAgICAgICAgICAgICB0byA9PT0gY3VyckZpbGUuYmFzZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgID8gJ0JDLWFjdGl2ZS1ub3RlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJ31cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktdW5rbm93bi1hcmlhLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie2Nsc30ge2ltcGxpZWQgPz8gJyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHRvLCBlKX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBtYXRyaXhWaWV3LCB0byl9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXsoYWx0ID8gYCR7dG99XFxuYCA6IFwiXCIpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudCA/IFwiXHUyMTkxIFwiICsgcGFyZW50IDogXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsLXBvc2l0aW9uPXtybExlYWYgPyBcImxlZnRcIiA6IFwicmlnaHRcIn1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7YWx0ID8/IGRyb3BQYXRoTkRlbmRyb24odG8sIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIHsvZWFjaH1cclxuICAgICAgICAgICAgICA8L29sPlxyXG4gICAgICAgICAgICB7L2lmfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgey9pZn1cclxuICAgICAgey9lYWNofVxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtTWF0cml4IHtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XHJcbiAgICBsaW5lLWhlaWdodDogMS41O1xyXG4gIH1cclxuICAuQkMtTWF0cml4ID4gZGl2IHtcclxuICAgIGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIC8qIHRleHQtYWxpZ246IGNlbnRlcjsgKi9cclxuICAgIG1hcmdpbjogM3B4O1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICB9XHJcblxyXG4gIC8qIC5CQy1tYXRyaXggZGl2IHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgfSAqL1xyXG5cclxuICAuQkMtTWF0cml4LXNxdWFyZSB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgfVxyXG5cclxuICAuQkMtTWF0cml4LWhlYWRlcnMge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgfVxyXG4gIC5CQy1NYXRyaXgtaGVhZGVyIHtcclxuICAgIG1hcmdpbjogMnB4O1xyXG4gICAgcGFkZGluZzogMHB4IDEwcHg7XHJcbiAgfVxyXG4gIGg0LkJDLU1hdHJpeC1oZWFkZXI6Zmlyc3QtbGV0dGVyIHtcclxuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xyXG4gIH1cclxuXHJcbiAgb2wge1xyXG4gICAgbWFyZ2luOiAzcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7XHJcbiAgfVxyXG5cclxuICAuQkMtTWF0cml4IGxpIHtcclxuICAgIG1hcmdpbjogMC4xZW07XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQVJST1dfRElSRUNUSU9OUywgRElSRUNUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDQVBJSSwgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0TWF0cml4TmVpZ2hib3VycyB9IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHtcclxuICBidWlsZE9ic0dyYXBoLFxyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFN1YkZvckZpZWxkcyxcclxuICBnZXRTdWJJbkRpcnMsXHJcbn0gZnJvbSBcIi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldEZpZWxkSW5mbyxcclxuICBnZXRGaWVsZHMsXHJcbiAgZ2V0T3BwRGlyLFxyXG4gIGdldE9wcEZpZWxkcyxcclxuICBpdGVyYXRlSGllcnMsXHJcbn0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUluZGV4IH0gZnJvbSBcIi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJDQVBJIGltcGxlbWVudHMgQkNBUElJIHtcclxuXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG5cclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5tYWluRyA9IHRoaXMucGx1Z2luLm1haW5HO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gdGhpcy5wbHVnaW4uY2xvc2VkRztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBESVJFQ1RJT05TID0gRElSRUNUSU9OUztcclxuICBwdWJsaWMgQVJST1dfRElSRUNUSU9OUyA9IEFSUk9XX0RJUkVDVElPTlM7XHJcblxyXG4gIHB1YmxpYyBidWlsZE9ic0dyYXBoID0gYnVpbGRPYnNHcmFwaDtcclxuXHJcbiAgcHVibGljIHJlZnJlc2hJbmRleCA9IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzLnBsdWdpbilcclxuXHJcbiAgcHVibGljIGdldFN1YkluRGlycyA9IChkaXJzOiBEaXJlY3Rpb25zW10sIGcgPSB0aGlzLm1haW5HKSA9PlxyXG4gICAgZ2V0U3ViSW5EaXJzKGcsIC4uLmRpcnMpO1xyXG5cclxuICBwdWJsaWMgZ2V0U3ViRm9yRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10sIGcgPSB0aGlzLm1haW5HKSA9PlxyXG4gICAgZ2V0U3ViRm9yRmllbGRzKGcsIGZpZWxkcyk7XHJcblxyXG4gIHB1YmxpYyBkZnNBbGxQYXRocyA9IChcclxuICAgIGZyb21Ob2RlID0gZ2V0Q3VyckZpbGUoKT8uYmFzZW5hbWUsXHJcbiAgICBnID0gdGhpcy5tYWluR1xyXG4gICkgPT4gZGZzQWxsUGF0aHMoZywgZnJvbU5vZGUpO1xyXG5cclxuICBwdWJsaWMgY3JlYXRlSW5kZXggPSAoYWxsUGF0aHM6IHN0cmluZ1tdW10sIHdpa2lsaW5rcyA9IGZhbHNlLCBpbmRlbnQgPSAnICAnKSA9PlxyXG4gICAgY3JlYXRlSW5kZXgoYWxsUGF0aHMsIHdpa2lsaW5rcywgaW5kZW50KTtcclxuXHJcbiAgcHVibGljIGdldE1hdHJpeE5laWdoYm91cnMgPSAoXHJcbiAgICBmcm9tTm9kZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lXHJcbiAgKSA9PiBnZXRNYXRyaXhOZWlnaGJvdXJzKHRoaXMucGx1Z2luLCBmcm9tTm9kZSk7XHJcblxyXG4gIHB1YmxpYyBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PiBnZXRPcHBEaXIoZGlyKTtcclxuXHJcbiAgcHVibGljIGdldE9wcEZpZWxkcyA9IChmaWVsZDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkRGlyIH0gPSBnZXRGaWVsZEluZm8odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCk7XHJcbiAgICByZXR1cm4gZ2V0T3BwRmllbGRzKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycywgZmllbGQsIGZpZWxkRGlyKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgZ2V0RmllbGRJbmZvID0gKGZpZWxkOiBzdHJpbmcpID0+XHJcbiAgICBnZXRGaWVsZEluZm8odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCk7XHJcbiAgcHVibGljIGdldEZpZWxkcyA9IChkaXI/OiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgZ2V0RmllbGRzKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycywgZGlyID8/IFwiYWxsXCIpO1xyXG5cclxuICBwdWJsaWMgaXRlcmF0ZUhpZXJzKFxyXG4gICAgY2I6IChoaWVyOiBVc2VySGllciwgZGlyOiBEaXJlY3Rpb25zLCBmaWVsZDogc3RyaW5nKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBpdGVyYXRlSGllcnModGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBjYik7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBGdXp6eU1hdGNoLCBGdXp6eVN1Z2dlc3RNb2RhbCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvciB9IGZyb20gXCIuL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvclwiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoeU5vdGVTZWxlY3Rvck1vZGFsIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8c3RyaW5nPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcihcIkhOIENob29zZXJcIik7XHJcbiAgICBjb25zdCB7IGhpZXJhcmNoeU5vdGVzIH0gPSB0aGlzLnNldHRpbmdzO1xyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgIG5ldyBOb3RpY2UoXCJObyBoaWVyYXJjaHkgbm90ZXMgZm91bmRcIik7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBoaWVyYXJjaHlOb3Rlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgIWhpZXJhcmNoeU5vdGVzWzBdLmVuZHNXaXRoKFwiL1wiKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgbmV3IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvcihcclxuICAgICAgICB0aGlzLnBsdWdpbixcclxuICAgICAgICBoaWVyYXJjaHlOb3Rlc1swXVxyXG4gICAgICApLm9wZW4oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN1cGVyLm9uT3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgeyBoaWVyYXJjaHlOb3RlcyB9ID0gdGhpcy5zZXR0aW5ncztcclxuICAgIGlmIChoaWVyYXJjaHlOb3Rlcy5sZW5ndGggPT0gMSAmJiBoaWVyYXJjaHlOb3Rlc1swXS5lbmRzV2l0aChcIi9cIikpIHtcclxuICAgICAgLy8gdGhpcyBpcyBhIGZvbGRlclxyXG4gICAgICBsZXQgZm9sZGVyID0gaGllcmFyY2h5Tm90ZXNbMF0uc2xpY2UoMCwgLTEpO1xyXG4gICAgICBpZiAoYXBwLnBsdWdpbnMucGx1Z2lucy5kYXRhdmlldyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgcGFnZXMgPSBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3LmFwaS5wYWdlcyhcclxuICAgICAgICAgIGBcIiR7Zm9sZGVyfVwiYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VzLnZhbHVlcy5tYXAoKHBhZ2UpID0+IHBhZ2UuZmlsZS5wYXRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXcgTm90aWNlKFwibWFrZSBzdXJlIHlvdSBoYXZlIGRhdGF2aWV3IGVuYWJsZWRcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSByZXR1cm4gaGllcmFyY2h5Tm90ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtVGV4dChpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke2l0ZW19YDtcclxuICB9XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxzdHJpbmc+LCBlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyLnJlbmRlclN1Z2dlc3Rpb24oaXRlbSwgZWwpO1xyXG4gIH1cclxuXHJcbiAgb25DaG9vc2VJdGVtKGl0ZW06IHN0cmluZywgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgbmV3IEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvcih0aGlzLnBsdWdpbiwgaXRlbSkub3BlbigpO1xyXG4gICAgdGhpcy5jbG9zZSgpO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHtcclxuICBGdXp6eU1hdGNoLFxyXG4gIEZ1enp5U3VnZ2VzdE1vZGFsLFxyXG4gIExpc3RJdGVtQ2FjaGUsXHJcbiAgTWFya2Rvd25WaWV3LFxyXG4gIE5vdGljZSxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uLy4uL21haW5cIjtcclxuaW1wb3J0IHsgZHJvcFdpa2lsaW5rcyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IE1vZGlmeUhpZXJJdGVtTW9kYWwgfSBmcm9tIFwiLi9Nb2RpZnlIaWVySXRlbU1vZGFsXCI7XHJcblxyXG5pbnRlcmZhY2UgSE5JdGVtIHtcclxuICBkZXB0aDogbnVtYmVyO1xyXG4gIGxpbmU6IHN0cmluZztcclxuICBsaW5lTm86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoeU5vdGVNYW5pcHVsYXRvciBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPEhOSXRlbT4ge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3M7XHJcbiAgaGllck5vdGVOYW1lOiBzdHJpbmc7XHJcbiAgbGluZXM6IHN0cmluZ1tdO1xyXG4gIGxpc3RJdGVtczogTGlzdEl0ZW1DYWNoZVtdO1xyXG4gIGZpbGU6IFRGaWxlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luLCBoaWVyTm90ZU5hbWU6IHN0cmluZykge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgdGhpcy5oaWVyTm90ZU5hbWUgPSBoaWVyTm90ZU5hbWU7XHJcblxyXG4gICAgY29uc3QgY2hvb3NlT3ZlcnJpZGUgPSAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgdGhpcy5jaG9vc2VyLnVzZVNlbGVjdGVkSXRlbShldnQpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXSwgXCJEZWxldGVcIiwgY2hvb3NlT3ZlcnJpZGUpO1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJTaGlmdFwiXSwgXCJBcnJvd1VwXCIsIGNob29zZU92ZXJyaWRlKTtcclxuICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiU2hpZnRcIl0sIFwiQXJyb3dSaWdodFwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIlNoaWZ0XCJdLCBcIkFycm93RG93blwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiSE4gTWFuaXB1bGF0b3JcIik7XHJcbiAgICB0aGlzLnNldEluc3RydWN0aW9ucyhbXHJcbiAgICAgIHsgY29tbWFuZDogXCJTaGlmdCArIEVudGVyXCIsIHB1cnBvc2U6IFwiSnVtcCB0byBpdGVtXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkxXCIsIHB1cnBvc2U6IFwiQWRkIHBhcmVudFwiIH0sXHJcbiAgICAgIHsgY29tbWFuZDogXCJTaGlmdCArIFx1MjE5MlwiLCBwdXJwb3NlOiBcIkFkZCBzaWJsaW5nXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkzIC8gRW50ZXIgLyBDbGlja1wiLCBwdXJwb3NlOiBcIkFkZCBjaGlsZFwiIH0sXHJcbiAgICAgIHsgY29tbWFuZDogXCJEZWxldGVcIiwgcHVycG9zZTogXCJEZWxldGUgaXRlbVwiIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgICB0aGlzLmZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0aGlzLmhpZXJOb3RlTmFtZSwgXCJcIik7XHJcbiAgICBpZiAoIXRoaXMuZmlsZSkgdGhpcy5saW5lcyA9IFtdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMpO1xyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKHRoaXMuZmlsZSk7XHJcbiAgICB0aGlzLmxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICB0aGlzLmxpc3RJdGVtcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZSh0aGlzLmZpbGUpLmxpc3RJdGVtcztcclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzKTtcclxuICAgIHN1cGVyLm9uT3BlbigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogSE5JdGVtW10ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmxpc3RJdGVtc1xyXG4gICAgICAubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaSA9IGl0ZW0ucG9zaXRpb24uc3RhcnQubGluZTtcclxuICAgICAgICByZXR1cm4geyBpLCBsaW5lOiB0aGlzLmxpbmVzW2ldIH07XHJcbiAgICAgIH0pXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBpdGVtLmxpbmUuc3BsaXQoXCItIFwiKTtcclxuICAgICAgICBjb25zdCBkZXB0aCA9IHNwbGl0c1swXS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgbGluZSA9IHNwbGl0cy5zbGljZSgxKS5qb2luKFwiLSBcIik7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGRlcHRoLCBsaW5lLCBsaW5lTm86IGl0ZW0uaSB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBpbmZvKGl0ZW1zKTtcclxuICAgIHJldHVybiBpdGVtcztcclxuICB9XHJcblxyXG4gIGdldEl0ZW1UZXh0KGl0ZW06IEhOSXRlbSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7XCIgXCIucmVwZWF0KGl0ZW0uZGVwdGgpfS0gJHtkcm9wV2lraWxpbmtzKGl0ZW0ubGluZSl9YDtcclxuICB9XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oaXRlbTogRnV6enlNYXRjaDxITkl0ZW0+LCBlbDogSFRNTEVsZW1lbnQpIHtcclxuICAgIHN1cGVyLnJlbmRlclN1Z2dlc3Rpb24oaXRlbSwgZWwpO1xyXG4gICAgZWwuaW5uZXJUZXh0ID0gYCR7XCIgXCIucmVwZWF0KGl0ZW0uaXRlbS5kZXB0aCl9LSAke2Ryb3BXaWtpbGlua3MoXHJcbiAgICAgIGl0ZW0uaXRlbS5saW5lXHJcbiAgICApfWA7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGVJdGVtKGl0ZW06IEhOSXRlbSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5saW5lcy5zcGxpY2UoaXRlbS5saW5lTm8sIDEpO1xyXG4gICAgICB0aGlzLmxpc3RJdGVtcy5zcGxpY2UoaXRlbS5saW5lTm8sIDEpO1xyXG4gICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KHRoaXMuZmlsZSwgdGhpcy5saW5lcy5qb2luKFwiXFxuXCIpKTtcclxuICAgICAgbmV3IE5vdGljZShcIkl0ZW0gZGVsZXRlZCBTdWNjZXNmdWxseVwiKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBlcnJvcihlcnIpO1xyXG4gICAgICBuZXcgTm90aWNlKFwiQW4gZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaG9vc2VJdGVtKGl0ZW06IEhOSXRlbSwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiYgZXZ0LmtleSA9PT0gXCJEZWxldGVcIikge1xyXG4gICAgICB0aGlzLmRlbGV0ZUl0ZW0oaXRlbSk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmXHJcbiAgICAgIGV2dC5rZXkgPT0gXCJFbnRlclwiICYmXHJcbiAgICAgIGV2dC5zaGlmdEtleVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuICAgICAgY29uc3QgeyBlZGl0b3IgfSA9IHZpZXcgPz8ge307XHJcbiAgICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICB2aWV3LmxlYWYub3BlbkZpbGUodGhpcy5maWxlLCB7IGFjdGl2ZTogdHJ1ZSwgbW9kZTogXCJzb3VyY2VcIiB9KTtcclxuICAgICAgZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGl0ZW0ubGluZU5vLCBjaDogaXRlbS5kZXB0aCArIDIgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgfHwgZXZ0IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xyXG4gICAgICBsZXQgcmVsOiBcInVwXCIgfCBcImRvd25cIiB8IFwic2FtZVwiO1xyXG4gICAgICBpZiAoZXZ0IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBldnQudHlwZSA9PSBcImNsaWNrXCIpIHJlbCA9IFwiZG93blwiO1xyXG4gICAgICBpZiAoZXZ0IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkgaWYgKGV2dC5rZXkgPT09IFwiRW50ZXJcIikgcmVsID0gXCJkb3duXCI7XHJcbiAgICAgIGlmIChldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2dC5zaGlmdEtleSkge1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93VXBcIikgcmVsID0gXCJ1cFwiO1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93RG93blwiKSByZWwgPSBcImRvd25cIjtcclxuICAgICAgICBpZiAoZXZ0LmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHJlbCA9IFwic2FtZVwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXcgTW9kaWZ5SGllckl0ZW1Nb2RhbChcclxuICAgICAgICB0aGlzLnBsdWdpbixcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIHRoaXMuZmlsZSxcclxuICAgICAgICByZWxcclxuICAgICAgKS5vcGVuKCk7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IE1vZGFsLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgTW9kaWZ5SE5JdGVtQ29tcCBmcm9tIFwiLi4vLi4vQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuaW50ZXJmYWNlIEhOSXRlbSB7XHJcbiAgZGVwdGg6IG51bWJlcjtcclxuICBsaW5lOiBzdHJpbmc7XHJcbiAgbGluZU5vOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNb2RpZnlIaWVySXRlbU1vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gIG1vdW50OiBNb2RpZnlITkl0ZW1Db21wO1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgbW9kYWw6IE1vZGlmeUhpZXJJdGVtTW9kYWw7XHJcbiAgaG5JdGVtOiBITkl0ZW07XHJcbiAgZmlsZTogVEZpbGU7XHJcbiAgcmVsOiBcInVwXCIgfCBcInNhbWVcIiB8IFwiZG93blwiO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgICBobkl0ZW06IEhOSXRlbSxcclxuICAgIGZpbGU6IFRGaWxlLFxyXG4gICAgcmVsOiBcInVwXCIgfCBcInNhbWVcIiB8IFwiZG93blwiXHJcbiAgKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLm1vZGFsID0gdGhpcztcclxuICAgIHRoaXMuaG5JdGVtID0gaG5JdGVtO1xyXG4gICAgdGhpcy5maWxlID0gZmlsZTtcclxuICAgIHRoaXMucmVsID0gcmVsO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCkge1xyXG4gICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbiAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuXHJcbiAgICB0aGlzLm1vdW50ID0gbmV3IE1vZGlmeUhOSXRlbUNvbXAoe1xyXG4gICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgcHJvcHM6IHtcclxuICAgICAgICBtb2RhbDogdGhpcyxcclxuICAgICAgICBzZXR0aW5nczogdGhpcy5wbHVnaW4uc2V0dGluZ3MsXHJcbiAgICAgICAgaG5JdGVtOiB0aGlzLmhuSXRlbSxcclxuICAgICAgICBmaWxlOiB0aGlzLmZpbGUsXHJcbiAgICAgICAgcmVsOiB0aGlzLnJlbCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMubW91bnQuJGRlc3Ryb3koKTtcclxuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IGVycm9yIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuICBpbXBvcnQgeyBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBNb2RpZnlIaWVySXRlbU1vZGFsIH0gZnJvbSBcIi4uL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvTW9kaWZ5SGllckl0ZW1Nb2RhbFwiO1xyXG4gIGltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgeyBkcm9wV2lraWxpbmtzLCBtYWtlV2lraSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgbW9kYWw6IE1vZGlmeUhpZXJJdGVtTW9kYWw7XHJcbiAgZXhwb3J0IGxldCBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuICBleHBvcnQgbGV0IGhuSXRlbTogSE5JdGVtO1xyXG4gIGV4cG9ydCBsZXQgZmlsZTogVEZpbGU7XHJcbiAgZXhwb3J0IGxldCByZWw6IFwidXBcIiB8IFwic2FtZVwiIHwgXCJkb3duXCI7XHJcblxyXG4gIGludGVyZmFjZSBITkl0ZW0ge1xyXG4gICAgZGVwdGg6IG51bWJlcjtcclxuICAgIGxpbmU6IHN0cmluZztcclxuICAgIGxpbmVObzogbnVtYmVyO1xyXG4gIH1cclxuICBsZXQgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgLy9AdHMtaWdub3JlXHJcbiAgbGV0IG5ld0l0ZW0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldy5maWxlLmJhc2VuYW1lO1xyXG5cclxuICBjb25zdCBidWlsZE5ld0l0ZW0gPSAoXHJcbiAgICBuZXdJdGVtOiBzdHJpbmcsXHJcbiAgICBkZXB0aCA9IGhuSXRlbS5kZXB0aCxcclxuICAgIHByZXZpZXcgPSBmYWxzZVxyXG4gICkgPT5cclxuICAgIGAke1wiIFwiLnJlcGVhdChNYXRoLnJvdW5kKGRlcHRoIC8gKHByZXZpZXcgPyAyIDogMSkpKX0tICR7XHJcbiAgICAgIHByZXZpZXcgPyBuZXdJdGVtIHx8IFwiPEVtcHR5PlwiIDogbWFrZVdpa2kobmV3SXRlbSlcclxuICAgIH1gO1xyXG5cclxuICAvLyBvbk1vdW50KGlucHV0RWwuZm9jdXMpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxoNT5BZGQgYW4ge0FSUk9XX0RJUkVDVElPTlNbcmVsXX0gdG8ge2Ryb3BXaWtpbGlua3MoaG5JdGVtLmxpbmUpfTwvaDU+XHJcbjxkaXY+XHJcbiAgeyNpZiByZWwgPT09IFwidXBcIn1cclxuICAgIHsjaWYgaG5JdGVtLmRlcHRoID09PSAwfVxyXG4gICAgICA8ZGl2PkNhbid0IGFkZCBwYXJlbnQgdG8gdG9wIGxldmVsIGl0ZW0sIGNob29zZSBhbm90aGVyIGRpcmVjdGlvbjwvZGl2PlxyXG4gICAgezplbHNlfVxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxwcmU+XHJcbiAgICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCAtIDQsIHRydWUpfVxyXG4gICAgICAgIDwvcHJlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIHsvaWZ9XHJcbiAgey9pZn1cclxuICA8ZGl2PlxyXG4gICAgPHByZT5cclxuICAgICAgICA8c3Ryb25nXHJcbiAgICAgICAgPntidWlsZE5ld0l0ZW0oZHJvcFdpa2lsaW5rcyhobkl0ZW0ubGluZSksIGhuSXRlbS5kZXB0aCwgdHJ1ZSl9PC9zdHJvbmdcclxuICAgICAgPlxyXG4gICAgPC9wcmU+XHJcbiAgPC9kaXY+XHJcbiAgeyNpZiByZWwgPT09IFwic2FtZVwifVxyXG4gICAgPGRpdj5cclxuICAgICAgPHByZT5cclxuICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCwgdHJ1ZSl9XHJcbiAgICA8L3ByZT5cclxuICAgIDwvZGl2PlxyXG4gIHs6ZWxzZSBpZiByZWwgPT09IFwiZG93blwifVxyXG4gICAgPGRpdj5cclxuICAgICAgPHByZT5cclxuICAgICAgICB7YnVpbGROZXdJdGVtKG5ld0l0ZW0sIGhuSXRlbS5kZXB0aCArIDQsIHRydWUpfVxyXG4gICAgPC9wcmU+XHJcbiAgICA8L2Rpdj5cclxuICB7L2lmfVxyXG5cclxuICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1uby1vbmNoYW5nZSAtLT5cclxuICA8c2VsZWN0IGNsYXNzPVwiZHJvcGRvd25cIiB3aWR0aD1cIjFcIiBiaW5kOnZhbHVlPXtyZWx9PlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cInVwXCI+dXA8L29wdGlvbj5cclxuICAgIDxvcHRpb24gdmFsdWU9XCJzYW1lXCI+c2FtZTwvb3B0aW9uPlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cImRvd25cIj5kb3duPC9vcHRpb24+XHJcbiAgPC9zZWxlY3Q+XHJcblxyXG4gIDxpbnB1dFxyXG4gICAgdHlwZT1cInRleHRcIlxyXG4gICAgcGxhY2Vob2xkZXI9XCJOZXcgaXRlbVwiXHJcbiAgICBiaW5kOnRoaXM9e2lucHV0RWx9XHJcbiAgICBiaW5kOnZhbHVlPXtuZXdJdGVtfVxyXG4gIC8+XHJcblxyXG4gIDxidXR0b25cclxuICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4ge1xyXG4gICAgICBpZiAocmVsID09PSBcInVwXCIgJiYgaG5JdGVtLmRlcHRoID09PSAwKSB7XHJcbiAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgIFwiQ2FuJ3QgYWRkIHBhcmVudCB0byB0b3AgbGV2ZWwgaXRlbSwgY2hvb3NlIGFub3RoZXIgZGlyZWN0aW9uXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgICAgICAgY29uc3QgbGluZU5vID0gcmVsID09PSBcInVwXCIgPyBobkl0ZW0ubGluZU5vIDogaG5JdGVtLmxpbmVObyArIDE7XHJcblxyXG4gICAgICAgICAgY29uc3QgZGVwdGggPVxyXG4gICAgICAgICAgICByZWwgPT09IFwidXBcIlxyXG4gICAgICAgICAgICAgID8gaG5JdGVtLmRlcHRoIC0gNFxyXG4gICAgICAgICAgICAgIDogcmVsID09PSBcImRvd25cIlxyXG4gICAgICAgICAgICAgID8gaG5JdGVtLmRlcHRoICsgNFxyXG4gICAgICAgICAgICAgIDogaG5JdGVtLmRlcHRoO1xyXG5cclxuICAgICAgICAgIGxpbmVzLnNwbGljZShsaW5lTm8sIDAsIGJ1aWxkTmV3SXRlbShuZXdJdGVtLCBkZXB0aCkpO1xyXG4gICAgICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBsaW5lcy5qb2luKFwiXFxuXCIpKTtcclxuICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBlcnJvcihlcnIpO1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcIkFuIGVycm9yIG9jY3VyZWQsIHBsZWFzZSBjaGVjayB0aGUgY29uc29sZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH19PkFkZDwvYnV0dG9uXHJcbiAgPlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBwcmUge1xyXG4gICAgZGlzcGxheTogaW5saW5lO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGdldERWQXBpIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVJbmRleCwgaW5kZXhUb0xpbmVQYWlycyB9IGZyb20gXCIuL0NvbW1hbmRzL0NyZWF0ZUluZGV4XCI7XHJcbmltcG9ydCBDQlRyZWUgZnJvbSBcIi4vQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlXCI7XHJcbmltcG9ydCB7IENPREVCTE9DS19GSUVMRFMsIENPREVCTE9DS19UWVBFUywgRElSRUNUSU9OUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IENvZGVibG9ja0ZpZWxkcywgUGFyc2VkQ29kZWJsb2NrIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7IGRyb3BGb2xkZXIsIHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFJlZmxleGl2ZUNsb3N1cmUsXHJcbiAgZ2V0U3ViRm9yRmllbGRzLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkSW5mbywgZ2V0RmllbGRzLCBnZXRPcHBEaXIgfSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSnVnZ2wgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9KdWdnbFwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvZGVibG9ja0NCKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCBjcmVhdGVJbmRleEluZGVudCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIGVsOiBIVE1MRWxlbWVudCxcclxuICAgIGN0eDogTWFya2Rvd25Qb3N0UHJvY2Vzc29yQ29udGV4dFxyXG4gICkgPT4ge1xyXG4gICAgZGIuc3RhcnQyRyhcIkNvZGVibG9ja1wiKTtcclxuICAgIGNvbnN0IHBhcnNlZFNvdXJjZSA9IHBhcnNlQ29kZUJsb2NrU291cmNlKHNvdXJjZSk7XHJcbiAgICBjb25zdCBlcnIgPSBjb2RlYmxvY2tFcnJvcihwbHVnaW4sIHBhcnNlZFNvdXJjZSk7XHJcblxyXG4gICAgaWYgKGVyciAhPT0gXCJcIikge1xyXG4gICAgICBlbC5pbm5lckhUTUwgPSBlcnI7XHJcbiAgICAgIGRiLmVuZDJHKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWluID0gMCxcclxuICAgICAgbWF4ID0gSW5maW5pdHk7XHJcbiAgICBsZXQgeyBkZXB0aCwgZGlyLCBmaWVsZHMsIGZyb20sIGltcGxpZWQsIGZsYXQgfSA9IHBhcnNlZFNvdXJjZTtcclxuICAgIGlmIChkZXB0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IG1pbk51bSA9IHBhcnNlSW50KGRlcHRoWzBdKTtcclxuICAgICAgaWYgKCFpc05hTihtaW5OdW0pKSBtaW4gPSBtaW5OdW07XHJcbiAgICAgIGNvbnN0IG1heE51bSA9IHBhcnNlSW50KGRlcHRoWzFdKTtcclxuICAgICAgaWYgKCFpc05hTihtYXhOdW0pKSBtYXggPSBtYXhOdW07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGN1cnJGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoXHJcbiAgICAgIGN0eC5zb3VyY2VQYXRoLFxyXG4gICAgICBcIlwiXHJcbiAgICApO1xyXG4gICAgY29uc3QgeyBiYXNlbmFtZSB9ID0gY3VyckZpbGU7XHJcblxyXG4gICAgbGV0IGZyb21zID0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGFwaSA9IGdldERWQXBpKHBsdWdpbik7XHJcbiAgICAgICAgaWYgKGFwaSkge1xyXG4gICAgICAgICAgY29uc3QgcGFnZXMgPSBhcGkucGFnZVBhdGhzKGZyb20pPy52YWx1ZXM7XHJcbiAgICAgICAgICBmcm9tcyA9IHBhZ2VzLm1hcChkcm9wRm9sZGVyKTtcclxuICAgICAgICB9IGVsc2UgbmV3IE5vdGljZShcIkRhdGF2aWV3IG11c3QgYmUgZW5hYmxlZCBmb3IgYGZyb21gIHRvIHdvcmsuXCIpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbmV3IE5vdGljZShgVGhlIHF1ZXJ5IFwiJHtmcm9tfVwiIGZhaWxlZC5gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIpO1xyXG4gICAgY29uc3Qgc3ViID1cclxuICAgICAgaW1wbGllZCA9PT0gZmFsc2VcclxuICAgICAgICA/IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIGRpcilcclxuICAgICAgICA6IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIGRpciwgb3BwRGlyKTtcclxuICAgIGNvbnN0IGNsb3NlZCA9IGdldFJlZmxleGl2ZUNsb3N1cmUoc3ViLCB1c2VySGllcnMpO1xyXG5cclxuICAgIGNvbnN0IHN1YkZpZWxkcyA9IGZpZWxkcyA/PyBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICAgIGNvbnN0IHN1YkNsb3NlZCA9IGdldFN1YkZvckZpZWxkcyhnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXIpLCBzdWJGaWVsZHMpO1xyXG5cclxuXHJcbiAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKHN1YkNsb3NlZCwgYmFzZW5hbWUpO1xyXG4gICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgIGluZm8oeyBhbGxQYXRocywgaW5kZXggfSk7XHJcblxyXG4gICAgY29uc3QgbGluZXMgPSBpbmRleFRvTGluZVBhaXJzKGluZGV4LCBmbGF0KTtcclxuXHJcbiAgICBzd2l0Y2ggKHBhcnNlZFNvdXJjZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJ0cmVlXCI6XHJcbiAgICAgICAgbmV3IENCVHJlZSh7XHJcbiAgICAgICAgICB0YXJnZXQ6IGVsLFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgcGx1Z2luLFxyXG4gICAgICAgICAgICBlbCxcclxuICAgICAgICAgICAgbWluLFxyXG4gICAgICAgICAgICBtYXgsXHJcbiAgICAgICAgICAgIGxpbmVzLFxyXG4gICAgICAgICAgICBmcm9tcyxcclxuICAgICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICAgIHBhcnNlZFNvdXJjZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJqdWdnbFwiOlxyXG4gICAgICAgIGNyZWF0ZWRKdWdnbENCKFxyXG4gICAgICAgICAgcGx1Z2luLFxyXG4gICAgICAgICAgZWwsXHJcbiAgICAgICAgICBwYXJzZWRTb3VyY2UsXHJcbiAgICAgICAgICBsaW5lcyxcclxuICAgICAgICAgIGZyb21zLFxyXG4gICAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgICBtaW4sXHJcbiAgICAgICAgICBtYXhcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcnNlIGEgc3RyaW5nIGFzIGEgYm9vbGVhbiB2YWx1ZS4gSWYgbm90IFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiwgcmV0dXJuIGB2YWx1ZWAuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgYm9vbGVhbn1cclxuICovXHJcbmNvbnN0IHBhcnNlQXNCb29sID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBib29sZWFuID0+XHJcbiAgdmFsdWUgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IHZhbHVlID09PSBcImZhbHNlXCIgPyBmYWxzZSA6IHZhbHVlO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VDb2RlQmxvY2tTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBQYXJzZWRDb2RlYmxvY2sge1xyXG4gIGNvbnN0IGxpbmVzID0gc291cmNlLnNwbGl0KFwiXFxuXCIpO1xyXG4gIGNvbnN0IGdldFZhbHVlID0gKHR5cGU6IHN0cmluZykgPT5cclxuICAgIGxpbmVzXHJcbiAgICAgIC5maW5kKChsKSA9PiBsLnN0YXJ0c1dpdGgoYCR7dHlwZX06YCkpXHJcbiAgICAgID8uc3BsaXQoXCI6XCIpPy5bMV1cclxuICAgICAgPy50cmltKCk7XHJcblxyXG4gIGNvbnN0IHJlc3VsdHM6IHsgW2ZpZWxkIGluIENvZGVibG9ja0ZpZWxkc106IHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXSB9ID1cclxuICAgIHt9O1xyXG5cclxuICBDT0RFQkxPQ0tfRklFTERTLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGdldFZhbHVlKGZpZWxkKTtcclxuICAgIHJlc3VsdHNbZmllbGRdID0gcGFyc2VBc0Jvb2wodmFsdWUpO1xyXG4gIH0pO1xyXG5cclxuICByZXN1bHRzLmZpZWxkcyA9IHJlc3VsdHMuZmllbGRzXHJcbiAgICA/IHNwbGl0QW5kVHJpbShyZXN1bHRzLmZpZWxkcyBhcyBzdHJpbmcpXHJcbiAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgaWYgKHJlc3VsdHMuZGVwdGgpIHtcclxuICAgIGNvbnN0IG1hdGNoID0gKHJlc3VsdHMuZGVwdGggYXMgc3RyaW5nKS5tYXRjaCgvKFxcZCopLT8oXFxkKikvKTtcclxuICAgIHJlc3VsdHMuZGVwdGggPSBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUGFyc2VkQ29kZWJsb2NrO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb2RlYmxvY2tFcnJvcihwbHVnaW46IEJDUGx1Z2luLCBwYXJzZWRTb3VyY2U6IFBhcnNlZENvZGVibG9jaykge1xyXG4gIGNvbnN0IHsgZGlyLCBmaWVsZHMsIHR5cGUsIHRpdGxlLCBkZXB0aCwgZmxhdCwgY29udGVudCwgZnJvbSwgaW1wbGllZCB9ID1cclxuICAgIHBhcnNlZFNvdXJjZTtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGxldCBlcnIgPSBcIlwiO1xyXG5cclxuICBpZiAoIUNPREVCTE9DS19UWVBFUy5pbmNsdWRlcyh0eXBlKSlcclxuICAgIGVyciArPSBgPGNvZGU+dHlwZTogJHt0eXBlfTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdHlwZS4gSXQgbXVzdCBiZSBvbmUgb2Y6ICR7Q09ERUJMT0NLX1RZUEVTLm1hcChcclxuICAgICAgKHR5cGUpID0+IGA8Y29kZT4ke3R5cGV9PC9jb2RlPmBcclxuICAgICkuam9pbihcIiwgXCIpfS48L2JyPmA7XHJcblxyXG4gIGNvbnN0IHZhbGlkRGlyID0gRElSRUNUSU9OUy5pbmNsdWRlcyhkaXIpO1xyXG4gIGlmICghdmFsaWREaXIpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmRpcjogJHtkaXJ9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCBkaXJlY3Rpb24uPC9icj5gO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBbZmllbGRzXS5mbGF0KCk/LmZvckVhY2goKGYpID0+IHtcclxuICAgIGlmIChmICE9PSB1bmRlZmluZWQgJiYgIWFsbEZpZWxkcy5pbmNsdWRlcyhmKSlcclxuICAgICAgZXJyICs9IGA8Y29kZT5maWVsZHM6ICR7Zn08L2NvZGU+IGlzIG5vdCBhIGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMuPC9icj5gO1xyXG4gIH0pO1xyXG5cclxuICBpZiAodGl0bGUgIT09IHVuZGVmaW5lZCAmJiB0aXRsZSAhPT0gZmFsc2UpXHJcbiAgICBlcnIgKz0gYDxjb2RlPnRpdGxlOiAke3RpdGxlfTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIGxlYXZlIHRoZSBlbnRpcmUgbGluZSBvdXQuPC9icj5gO1xyXG5cclxuICBpZiAoZGVwdGggIT09IHVuZGVmaW5lZCAmJiBkZXB0aC5ldmVyeSgobnVtKSA9PiBpc05hTihwYXJzZUludChudW0pKSkpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmRlcHRoOiAke2RlcHRofTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSBhIG51bWJlci48L2JyPmA7XHJcblxyXG4gIGlmIChmbGF0ICE9PSB1bmRlZmluZWQgJiYgZmxhdCAhPT0gdHJ1ZSlcclxuICAgIGVyciArPSBgPGNvZGU+ZmxhdDogJHtmbGF0fTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT50cnVlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQgJiYgY29udGVudCAhPT0gXCJvcGVuXCIgJiYgY29udGVudCAhPT0gXCJjbG9zZWRcIilcclxuICAgIGVyciArPSBgPGNvZGU+Y29udGVudDogJHtjb250ZW50fTwvY29kZT4gaXMgbm90IGEgdmFsaWQgdmFsdWUuIEl0IGhhcyB0byBiZSA8Y29kZT5vcGVuPC9jb2RlPiBvciA8Y29kZT5jbG9zZWQ8L2NvZGU+LCBvciBsZWF2ZSB0aGUgZW50aXJlIGxpbmUgb3V0LjwvYnI+YDtcclxuXHJcbiAgaWYgKFxyXG4gICAgZnJvbSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAhYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZGF0YXZpZXdcIilcclxuICApIHtcclxuICAgIGVyciArPSBgRGF0YXZpZXcgbXVzdCBiZSBlbmFibGVkIHRvIHVzZSA8Y29kZT5mcm9tPC9jb2RlPi48L2JyPmA7XHJcbiAgfVxyXG5cclxuICBpZiAoaW1wbGllZCAhPT0gdW5kZWZpbmVkICYmIGltcGxpZWQgIT09IGZhbHNlKVxyXG4gICAgZXJyICs9IGA8Y29kZT5pbXBsaWVkOiAke2ltcGxpZWR9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIHJldHVybiBlcnIgPT09IFwiXCJcclxuICAgID8gXCJcIlxyXG4gICAgOiBgJHtlcnJ9PC9icj5cclxuICAgIEEgdmFsaWQgZXhhbXBsZSB3b3VsZCBiZTpcclxuICAgIDxwcmU+PGNvZGU+XHJcbiAgICAgIHR5cGU6IHRyZWVcclxuICAgICAgZGlyOiAke3ZhbGlkRGlyID8gZGlyIDogXCJkb3duXCJ9XHJcbiAgICAgIGZpZWxkczogJHthbGxGaWVsZHNcclxuICAgICAgLm1hcCgoZikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IGYsIGRpcjogZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZikuZmllbGREaXIgfTtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcigoaW5mbykgPT4gaW5mby5kaXIgPT09IGRpcilcclxuICAgICAgLm1hcCgoaW5mbykgPT4gaW5mby5mKVxyXG4gICAgICAuam9pbihcIiwgXCIpIHx8IFwiY2hpbGRcIlxyXG4gICAgfVxyXG4gICAgICBkZXB0aDogM1xyXG4gICAgICA8L2NvZGU+PC9wcmU+YDtcclxufVxyXG5cclxuY29uc3QgaW5kZW50VG9EZXB0aCA9IChpbmRlbnQ6IHN0cmluZykgPT4gaW5kZW50Lmxlbmd0aCAvIDIgKyAxO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1lZXRzQ29uZGl0aW9ucyhcclxuICBpbmRlbnQ6IHN0cmluZyxcclxuICBub2RlOiBzdHJpbmcsXHJcbiAgZnJvbXM6IHN0cmluZ1tdLFxyXG4gIG1pbjogbnVtYmVyLFxyXG4gIG1heDogbnVtYmVyXHJcbikge1xyXG4gIGNvbnN0IGRlcHRoID0gaW5kZW50VG9EZXB0aChpbmRlbnQpO1xyXG4gIHJldHVybiAoXHJcbiAgICBkZXB0aCA+PSBtaW4gJiZcclxuICAgIGRlcHRoIDw9IG1heCAmJlxyXG4gICAgKGZyb21zID09PSB1bmRlZmluZWQgfHwgZnJvbXMuaW5jbHVkZXMobm9kZSkpXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZWRKdWdnbENCKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBhcmdzOiBQYXJzZWRDb2RlYmxvY2ssXHJcbiAgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcclxuICBmcm9tczogc3RyaW5nW10sXHJcbiAgc291cmNlOiBzdHJpbmcsXHJcbiAgbWluOiBudW1iZXIsXHJcbiAgbWF4OiBudW1iZXJcclxuKSB7XHJcbiAgY29uc3Qgbm9kZXMgPSBsaW5lc1xyXG4gICAgLmZpbHRlcigoW2luZGVudCwgbm9kZV0pID0+IG1lZXRzQ29uZGl0aW9ucyhpbmRlbnQsIG5vZGUsIGZyb21zLCBtaW4sIG1heCkpXHJcbiAgICAubWFwKChbXywgbm9kZV0pID0+IG5vZGUgKyBcIi5tZFwiKTtcclxuICBpZiAobWluIDw9IDApIG5vZGVzLnB1c2goc291cmNlICsgXCIubWRcIik7XHJcblxyXG4gIGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJncyk7XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgTWFya2Rvd25SZW5kZXJlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG4gIGltcG9ydCB7IG9uTW91bnQgfSBmcm9tIFwic3ZlbHRlXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGF0aDogc3RyaW5nO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50KG5vdGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5vdGUsIFwiXCIpO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGVsOiBIVE1MRWxlbWVudDtcclxuICBvbk1vdW50KGFzeW5jICgpID0+IHtcclxuICAgIE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oYXdhaXQgZ2V0Q29udGVudChwYXRoKSwgZWwsIHBhdGgsIG51bGwpO1xyXG4gIH0pO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1ub3RlLWNvbnRlbnRcIiBiaW5kOnRoaXM9e2VsfSAvPlxyXG5cclxuPHN0eWxlPlxyXG4gIGRpdi5CQy1ub3RlLWNvbnRlbnQge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHtcclxuICAgIGlzSW5WYXVsdCxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICAgIGhvdmVyUHJldmlldyxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuICBpbXBvcnQgeyBtZWV0c0NvbmRpdGlvbnMgfSBmcm9tIFwiLi4vQ29kZWJsb2Nrc1wiO1xyXG4gIGltcG9ydCB0eXBlIHsgUGFyc2VkQ29kZWJsb2NrIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IGRyb3BEZW5kcm9uIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG4gIGltcG9ydCBSZW5kZXJNYXJrZG93biBmcm9tIFwiLi9SZW5kZXJNYXJrZG93bi5zdmVsdGVcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgZWw6IEhUTUxFbGVtZW50O1xyXG4gIGV4cG9ydCBsZXQgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICBleHBvcnQgbGV0IGZyb21zOiBzdHJpbmdbXTtcclxuICBleHBvcnQgbGV0IG1pbjogbnVtYmVyO1xyXG4gIGV4cG9ydCBsZXQgbWF4OiBudW1iZXI7XHJcbiAgZXhwb3J0IGxldCBiYXNlbmFtZTogc3RyaW5nO1xyXG4gIGV4cG9ydCBsZXQgcGFyc2VkU291cmNlOiBQYXJzZWRDb2RlYmxvY2s7XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHRpdGxlLCBjb250ZW50LCBkaXIgfSA9IHBhcnNlZFNvdXJjZTtcclxuXHJcbiAgY29uc3QgYWN0aXZlTGVhZlZpZXcgPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldztcclxuPC9zY3JpcHQ+XHJcblxyXG57I2lmIHRpdGxlICE9PSBmYWxzZX1cclxuICA8aDM+e2Rpcn0gb2Yge2Jhc2VuYW1lfTwvaDM+XHJcbnsvaWZ9XHJcbjxkaXYgY2xhc3M9XCJCQy10cmVlXCI+XHJcbiAgeyNlYWNoIGxpbmVzIGFzIFtpbmRlbnQsIGxpbmtdfVxyXG4gICAgeyNpZiBtZWV0c0NvbmRpdGlvbnMoaW5kZW50LCBsaW5rLCBmcm9tcywgbWluLCBtYXgpfVxyXG4gICAgICB7I2lmIGNvbnRlbnQgPT09IFwib3BlblwiIHx8IGNvbnRlbnQgPT09IFwiY2xvc2VkXCJ9XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJpbmRlbnRcIj57aW5kZW50fTwvcHJlPlxyXG4gICAgICAgICAgPGRldGFpbHMgb3Blbj17Y29udGVudCA9PT0gXCJvcGVuXCJ9PlxyXG4gICAgICAgICAgICA8c3VtbWFyeT5cclxuICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2gobGluaywgZSl9XHJcbiAgICAgICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgYWN0aXZlTGVhZlZpZXcsIGxpbmspfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1pc3NpbmctYXR0cmlidXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnRlcm5hbC1saW5rIHtpc0luVmF1bHQobGluaykgPyAnJyA6ICdpcy11bnJlc29sdmVkJ31cIlxyXG4gICAgICAgICAgICAgICAgICA+e2Ryb3BEZW5kcm9uKGxpbmssIHNldHRpbmdzKX08L2FcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3VtbWFyeT5cclxuICAgICAgICAgICAgPFJlbmRlck1hcmtkb3duIHBhdGg9e2xpbmt9IC8+XHJcbiAgICAgICAgICA8L2RldGFpbHM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHs6ZWxzZX1cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHByZSBjbGFzcz1cImluZGVudFwiPntpbmRlbnQgKyBcIi1cIn08L3ByZT5cclxuICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1vdXNlLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChsaW5rLCBlKX1cclxuICAgICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCBsaW5rKX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbWlzc2luZy1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaW50ZXJuYWwtbGluayB7aXNJblZhdWx0KGxpbmspID8gJycgOiAnaXMtdW5yZXNvbHZlZCd9XCI+XHJcbiAgICAgICAgICAgICAge2Ryb3BEZW5kcm9uKGxpbmssIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2lmfVxyXG4gICAgey9pZn1cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIC5CQy10cmVlIHtcclxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gIH1cclxuICAvKiAuQkMtdHJlZSA+IGRpdiB7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIH0gKi9cclxuICBwcmUuaW5kZW50IHtcclxuICAgIGRpc3BsYXk6IGlubGluZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gICAgcG9zaXRpb246IHRvcDtcclxuICB9XHJcbiAgZGV0YWlscyB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgfVxyXG5cclxuICAuaXMtdW5yZXNvbHZlZCB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFJlYWxuSW1wbGllZCB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7Z2V0Q3VyckZpbGV9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ganVtcFRvRmlyc3REaXIocGx1Z2luOiBCQ1BsdWdpbiwgZGlyOiBEaXJlY3Rpb25zKSB7XHJcbiAgY29uc3QgeyBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgY29uc3QgZmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgaWYgKCFmaWxlKSB7XHJcbiAgICBuZXcgTm90aWNlKFwiWW91IG5lZWQgdG8gYmUgZm9jdXNzZWQgb24gYSBNYXJrZG93biBmaWxlXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBjb25zdCB7IGJhc2VuYW1lIH0gPSBmaWxlO1xyXG5cclxuICBjb25zdCByZWFsc05JbXBsaWVkcyA9IGdldFJlYWxuSW1wbGllZChwbHVnaW4sIGJhc2VuYW1lLCBkaXIpW2Rpcl07XHJcbiAgY29uc3QgYWxsQkNzID0gWy4uLnJlYWxzTkltcGxpZWRzLnJlYWxzLCAuLi5yZWFsc05JbXBsaWVkcy5pbXBsaWVkc107XHJcbiAgaWYgKGFsbEJDcy5sZW5ndGggPT09IDApIHtcclxuICAgIG5ldyBOb3RpY2UoYE5vICR7ZGlyfSBmb3VuZGApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG9Ob2RlID0gYWxsQkNzLmZpbmQoKGJjKSA9PlxyXG4gICAgbGltaXRKdW1wVG9GaXJzdEZpZWxkcy5pbmNsdWRlcyhiYy5maWVsZClcclxuICApPy50bztcclxuXHJcbiAgaWYgKCF0b05vZGUpIHtcclxuICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgIGBObyBub3RlIHdhcyBmb3VuZCBpbiAke2Rpcn0gZ2l2ZW4gdGhlIGxpbWl0ZWQgZmllbGRzIGFsbG93ZWQ6ICR7bGltaXRKdW1wVG9GaXJzdEZpZWxkcy5qb2luKFxyXG4gICAgICAgIFwiLCBcIlxyXG4gICAgICApfWBcclxuICAgICk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCB0b0ZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0b05vZGUsIFwiXCIpO1xyXG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi5vcGVuRmlsZSh0b0ZpbGUpO1xyXG59XHJcbiIsICJpbXBvcnQgeyBub3JtYWxpemVQYXRoLCBOb3RpY2UsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkSW5mbywgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVPclVwZGF0ZVlhbWwsIGdldEN1cnJGaWxlLCBzcGxpdEF0WWFtbCB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCByZXNvbHZlVGhyZWFkaW5nTmFtZVRlbXBsYXRlID0gKFxyXG4gIHRlbXBsYXRlOiBzdHJpbmcsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gIGRhdGVGb3JtYXQ6IHN0cmluZ1xyXG4pID0+XHJcbiAgdGVtcGxhdGVcclxuICAgID8gdGVtcGxhdGVcclxuICAgICAgLnJlcGxhY2UoXCJ7e2N1cnJlbnR9fVwiLCBjdXJyRmlsZS5iYXNlbmFtZSlcclxuICAgICAgLnJlcGxhY2UoXCJ7e2ZpZWxkfX1cIiwgZmllbGQpXHJcbiAgICAgIC5yZXBsYWNlKFwie3tkaXJ9fVwiLCBkaXIpXHJcbiAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIG1vbWVudCgpLmZvcm1hdChkYXRlRm9ybWF0KSlcclxuICAgIDogXCJVbnRpdGxlZFwiO1xyXG5cclxuZnVuY3Rpb24gbWFrZUZpbGVuYW1lVW5pcXVlKGZpbGVuYW1lOiBzdHJpbmcpIHtcclxuICBsZXQgaSA9IDEsXHJcbiAgICBuZXdOYW1lID0gZmlsZW5hbWU7XHJcbiAgd2hpbGUgKGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5ld05hbWUsIFwiXCIpKSB7XHJcbiAgICBpZiAoaSA9PT0gMSkgbmV3TmFtZSArPSBgICR7aX1gO1xyXG4gICAgZWxzZSBuZXdOYW1lID0gbmV3TmFtZS5zbGljZSgwLCAtMikgKyBgICR7aX1gO1xyXG4gICAgaSsrO1xyXG4gIH1cclxuICByZXR1cm4gbmV3TmFtZTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRocmVhZGluZ0NvbnRlbnRUZW1wbGF0ZShcclxuICB3cml0ZUJDc0lubGluZTogYm9vbGVhbixcclxuICB0ZW1wbGF0ZVBhdGg6IHN0cmluZyxcclxuICBvcHBGaWVsZDogc3RyaW5nLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBjcnVtYjogc3RyaW5nXHJcbikge1xyXG4gIGxldCBuZXdDb250ZW50ID0gY3J1bWI7XHJcblxyXG4gIGlmICh0ZW1wbGF0ZVBhdGgpIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlRmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KFxyXG4gICAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICAgIFwiXCJcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZCh0ZW1wbGF0ZUZpbGUpO1xyXG4gICAgbmV3Q29udGVudCA9IHRlbXBsYXRlLnJlcGxhY2UoXHJcbiAgICAgIC9cXHtcXHtCQy10aHJlYWQtY3J1bWJcXH1cXH0vaSxcclxuICAgICAgd3JpdGVCQ3NJbmxpbmVcclxuICAgICAgICA/IGAke29wcEZpZWxkfTo6IFtbJHtjdXJyRmlsZS5iYXNlbmFtZX1dXWBcclxuICAgICAgICA6IGAke29wcEZpZWxkfTogWycke2N1cnJGaWxlLmJhc2VuYW1lfSddYFxyXG4gICAgKTtcclxuICB9XHJcbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aHJlYWQocGx1Z2luOiBCQ1BsdWdpbiwgZmllbGQ6IHN0cmluZykge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7XHJcbiAgICB1c2VySGllcnMsXHJcbiAgICB0aHJlYWRpbmdUZW1wbGF0ZSxcclxuICAgIGRhdGVGb3JtYXQsXHJcbiAgICB0aHJlYWRJbnRvTmV3UGFuZSxcclxuICAgIHRocmVhZGluZ0RpclRlbXBsYXRlcyxcclxuICAgIHRocmVhZFVuZGVyQ3Vyc29yLFxyXG4gICAgd3JpdGVCQ3NJbmxpbmUsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG5cclxuICBjb25zdCBjdXJyRmlsZSA9IGdldEN1cnJGaWxlKCk7XHJcbiAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICBjb25zdCBuZXdGaWxlUGFyZW50ID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGUucGF0aCk7XHJcblxyXG4gIGNvbnN0IGRpciA9IGdldEZpZWxkSW5mbyh1c2VySGllcnMsIGZpZWxkKS5maWVsZERpcjtcclxuICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICBsZXQgbmV3QmFzZW5hbWUgPSByZXNvbHZlVGhyZWFkaW5nTmFtZVRlbXBsYXRlKFxyXG4gICAgdGhyZWFkaW5nVGVtcGxhdGUsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIGZpZWxkLFxyXG4gICAgZGlyLFxyXG4gICAgZGF0ZUZvcm1hdFxyXG4gICk7XHJcbiAgbmV3QmFzZW5hbWUgPSBtYWtlRmlsZW5hbWVVbmlxdWUobmV3QmFzZW5hbWUpO1xyXG5cclxuICBjb25zdCBvcHBDcnVtYiA9IHdyaXRlQkNzSW5saW5lXHJcbiAgICA/IGAke29wcEZpZWxkfTo6IFtbJHtjdXJyRmlsZS5iYXNlbmFtZX1dXWBcclxuICAgIDogYC0tLVxcbiR7b3BwRmllbGR9OiBbJyR7Y3VyckZpbGUuYmFzZW5hbWV9J11cXG4tLS1gO1xyXG5cclxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSB0aHJlYWRpbmdEaXJUZW1wbGF0ZXNbZGlyXTtcclxuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVRocmVhZGluZ0NvbnRlbnRUZW1wbGF0ZShcclxuICAgIHdyaXRlQkNzSW5saW5lLFxyXG4gICAgdGVtcGxhdGVQYXRoLFxyXG4gICAgb3BwRmllbGQsXHJcbiAgICBjdXJyRmlsZSxcclxuICAgIG9wcENydW1iXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgbmV3RmlsZSA9IGF3YWl0IGFwcC52YXVsdC5jcmVhdGUoXHJcbiAgICBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVQYXJlbnQucGF0aH0vJHtuZXdCYXNlbmFtZX0ubWRgKSxcclxuICAgIG5ld0NvbnRlbnRcclxuICApO1xyXG5cclxuICBpZiAoIXdyaXRlQkNzSW5saW5lKSB7XHJcbiAgICBjb25zdCB7IGFwaSB9ID0gYXBwLnBsdWdpbnMucGx1Z2lucy5tZXRhZWRpdCA/PyB7fTtcclxuICAgIGlmICghYXBpKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgXCJNZXRhZWRpdCBtdXN0IGJlIGVuYWJsZWQgdG8gd3JpdGUgdG8geWFtbC4gQWx0ZXJuYXRpdmVseSwgdG9nZ2xlIHRoZSBzZXR0aW5nIGBXcml0ZSBCcmVhZGNydW1icyBJbmxpbmVgIHRvIHVzZSBEYXRhdmlldyBpbmxpbmUgZmllbGRzIGluc3RlYWQuXCJcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgY3JlYXRlT3JVcGRhdGVZYW1sKFxyXG4gICAgICBmaWVsZCxcclxuICAgICAgbmV3RmlsZS5iYXNlbmFtZSxcclxuICAgICAgY3VyckZpbGUsXHJcbiAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShjdXJyRmlsZSkuZnJvbnRtYXR0ZXIsXHJcbiAgICAgIGFwaVxyXG4gICAgKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgY3J1bWIgPSBgJHtmaWVsZH06OiBbWyR7bmV3RmlsZS5iYXNlbmFtZX1dXWA7XHJcbiAgICBjb25zdCB7IGVkaXRvciB9ID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXc7XHJcbiAgICBpZiAodGhyZWFkVW5kZXJDdXJzb3IgfHwgIWVkaXRvcikge1xyXG4gICAgICBlZGl0b3IucmVwbGFjZVJhbmdlKGNydW1iLCBlZGl0b3IuZ2V0Q3Vyc29yKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ETyBDaGVjayBpZiB0aGlzIG5vdGUgYWxyZWFkeSBoYXMgdGhpcyBmaWVsZFxyXG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxuICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBdFlhbWwoY29udGVudCk7XHJcbiAgICAgIGNvbnRlbnQgPVxyXG4gICAgICAgIHNwbGl0c1swXSArXHJcbiAgICAgICAgKHNwbGl0c1swXS5sZW5ndGggPyBcIlxcblwiIDogXCJcIikgK1xyXG4gICAgICAgIGNydW1iICtcclxuICAgICAgICAoc3BsaXRzWzFdLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgc3BsaXRzWzFdO1xyXG5cclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShjdXJyRmlsZSwgY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBsZWFmID0gdGhyZWFkSW50b05ld1BhbmVcclxuICAgID8gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpXHJcbiAgICA6IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuXHJcbiAgYXdhaXQgbGVhZi5vcGVuRmlsZShuZXdGaWxlLCB7IGFjdGl2ZTogdHJ1ZSwgbW9kZTogXCJzb3VyY2VcIiB9KTtcclxuXHJcbiAgaWYgKHRlbXBsYXRlUGF0aCkge1xyXG4gICAgaWYgKGFwcC5wbHVnaW5zLnBsdWdpbnNbXCJ0ZW1wbGF0ZXItb2JzaWRpYW5cIl0pIHtcclxuICAgICAgYXBwLmNvbW1hbmRzLmV4ZWN1dGVDb21tYW5kQnlJZChcclxuICAgICAgICBcInRlbXBsYXRlci1vYnNpZGlhbjpyZXBsYWNlLWluLWZpbGUtdGVtcGxhdGVyXCJcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgXCJUaGUgVGVtcGxhdGVyIHBsdWdpbiBtdXN0IGJlIGVuYWJsZWQgdG8gcmVzb2x2ZSB0aGUgdGVtcGxhdGVzIGluIHRoZSBuZXcgbm90ZVwiXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAodGhyZWFkaW5nVGVtcGxhdGUpIHtcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIGNvbnN0IGVkaXRvciA9IGxlYWYudmlldy5lZGl0b3IgYXMgRWRpdG9yO1xyXG4gICAgZWRpdG9yLnNldEN1cnNvcihlZGl0b3IuZ2V0VmFsdWUoKS5sZW5ndGgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBub3RlTmFtZUlucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJ2aWV3LWhlYWRlci10aXRsZVwiKTtcclxuXHJcbiAgICBjb25zdCBuZXdOb3RlSW5wdXRFbCA9IEFycmF5LmZyb20obm90ZU5hbWVJbnB1dHMpLmZpbmQoXHJcbiAgICAgIChpbnB1dDogSFRNTElucHV0RWxlbWVudCkgPT4gaW5wdXQuaW5uZXJUZXh0ID09PSBuZXdCYXNlbmFtZVxyXG4gICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbmV3Tm90ZUlucHV0RWwuaW5uZXJUZXh0ID0gXCJcIjtcclxuICAgIG5ld05vdGVJbnB1dEVsLmZvY3VzKCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjaGFuZ2VZYW1sLCBnZXRDdXJyRmlsZSwgc3BsaXRBdFlhbWwgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlQkNUb0ZpbGUocGx1Z2luOiBCQ1BsdWdpbiwgY3VyckZpbGU/OiBURmlsZSkge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIG1haW5HIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgZmlsZSA9IGN1cnJGaWxlID8/IGdldEN1cnJGaWxlKCk7XHJcblxyXG4gIGNvbnN0IHsgbGltaXRXcml0ZUJDQ2hlY2tib3hlcywgd3JpdGVCQ3NJbmxpbmUsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IHN1Y2NJbmZvID0gbWFpbkcubWFwSW5FZGdlcyhmaWxlLmJhc2VuYW1lLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyIH0gPSBhO1xyXG4gICAgY29uc3Qgb3BwRmllbGQgPSBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXTtcclxuICAgIHJldHVybiB7IHN1Y2M6IHMsIGZpZWxkOiBvcHBGaWVsZCB9O1xyXG4gIH0pO1xyXG5cclxuICBmb3IgKGNvbnN0IHsgc3VjYywgZmllbGQgfSBvZiBzdWNjSW5mbykge1xyXG4gICAgaWYgKCFsaW1pdFdyaXRlQkNDaGVja2JveGVzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQucmVhZChmaWxlKTtcclxuICAgIGNvbnN0IFt5YW1sLCBhZnRlcllhbWxdID0gc3BsaXRBdFlhbWwoY29udGVudCk7XHJcblxyXG4gICAgaWYgKCF3cml0ZUJDc0lubGluZSkge1xyXG4gICAgICBjb25zdCBpbm5lciA9IHlhbWwgPT09IFwiXCIgPyB5YW1sIDogeWFtbC5zbGljZSg0LCAtNCk7XHJcbiAgICAgIGNvbnN0IG5ld1lhbWwgPSBjaGFuZ2VZYW1sKGlubmVyLCBmaWVsZCwgc3VjYyk7XHJcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgLS0tXFxuJHtuZXdZYW1sfVxcbi0tLSR7YWZ0ZXJZYW1sfWA7XHJcbiAgICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkoZmlsZSwgbmV3Q29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPIENoZWNrIGlmIHRoaXMgbm90ZSBhbHJlYWR5IGhhcyB0aGlzIGZpZWxkXHJcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPVxyXG4gICAgICAgIHlhbWwgK1xyXG4gICAgICAgICh5YW1sLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgYCR7ZmllbGR9OjogW1ske3N1Y2N9XV1gICtcclxuICAgICAgICAoYWZ0ZXJZYW1sLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgYWZ0ZXJZYW1sO1xyXG5cclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJDc1RvQWxsRmlsZXMocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGlmICghcGx1Z2luLnNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCkge1xyXG4gICAgbmV3IE5vdGljZShcclxuICAgICAgXCJZb3UgZmlyc3QgbmVlZCB0byBlbmFibGUgdGhpcyBjb21tYW5kIGluIEJyZWFkY3J1bWJzJyBzZXR0aW5ncy5cIlxyXG4gICAgKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKFxyXG4gICAgd2luZG93LmNvbmZpcm0oXHJcbiAgICAgIFwiVGhpcyBhY3Rpb24gd2lsbCB3cml0ZSB0aGUgaW1wbGllZCBCcmVhZGNydW1icyBvZiBlYWNoIGZpbGUgdG8gdGhhdCBmaWxlLlxcbkl0IHVzZXMgdGhlIE1ldGFFZGl0IHBsdWdpbnMgQVBJIHRvIHVwZGF0ZSB0aGUgWUFNTCwgc28gaXQgc2hvdWxkIG9ubHkgYWZmZWN0IHRoYXQgZnJvbnRtYXR0ZXIgb2YgeW91ciBub3RlLlxcbkkgY2FuJ3QgcHJvbWlzZSB0aGF0IG5vdGhpbmcgYmFkIHdpbGwgaGFwcGVuLiAqKlRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUqKi5cIlxyXG4gICAgKVxyXG4gICkge1xyXG4gICAgaWYgKFxyXG4gICAgICB3aW5kb3cuY29uZmlybShcclxuICAgICAgICBcIkFyZSB5b3Ugc3VyZT8gWW91IGhhdmUgYmVlbiB3YXJuZWQgdGhhdCB0aGlzIG9wZXJhdGlvbiB3aWxsIGF0dGVtcHQgdG8gdXBkYXRlIGFsbCBmaWxlcyB3aXRoIGltcGxpZWQgYnJlYWRjcnVtYnMuXCJcclxuICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh3aW5kb3cuY29uZmlybShcIkZvciByZWFsLCBwbGVhc2UgbWFrZSBhIGJhY2sgdXAgYmVmb3JlLlwiKSkge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZSA9IG5ldyBOb3RpY2UoXCJPcGVyYXRpb24gU3RhcnRlZFwiKTtcclxuICAgICAgICBjb25zdCBwcm9ibGVtRmlsZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKSkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgd3JpdGVCQ1RvRmlsZShwbHVnaW4sIGZpbGUpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBwcm9ibGVtRmlsZXMucHVzaChmaWxlLnBhdGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBub3RpY2Uuc2V0TWVzc2FnZShcIk9wZXJhdGlvbiBDb21wbGV0ZVwiKTtcclxuICAgICAgICBpZiAocHJvYmxlbUZpbGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgICAgXCJTb21lIGZpbGVzIHdlcmUgbm90IHVwZGF0ZWQgZHVlIHRvIGVycm9ycy4gQ2hlY2sgdGhlIGNvbnNvbGUgdG8gc2VlIHdoaWNoIG9uZXMuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB3YXJuKHsgcHJvYmxlbUZpbGVzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtcclxuICBFZGl0b3IsXHJcbiAgRWRpdG9yUG9zaXRpb24sXHJcbiAgRWRpdG9yU3VnZ2VzdCxcclxuICBFZGl0b3JTdWdnZXN0Q29udGV4dCxcclxuICBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8sXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5zaWRlWWFtbCB9IGZyb20gXCIuL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHsgQkNfRklFTERTX0lORk8gfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpZWxkU3VnZ2VzdG9yIGV4dGVuZHMgRWRpdG9yU3VnZ2VzdDxzdHJpbmc+IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBvblRyaWdnZXIoXHJcbiAgICBjdXJzb3I6IEVkaXRvclBvc2l0aW9uLFxyXG4gICAgZWRpdG9yOiBFZGl0b3IsXHJcbiAgICBfOiBURmlsZVxyXG4gICk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xyXG4gICAgY29uc3Qgc3ViID0gZWRpdG9yLmdldExpbmUoY3Vyc29yLmxpbmUpLnN1YnN0cmluZygwLCBjdXJzb3IuY2gpO1xyXG4gICAgY29uc3QgbWF0Y2ggPSBzdWIubWF0Y2goL15CQy0oLiopJC8pPy5bMV07XHJcbiAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGVuZDogY3Vyc29yLFxyXG4gICAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgICBjaDogc3ViLmxhc3RJbmRleE9mKG1hdGNoKSxcclxuICAgICAgICAgIGxpbmU6IGN1cnNvci5saW5lLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcXVlcnk6IG1hdGNoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VnZ2VzdGlvbnMgPSAoY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQpID0+IHtcclxuICAgIGNvbnN0IHsgcXVlcnkgfSA9IGNvbnRleHQ7XHJcbiAgICByZXR1cm4gQkNfRklFTERTX0lORk8ubWFwKChzdWcpID0+IHN1Zy5maWVsZCkuZmlsdGVyKChzdWcpID0+XHJcbiAgICAgIHN1Zy5pbmNsdWRlcyhxdWVyeSlcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgZWwuY3JlYXRlRGl2KHtcclxuICAgICAgdGV4dDogc3VnZ2VzdGlvbi5yZXBsYWNlKFwiQkMtXCIsIFwiXCIpLFxyXG4gICAgICBjbHM6IFwiQkMtc3VnZ2VzdGVyLWNvbnRhaW5lclwiLFxyXG4gICAgICBhdHRyOiB7XHJcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IEJDX0ZJRUxEU19JTkZPLmZpbmQoKGYpID0+IGYuZmllbGQgPT09IHN1Z2dlc3Rpb24pPy5kZXNjLFxyXG4gICAgICAgIFwiYXJpYS1sYWJlbC1wb3NpdGlvblwiOiBcInJpZ2h0XCIsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGNvbnRleHQsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGZpZWxkID0gQkNfRklFTERTX0lORk8uZmluZCgoZikgPT4gZi5maWVsZCA9PT0gc3VnZ2VzdGlvbik7XHJcbiAgICBjb25zdCByZXBsYWNlbWVudCA9IGAke3N1Z2dlc3Rpb259JHtmaWVsZD8uW2lzSW5zaWRlWWFtbChhcHApID8gXCJhZnRlcllhbWxcIiA6IFwiYWZ0ZXJJbmxpbmVcIl1cclxuICAgICAgfWA7XHJcblxyXG4gICAgY29udGV4dC5lZGl0b3IucmVwbGFjZVJhbmdlKFxyXG4gICAgICByZXBsYWNlbWVudCxcclxuICAgICAgeyBjaDogMCwgbGluZTogY29udGV4dC5zdGFydC5saW5lIH0sXHJcbiAgICAgIGNvbnRleHQuZW5kXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHtcclxuICBFZGl0b3IsXHJcbiAgRWRpdG9yUG9zaXRpb24sXHJcbiAgRWRpdG9yU3VnZ2VzdCxcclxuICBFZGl0b3JTdWdnZXN0Q29udGV4dCxcclxuICBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8sXHJcbiAgVEZpbGUsXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5zaWRlWWFtbCB9IGZyb20gXCIuL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5pbXBvcnQgeyBlc2NhcGVSZWdleCB9IGZyb20gXCIuL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBSZWxhdGlvblN1Z2dlc3RvciBleHRlbmRzIEVkaXRvclN1Z2dlc3Q8c3RyaW5nPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgb25UcmlnZ2VyKFxyXG4gICAgY3Vyc29yOiBFZGl0b3JQb3NpdGlvbixcclxuICAgIGVkaXRvcjogRWRpdG9yLFxyXG4gICAgXzogVEZpbGVcclxuICApOiBFZGl0b3JTdWdnZXN0VHJpZ2dlckluZm8gfCBudWxsIHtcclxuICAgIGNvbnN0IHRyaWcgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZWxTdWdnZXN0b3JUcmlnZ2VyO1xyXG4gICAgY29uc3Qgc3ViID0gZWRpdG9yLmdldExpbmUoY3Vyc29yLmxpbmUpLnN1YnN0cmluZygwLCBjdXJzb3IuY2gpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgLio/JHtlc2NhcGVSZWdleCh0cmlnKX0oLiopJGApO1xyXG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN1Yik/LlsxXTtcclxuXHJcbiAgICBpZiAobWF0Y2ggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGFydDoge1xyXG4gICAgICAgIGNoOiBzdWIubGFzdEluZGV4T2YodHJpZyksXHJcbiAgICAgICAgbGluZTogY3Vyc29yLmxpbmUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGVuZDogY3Vyc29yLFxyXG4gICAgICBxdWVyeTogbWF0Y2gsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VnZ2VzdGlvbnMgPSAoY29udGV4dDogRWRpdG9yU3VnZ2VzdENvbnRleHQpID0+IHtcclxuICAgIGNvbnN0IHsgcXVlcnkgfSA9IGNvbnRleHQ7XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycyB9ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcbiAgICByZXR1cm4gZ2V0RmllbGRzKHVzZXJIaWVycykuZmlsdGVyKChzdWcpID0+IHN1Zy5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gIH07XHJcblxyXG4gIHJlbmRlclN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGVsLmNyZWF0ZURpdih7XHJcbiAgICAgIHRleHQ6IHN1Z2dlc3Rpb24sXHJcbiAgICAgIGNsczogXCJjb2RlYmxvY2stc3VnZ2VzdGlvblwiLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBjb250ZXh0LCBwbHVnaW4gfSA9IHRoaXM7XHJcbiAgICBpZiAoIWNvbnRleHQpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHRyaWcgPSBwbHVnaW4uc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlcjtcclxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCwgZWRpdG9yIH0gPSBjb250ZXh0O1xyXG5cclxuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gc3VnZ2VzdGlvbiArIChpc0luc2lkZVlhbWwoYXBwKSA/IFwiOiBcIiA6IFwiOjogXCIpICsgJ1tbJztcclxuICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcbiAgICAgIHJlcGxhY2VtZW50LFxyXG4gICAgICB7IGNoOiBzdGFydC5jaCArIDEgLSB0cmlnLmxlbmd0aCwgbGluZTogc3RhcnQubGluZSB9LFxyXG4gICAgICBlbmRcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCJzcmMvVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBLb0ZpIGZyb20gXCIuLi9Db21wb25lbnRzL0tvRmkuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGFkZENyZWF0ZUluZGV4U2V0dGluZ3MgfSBmcm9tIFwiLi9DcmVhdGVJbmRleFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZENTVlNldHRpbmdzIH0gZnJvbSBcIi4vQ1NWU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkRGF0YXZpZXdTZXR0aW5ncyB9IGZyb20gXCIuL0RhdGF2aWV3Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERhdGVOb3RlU2V0dGluZ3MgfSBmcm9tIFwiLi9EYXRlTm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERlYnVnZ2luZ3NTZXR0aW5ncyB9IGZyb20gXCIuL0RlYnVnZ2luZ1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZERlbmRyb25TZXR0aW5ncyB9IGZyb20gXCIuL0RlbmRyb25TZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRHZW5lcmFsU2V0dGluZ3MgfSBmcm9tIFwiLi9HZW5lcmFsU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSGllcmFyY2h5Tm90ZVNldHRpbmdzIH0gZnJvbSBcIi4vSGllcmFyY2h5Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZEhpZXJhcmNoeVNldHRpbmdzIH0gZnJvbSBcIi4vSGllcmFyY2h5U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSnVtcFRvTmV4dFNldHRpbmdzIH0gZnJvbSBcIi4vSnVtcFRvTmV4dFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZE1hdHJpeFZpZXdTZXR0aW5ncyB9IGZyb20gXCIuL01hdHJpeFZpZXdTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGROb1N5c3RlbVNldHRpbmdzIH0gZnJvbSBcIi4vTm9TeXN0ZW1TZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRSZWdleE5vdGVTZXR0aW5ncyB9IGZyb20gXCIuL1JlZ2V4Tm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFJlbGF0aW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9SZWxhdGlvblNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRhZ05vdGVTZXR0aW5ncyB9IGZyb20gXCIuL1RhZ05vdGVTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRUaHJlYWRpbmdTZXR0aW5ncyB9IGZyb20gXCIuL1RocmVhZGluZ1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRyYWlsVmlld1NldHRpbmdzIH0gZnJvbSBcIi4vVHJhaWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRWaXNNb2RhbFNldHRpbmdzIH0gZnJvbSBcIi4vVmlzTW9kYWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRXcml0ZUJDc1NldHRpbmdzIH0gZnJvbSBcIi4vV3JpdGVCQ3NTZXR0aW5nc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZyYWdXaXRoSFRNTCA9IChodG1sOiBzdHJpbmcpID0+XHJcbiAgY3JlYXRlRnJhZ21lbnQoKGZyYWcpID0+IChmcmFnLmNyZWF0ZURpdigpLmlubmVySFRNTCA9IGh0bWwpKTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZXRhaWxzID0gKHRleHQ6IHN0cmluZywgcGFyZW50OiBIVE1MRWxlbWVudCkgPT5cclxuICBwYXJlbnQuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHt9LCAoZCkgPT4gZC5jcmVhdGVFbChcInN1bW1hcnlcIiwgeyB0ZXh0IH0pKTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdWJEZXRhaWxzID0gKHRleHQ6IHN0cmluZywgcGFyZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQpID0+XHJcbiAgcGFyZW50LmNyZWF0ZURpdih7XHJcbiAgICBhdHRyOiB7IHN0eWxlOiBcInBhZGRpbmctbGVmdDogMTBweDtcIiB9LFxyXG4gIH0pXHJcbiAgICAuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHt9LCAoZCkgPT4gZC5jcmVhdGVFbChcInN1bW1hcnlcIiwgeyB0ZXh0IH0pKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBCQ1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHAsIHBsdWdpbik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXkoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiwgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW5cclxuXHJcbiAgICBjb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiQnJlYWRjcnVtYnMgU2V0dGluZ3NcIiB9KTtcclxuICAgIGNvbnRhaW5lckVsLmFkZENsYXNzKFwiQkMtc2V0dGluZ3MtdGFiXCIpO1xyXG5cclxuICAgIGFkZEhpZXJhcmNoeVNldHRpbmdzKHBsdWdpbiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkUmVsYXRpb25TZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuICAgIGFkZEdlbmVyYWxTZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuXHJcbiAgICBjb25zdCB2aWV3RGV0YWlscyA9IGRldGFpbHMoXCJWaWV3c1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcodmlld0RldGFpbHMpXHJcbiAgICAgIC5zZXROYW1lKFwiT3BlbiBWaWV3cyBieSBEZWZhdWx0XCIpXHJcbiAgICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcIkNob29zZSB3aGljaCBvZiB0aGUgdmlld3MgdG8gb3BlbiBvbmxvYWQ8YnIvPk9yZGVyIGlzOiBUcmFpbC9HcmlkL0p1Z2dsLCBNYXRyaXgsIER1Y2tzLCBUcmVlXCIpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlXHJcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIlRyYWlsL0dyaWQvSnVnZ2xcIilcclxuICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QkNzKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBzZXR0aW5ncy5zaG93QkNzID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJNYXRyaXggVmlld1wiKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLm9wZW5NYXRyaXhPbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5NYXRyaXhPbkxvYWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJEdWNrcyBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3BlbkR1Y2tPbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5EdWNrT25Mb2FkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgICB0b2dnbGVcclxuICAgICAgICAgIC5zZXRUb29sdGlwKFwiVHJlZSBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3BlbkRvd25PbkxvYWQpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLm9wZW5Eb3duT25Mb2FkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB2aWV3RGV0YWlscy5jcmVhdGVFbCgnaHInKVxyXG5cclxuICAgIGFkZE1hdHJpeFZpZXdTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuICAgIGFkZFRyYWlsVmlld1NldHRpbmdzKHBsdWdpbiwgdmlld0RldGFpbHMpO1xyXG4gICAgYWRkVmlzTW9kYWxTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuICAgIC8vIGFkZFRyZWVWaWV3U2V0dGluZ3MocGx1Z2luLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gICAgY29uc3QgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzID0gZGV0YWlscyhcclxuICAgICAgXCJBbHRlcm5hdGl2ZSBIaWVyYXJjaGllc1wiLFxyXG4gICAgICBjb250YWluZXJFbFxyXG4gICAgKTtcclxuXHJcbiAgICBhZGRUYWdOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkUmVnZXhOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkTm9TeXN0ZW1TZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGRIaWVyYXJjaHlOb3RlU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkQ1NWU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGVuZHJvblNldHRpbmdzKHBsdWdpbiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuICAgIGFkZERhdGF2aWV3U2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGF0ZU5vdGVTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcblxyXG4gICAgY29uc3QgY21kc0RldGFpbHMgPSBkZXRhaWxzKFwiQ29tbWFuZHNcIiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkV3JpdGVCQ3NTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZENyZWF0ZUluZGV4U2V0dGluZ3MocGx1Z2luLCBjbWRzRGV0YWlscyk7XHJcbiAgICBhZGRUaHJlYWRpbmdTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZEp1bXBUb05leHRTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgICBhZGREZWJ1Z2dpbmdzU2V0dGluZ3MocGx1Z2luLCBjb250YWluZXJFbCk7XHJcblxyXG4gICAgbmV3IEtvRmkoeyB0YXJnZXQ6IGNvbnRhaW5lckVsIH0pO1xyXG4gIH1cclxufVxyXG4iLCAiPCEtLSBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9IRW1pbGUvanVnZ2wvYmxvYi9tYWluL2p1Z2dsL3VpL0tvRmkuc3ZlbHRlIC0tPlxyXG48c2NyaXB0PlxyXG4gIGxldCBidXR0b247XHJcbiAgY29uc3QgaW5pdGlhbGl6ZUtvZmkgPSAoKSA9PiB7XHJcbiAgICBrb2Zpd2lkZ2V0Mi5pbml0KFxyXG4gICAgICBcIlN1cHBvcnQgQnJlYWRjcnVtYnMgZGV2ZWxvcG1lbnQhXCIsXHJcbiAgICAgIFwiIzI5YWJlMFwiLFxyXG4gICAgICBcIkcyRzQ1NFRaRlwiXHJcbiAgICApO1xyXG4gICAgYnV0dG9uLmlubmVySFRNTCA9IGtvZml3aWRnZXQyLmdldEhUTUwoKTtcclxuICB9O1xyXG48L3NjcmlwdD5cclxuXHJcbjxzdmVsdGU6aGVhZD5cclxuICA8c2NyaXB0XHJcbiAgICB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCJcclxuICAgIHNyYz1cImh0dHBzOi8va28tZmkuY29tL3dpZGdldHMvd2lkZ2V0XzIuanNcIlxyXG4gICAgb246bG9hZD17aW5pdGlhbGl6ZUtvZml9PlxyXG4gIDwvc2NyaXB0PlxyXG48L3N2ZWx0ZTpoZWFkPlxyXG48ZGl2IGNsYXNzPVwiQkMtS29maS1idXR0b25cIiBiaW5kOnRoaXM9e2J1dHRvbn0gLz5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtS29maS1idXR0b24ge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENyZWF0ZUluZGV4U2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjbWRzRGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBjcmVhdGVJbmRleERldGFpbHMgPSBzdWJEZXRhaWxzKFwiQ3JlYXRlIEluZGV4XCIsIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoY3JlYXRlSW5kZXhEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBZGQgd2lrbGluayBicmFja2V0c1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoZW4gY3JlYXRpbmcgYW4gaW5kZXgsIHNob3VsZCBpdCB3cmFwIHRoZSBub3RlIG5hbWUgaW4gd2lraWxpbmtzIDxjb2RlPltbXV08L2NvZGU+IG9yIG5vdC5cXG5cdTI3MDUgPSB5ZXMsIFx1Mjc0QyA9IG5vLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLndpa2lsaW5rSW5kZXgpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLndpa2lsaW5rSW5kZXggPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkluZGVudCBDaGFyYWN0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgJ1RoZSBjaGFyYWN0ZXIocykgdXNlZCB0byBpbmRlbnQgdGhlIGluZGV4LiBUaGVzZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCB3aWxsIHVzdWFsbHkgYmUgZWl0aGVyIHNwYWNlcyBvciB0YWJzLiBFbnRlciA8Y29kZT5cXFxcdDwvY29kZT4gdG8gdXNlIHRhYnMuJ1xyXG4gICAgICApKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5jcmVhdGVJbmRleEluZGVudClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5jcmVhdGVJbmRleEluZGVudCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgYWxpYXNlcyBvZiBub3RlcyBpbiBpbmRleFwiKVxyXG4gICAgLnNldERlc2MoXCJTaG93IHRoZSBhbGlhc2VzIG9mIGVhY2ggbm90ZSBpbiBicmFja2V0cy5cXG5cdTI3MDUgPSB5ZXMsIFx1Mjc0QyA9IG5vLlwiKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWxpYXNlc0luSW5kZXgpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmFsaWFzZXNJbkluZGV4ID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ1NWU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgY3N2RGV0YWlscyA9IHN1YkRldGFpbHMoXCJDU1YgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoY3N2RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiQ1NWIEJyZWFkY3J1bWIgUGF0aHNcIilcclxuICAgIC5zZXREZXNjKFwiVGhlIGZpbGUgcGF0aCBvZiBhIGNzdiBmaWxlcyB3aXRoIGJyZWFkY3J1bWJzIGluZm9ybWF0aW9uLlwiKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5DU1ZQYXRocyk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuQ1NWUGF0aHMgPSB0ZXh0LmlucHV0RWwudmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRhdmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBjb25zdCBkdkRldGFpbHMgPSBzdWJEZXRhaWxzKFwiRGF0YXZpZXcgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZHZEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IERhdGF2aWV3IE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJCeSBkZWZhdWx0LCBEYXRhdmlldyBub3RlcyB1c2UgdGhlIGZpcnN0IGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMgKHVzdWFsbHkgYW4gPGNvZGU+XHUyMTkxPC9jb2RlPiBmaWVsZCkuIENob29zZSBhIGRpZmZlcmVudCBvbmUgdG8gdXNlIGJ5IGRlZmF1bHQsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgPGNvZGU+QkMtZGF0YXZpZXctbm90ZS1maWVsZDoge2ZpZWxkfTwvY29kZT4uPC9icj5JZiB5b3UgZG9uJ3Qgd2FudCB0byBjaG9vc2UgYSBkZWZhdWx0LCBzZWxlY3QgdGhlIGJsYW5rIG9wdGlvbiBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCkpO1xyXG4gICAgICBkZC5hZGRPcHRpb24oXCJcIiwgXCJcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZGF0YXZpZXdOb3RlRmllbGQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuZGF0YXZpZXdOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBjb25zdCBmaWVsZE9wdGlvbnMgPSB7IFwiXCI6IFwiXCIgfTtcclxuICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IChmaWVsZE9wdGlvbnNbZmllbGRdID0gZmllbGQpKTtcclxuXHJcbiAgY29uc3QgZGF0ZU5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcIkRhdGUgTm90ZXNcIiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGF0ZU5vdGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBZGQgRGF0ZSBOb3RlcyB0byBHcmFwaFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiQnJlYWRjcnVtYnMgd2lsbCB0cnkgdG8gbGluayBlYWNoIGRhaWx5IG5vdGUgdG8gdGhlIG5leHQgb25lIHVzaW5nIHRoZSBkYXRlIGZvcm1hdCB5b3UgcHJvdmlkZSBpbiB0aGUgc2V0dGluZ3MgYmVsb3cuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWRkRGF0ZU5vdGVzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5hZGREYXRlTm90ZXMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGFpbHkgTm90ZSBGb3JtYXRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgYFRoZSBMdXhvbiBkYXRlIGZvcm1hdCBvZiB5b3VyIGRhaWx5IG5vdGVzLjwvYnI+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBMdXhvbiB1c2VzIGRpZmZlcmVudCBmb3JtYXRzIHRvIE1vbWVudCwgc28geW91ciBmb3JtYXQgZm9yIHRoZSBEYWlseSBOb3RlcyBwbHVnaW4gbWF5IG5vdCB3b3JrIGhlcmUuIEJlIHN1cmUgdG8gY2hlY2sgb3V0IDxhIGhyZWY9XCJodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9mb3JtYXR0aW5nP2lkPXRhYmxlLW9mLXRva2Vuc1wiPnRoZSBkb2NzPC9hPiB0byBmaW5kIHRoZSByaWdodCBmb3JtYXQuPGJyPllvdSBjYW4gZXNjYXBlIGNoYXJhY3RlcnMgYnkgd3JhcHBpbmcgdGhlbSBpbiBzaW5nbGUgcXVvdGVzIChlLmcuIDxjb2RlPnl5eXktTU0tZGQgJ0RhaWx5IE5vdGUnPC9jb2RlPilgXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZU5vdGVGb3JtYXQpO1xyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmRhdGVOb3RlRm9ybWF0ID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRhdGUgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlNlbGVjdCBhIGZpZWxkIHRvIHBvaW50IHRvIHRvbW9ycm93J3Mgbm90ZSBmcm9tIHRoZSBjdXJyZW50IG5vdGUuIFRoZSBvcHBvc2l0ZSBmaWVsZCB3aWxsIGJlIHVzZWQgdG8gcG9pbnQgdG8geWVzdGVyZGF5J3Mgbm90ZS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucylcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZGF0ZU5vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5kYXRlTm90ZUZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAvLyBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgLy8gICAuc2V0TmFtZShcIlBvaW50IHVwIHRvIE1vbnRoXCIpXHJcbiAgLy8gICAuc2V0RGVzYyhcclxuICAvLyAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gIC8vICAgICAgIFwiU2VsZWN0IGEgZmllbGQgdG8gcG9pbnQgdXB3YXJkcyB0byB0aGUgY29ycmVzcG9uZGluZyBtb250aCAoVGhpcyB3aWxsIHN0aWxsIHdvcmsgaWYgYSBub3RlIGRvZXNuJ3QgZXhpc3QgZm9yIHRoYXQgbW9udGgpLjxicj5MZWF2ZSB0aGUgZHJvcGRvd24gYmxhbmsgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuXCJcclxuICAvLyAgICAgKVxyXG4gIC8vICAgKVxyXG4gIC8vICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAvLyAgICAgZGQuYWRkT3B0aW9ucyhmaWVsZE9wdGlvbnMpO1xyXG4gIC8vICAgICBkZC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAvLyAgICAgICBzZXR0aW5ncy5kYXRlTm90ZUFkZE1vbnRoID0gZmllbGQ7XHJcbiAgLy8gICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gIC8vICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0pO1xyXG4gIC8vIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAvLyAgIC5zZXROYW1lKFwiUG9pbnQgdXAgdG8gWWVhclwiKVxyXG4gIC8vICAgLnNldERlc2MoXHJcbiAgLy8gICAgIGZyYWdXaXRoSFRNTChcclxuICAvLyAgICAgICBcIlNlbGVjdCBhIGZpZWxkIHRvIHBvaW50IHVwd2FyZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgeWVhciAoVGhpcyB3aWxsIHN0aWxsIHdvcmsgaWYgYSBub3RlIGRvZXNuJ3QgZXhpc3QgZm9yIHRoYXQgeWVhcikuPGJyPkxlYXZlIHRoZSBkcm9wZG93biBibGFuayB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cIlxyXG4gIC8vICAgICApXHJcbiAgLy8gICApXHJcbiAgLy8gICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gIC8vICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucyk7XHJcbiAgLy8gICAgIGRkLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gIC8vICAgICAgIHNldHRpbmdzLmRhdGVOb3RlQWRkWWVhciA9IGZpZWxkO1xyXG4gIC8vICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAvLyAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IGxvZyBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IERlYnVnTGV2ZWwgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBkZXRhaWxzLCBmcmFnV2l0aEhUTUwgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZWJ1Z2dpbmdzU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGRlYnVnRGV0YWlscyA9IGRldGFpbHMoXCJEZWJ1Z2dpbmdcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBuZXcgU2V0dGluZyhkZWJ1Z0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlYnVnIE1vZGVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTZXQgdGhlIG1pbmltdW0gbGV2ZWwgb2YgZGVidWcgbWVzc2FnZXMgdG8gY29uc29sZSBsb2cuIElmIHlvdSBjaG9vc2UgPGNvZGU+VFJBQ0U8L2NvZGU+LCB0aGVuIGV2ZXJ5dGhpbmcgd2lsbCBiZSBsb2dnZWQuIElmIHlvdSBjaG9vc2UgPGNvZGU+RVJST1I8L2NvZGU+LCB0aGVuIG9ubHkgdGhlIG1vc3QgbmVjZXNzYXJ5IGlzc3VlcyB3aWxsIGJlIGxvZ2dlZC4gPGNvZGU+U0lMRU5UPC9jb2RlPiB3aWxsIHR1cm4gb2ZmIGFsbCBsb2dzLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQpID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMobG9nLmxldmVscykuZm9yRWFjaCgoa2V5KSA9PiBkZC5hZGRPcHRpb24oa2V5LCBrZXkpKTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MuZGVidWdNb2RlKS5vbkNoYW5nZShhc3luYyAodmFsdWU6IERlYnVnTGV2ZWwpID0+IHtcclxuICAgICAgICBsb2cuc2V0TGV2ZWwodmFsdWUpO1xyXG4gICAgICAgIHNldHRpbmdzLmRlYnVnTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgZGVidWdEZXRhaWxzLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHsgdGV4dDogXCJDb25zb2xlIGxvZyBzZXR0aW5nc1wiIH0sIChlbCkgPT4ge1xyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IGNvbnNvbGUubG9nKHNldHRpbmdzKSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBOb3RpY2UsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTLCBNQVRSSVhfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gIGNvbnN0IGRlbmRyb25EZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiRGVuZHJvbiBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGVuZHJvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkFkZCBEZW5kcm9uIG5vdGVzIHRvIGdyYXBoXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiRGVuZHJvbiBub3RlcyBjcmVhdGUgYSBoaWVyYXJjaHkgdXNpbmcgbm90ZSBuYW1lcy48L2JyPjxjb2RlPm5tYXRoLmFsZ2VicmE8L2NvZGU+IGlzIGEgbm90ZSBhYm91dCBhbGdlYnJhLCB3aG9zZSBwYXJlbnQgaXMgPGNvZGU+bWF0aDwvY29kZT4uPC9icj48Y29kZT5ubWF0aC5jYWxjdWx1cy5saW1pdHM8L2NvZGU+IGlzIGEgbm90ZSBhYm91dCBsaW1pdHMgd2hvc2UgcGFyZW50IGlzIHRoZSBub3RlIDxjb2RlPm1hdGguY2FsY3VsdXM8L2NvZGU+LCB0aGUgcGFyZW50IG9mIHdoaWNoIGlzIDxjb2RlPm1hdGg8L2NvZGU+LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmFkZERlbmRyb25Ob3Rlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWRkRGVuZHJvbk5vdGVzID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICBuZXcgU2V0dGluZyhkZW5kcm9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVsaW1pdGVyXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiV2hpY2ggZGVsaW1pdGVyIHNob3VsZCBCcmVhZGNydW1icyBsb29rIGZvcj8gVGhlIGRlZmF1bHQgaXMgPGNvZGU+LjwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkRlbGltaXRlclwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmICh2YWx1ZSkgc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIgPSB2YWx1ZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoYFRoZSBkZWxpbWl0ZXIgY2FuJ3QgYmUgYmxhbmtgKTtcclxuICAgICAgICAgIHNldHRpbmdzLmRlbmRyb25Ob3RlRGVsaW1pdGVyID0gREVGQVVMVF9TRVRUSU5HUy5kZW5kcm9uTm90ZURlbGltaXRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJUcmltIERlbmRyb24gTm90ZSBOYW1lc1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoZW4gZGlzcGxheWluZyBhIGRlbmRyb24gbm90ZSBuYW1lLCBzaG91bGQgaXQgYmUgdHJpbW1lZCB0byBvbmx5IHNob3cgdGhlIGxhc3QgaXRlbSBpbiB0aGUgY2hhaW4/PC9icj5lLmcuIDxjb2RlPkEuQi5DPC9jb2RlPiBcdTIxOTIgPGNvZGU+QzwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MudHJpbURlbmRyb25Ob3Rlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MudHJpbURlbmRyb25Ob3RlcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZW5kcm9uIE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFwiV2hpY2ggZmllbGQgc2hvdWxkIEJyZWFkY3J1bWJzIHVzZSBmb3IgRGVuZHJvbiBub3Rlcz9cIilcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCkpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5kZW5kcm9uTm90ZUZpZWxkKTtcclxuXHJcbiAgICAgIGRkLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmRlbmRyb25Ob3RlRmllbGQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHsgZGV0YWlscywgZnJhZ1dpdGhIVE1MIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkR2VuZXJhbFNldHRpbmdzKHBsdWdpbjogQkNQbHVnaW4sIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBnZW5lcmFsRGV0YWlscyA9IGRldGFpbHMoXCJHZW5lcmFsIE9wdGlvbnNcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiUmVmcmVzaCBJbmRleCBvbiBOb3RlIENoYW5nZVwiKVxyXG4gICAgLnNldERlc2MoZnJhZ1dpdGhIVE1MKFxyXG4gICAgICBcIlJlZnJlc2ggdGhlIEJyZWFkY3J1bWJzIGluZGV4IGRhdGEgZXZlcnl0aW1lIHlvdSBjaGFuZ2Ugbm90ZXMuPC9icj48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgY2FuIGJlIHZlcnkgc2xvdyBvbiBsYXJnZSB2YXVsdHMuXCIpXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5yZWZyZXNoT25Ob3RlQ2hhbmdlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5yZWZyZXNoT25Ob3RlQ2hhbmdlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlZnJlc2ggSW5kZXggT24gTm90ZSBTYXZlXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5yZWZyZXNoT25Ob3RlU2F2ZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MucmVmcmVzaE9uTm90ZVNhdmUgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBSZWZyZXNoIEluZGV4IE5vdGljZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiBSZWZyZXNoaW5nIEluZGV4LCBzaG91bGQgaXQgc2hvdyBhIG5vdGljZSBvbmNlIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGU/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dSZWZyZXNoTm90aWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93UmVmcmVzaE5vdGljZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJBbGlhcyBGaWVsZHNcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZpZWxkcyB1c2VkIHRvIHNwZWNpZnkgYWxpYXNlcy4gVGhlc2UgZmllbGRzIHdpbGwgYmUgY2hlY2tlZCwgaW4gb3JkZXIsIHRvIGRpc3BsYXkgYW4gYWx0ZXJuYXRlIG5vdGUgdGl0bGUgaW4gZGlmZmVyZW50IHZpZXdzLjwvYnI+VGhpcyBmaWVsZCB3aWxsIHByb2JhYmx5IGJlIDxjb2RlPmFsaWFzPC9jb2RlPiBvciA8Y29kZT5hbGlhc2VzPC9jb2RlPiwgYnV0IGl0IGNhbiBiZSBhbnl0aGluZywgbGlrZSA8Y29kZT50aXRsZTwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5hbHRMaW5rRmllbGRzLmpvaW4oXCIsIFwiKSk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWx0TGlua0ZpZWxkcyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT25seSBzaG93IGZpcnN0IGFsaWFzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJJZiBhIG5vdGUgaGFzIGFuIGFsaWFzICh1c2luZyB0aGUgZmllbGRzIGluIHRoZSBzZXR0aW5nIGFib3ZlKSwgc2hvdWxkIG9ubHkgdGhlIGZpcnN0IG9uZSBiZSBzaG93bj9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoIXNldHRpbmdzLnNob3dBbGxBbGlhc2VzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QWxsQWxpYXNlcyA9ICF2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiVXNlIHlhbWwgb3IgaW5saW5lIGZpZWxkcyBmb3IgaGllcmFyY2h5IGRhdGFcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIGVuYWJsZWQsIEJyZWFkY3J1bWJzIHdpbGwgbWFrZSBpdCdzIGhpZXJhcmNoeSB1c2luZyB5YW1sIGZpZWxkcywgYW5kIGlubGluZSBEYXRhdmlldyBmaWVsZHMuXFxuSWYgdGhpcyBpcyBkaXNhYmxlZCwgaXQgd2lsbCBvbmx5IHVzZSBKdWdnbCBsaW5rcyAoU2VlIGJlbG93KS5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MudXNlQWxsTWV0YWRhdGEpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnVzZUFsbE1ldGFkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlVzZSBKdWdnbCBsaW5rIHN5bnRheCB3aXRob3V0IGhhdmluZyBKdWdnbCBpbnN0YWxsZWQuXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgICdTaG91bGQgQnJlYWRjcnVtYnMgbG9vayBmb3IgPGEgaHJlZj1cImh0dHBzOi8vanVnZ2wuaW8vTGluaytUeXBlc1wiIGFyaWEtbGFiZWw9XCJodHRwczovL2p1Z2dsLmlvL0xpbmsrVHlwZXNcIj5KdWdnbCBsaW5rczwvYT4gZXZlbiBpZiB5b3UgZG9uXFwndCBoYXZlIEp1Z2dsIGluc3RhbGxlZD8gSWYgeW91IGRvIGhhdmUgSnVnZ2wgaW5zdGFsbGVkLCBpdCB3aWxsIGFsd2F5cyBsb29rIGZvciBKdWdnbCBsaW5rcy4nXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5wYXJzZUp1Z2dsTGlua3NXaXRob3V0SnVnZ2wgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgRmllbGQgU3VnZ2VzdG9yXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgICdBbG90IG9mIEJyZWFkY3J1bWJzIGZlYXR1cmVzIHJlcXVpcmUgYSBtZXRhZGF0YSAob3IgaW5saW5lIERhdGF2aWV3KSBmaWVsZCB0byB3b3JrLiBGb3IgZXhhbXBsZSwgYEJDLWZvbGRlci1ub3RlYC48L2JyPlRoZSBGaWVsZCBTdWdnZXN0b3Igd2lsbCBzaG93IGFuIGF1dG9jb21wbGV0ZSBtZW51IHdpdGggYWxsIGF2YWlsYWJsZSBCcmVhZGNydW1icyBmaWVsZCBvcHRpb25zIHdoZW4geW91IHR5cGUgPGNvZGU+QkMtPC9jb2RlPiBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLidcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuZmllbGRTdWdnZXN0b3IpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmZpZWxkU3VnZ2VzdG9yID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRW5hYmxlIFJlbGF0aW9uIFN1Z2dlc3RvclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkVuYWJsZSBhbiBlZGl0b3Igc3VnZ2VzdG9yIHdoaWNoIGdldHMgdHJpZ2dlcmVkIGJ5IGEgY3VzdG9tIHN0cmluZyB0byBzaG93IGEgbGlzdCBvZiByZWxhdGlvbnMgZnJvbSB5b3VyIGhpZXJhcmNoaWVzIHRvIGluc2VydC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5lbmFibGVSZWxhdGlvblN1Z2dlc3RvcilcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5lbmFibGVSZWxhdGlvblN1Z2dlc3RvciA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJSZWxhdGlvbiBTdWdnZXN0b3IgVHJpZ2dlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlRoZSBzdHJpbmcgdXNlZCB0byB0cmlnZ2VyIHRoZSByZWxhdGlvbiBzdWdnZXN0b3IuIERlZmF1bHQgaXMgPGNvZGU+XFxcXDwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MucmVsU3VnZ2VzdG9yVHJpZ2dlciA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIGlmIChhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3ICE9PSB1bmRlZmluZWQpIHtcclxuICAgIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgICAuc2V0TmFtZShcIkRhdGF2aWV3IFdhaXQgVGltZVwiKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICAnRW50ZXIgYW4gaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgRGF0YXZpZXcgSW5kZXggdG8gbG9hZC4gVGhlIGxhcmdlciB5b3VyIHZhdWx0LCB0aGUgbG9uZ2VyIGl0IHdpbGwgdGFrZS4gVGhlIGRlZmF1bHQgaXMgNSBzZWNvbmRzLidcclxuICAgICAgKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJTZWNvbmRzXCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoKHNldHRpbmdzLmR2V2FpdFRpbWUgLyAxMDAwKS50b1N0cmluZygpKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG51bSA+IDApIHtcclxuICAgICAgICAgICAgICBzZXR0aW5ncy5kdldhaXRUaW1lID0gbnVtICogMTAwMDtcclxuICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbmV3IE5vdGljZShcIlRoZSBpbnRlcnZhbCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhpZXJhcmNoeU5vdGVTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBoaWVyYXJjaHlOb3RlRGV0YWlscyA9IHN1YkRldGFpbHMoXHJcbiAgICBcIkhpZXJhcmNoeSBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkhpZXJhcmNoeSBOb3RlKHMpXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBub3RlcyB1c2VkIHRvIGNyZWF0ZSBleHRlcm5hbCBCcmVhZGNydW1iIHN0cnVjdHVyZXMuPGJyPllvdSBjYW4gYWxzbyBwb2ludCB0byBhIDxlbT5mb2xkZXI8L2VtPiBvZiBoaWVyYXJjaHkgbm90ZXMgYnkgZW50ZXJpbmcgPGNvZGU+Zm9sZGVyTmFtZS88L2NvZGU+IChlbmRpbmcgd2l0aCBhIDxjb2RlPi88L2NvZGU+KS48YnI+SGllcmFyY2h5IG5vdGUgbmFtZXMgYW5kIGZvbGRlcnMgb2YgaGllcmFyY2h5IG5vdGVzIGNhbiBib3RoIGJlIGVudGVyZWQgaW4gdGhlIHNhbWUgY29tbWEtc2VwYXJhdGVkIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIkhpZXJhcmNoeSBOb3RlKHMpXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmhpZXJhcmNoeU5vdGVzLmpvaW4oXCIsIFwiKSk7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG5cclxuICAgICAgICBzZXR0aW5ncy5oaWVyYXJjaHlOb3RlcyA9IHNwbGl0cztcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZSgnSGllcmFyY2h5IG5vdGUgaXMgcGFyZW50IG9mIHRvcC1sZXZlbCBpdGVtcycpXHJcbiAgICAuc2V0RGVzYygnU2hvdWxkIHRoZSBhY3R1YWwgaGllcmFyY2h5IG5vdGUgYmUgdHJlYXRlZCBhcyB0aGUgcGFyZW50IG9mIGFsbCB0aGUgdG9wLWxldmVsIGl0ZW1zIGluIHRoZSBsaXN0PyBcdTI3MDUgPSBZZXMsIFx1Mjc0QyA9IE5vJylcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuaGllcmFyY2h5Tm90ZUlzUGFyZW50KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmhpZXJhcmNoeU5vdGVJc1BhcmVudCA9IHZhbHVlXHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxuXHJcbiAgbmV3IFNldHRpbmcoaGllcmFyY2h5Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgSGllcmFyY2h5IE5vdGUgRmllbGRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJCeSBkZWZhdWx0LCBoaWVyYXJjaHkgbm90ZXMgdXNlIHRoZSBmaXJzdCA8Y29kZT51cDwvY29kZT4gZmllbGQgaW4geW91ciBoaWVyYXJjaGllcy4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdC4gSWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBjb25zdCB1cEZpZWxkcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMsIFwidXBcIik7XHJcblxyXG4gICAgICBjb25zdCBvcHRpb25zID0ge307XHJcbiAgICAgIHVwRmllbGRzLmZvckVhY2goXHJcbiAgICAgICAgKGZpZWxkKSA9PiAob3B0aW9uc1tmaWVsZF0gPSBmaWVsZClcclxuICAgICAgKTtcclxuICAgICAgZGQuYWRkT3B0aW9ucyhvcHRpb25zKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ITlVwRmllbGQgfHwgdXBGaWVsZHNbMF0pXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuSE5VcEZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG4gIGltcG9ydCBGYUxpc3RVbCBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhTGlzdFVsLnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCBGYVBsdXMgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVBsdXMuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IEZhUmVnVHJhc2hBbHQgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVJlZ1RyYXNoQWx0LnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIGJsYW5rVXNlckhpZXIsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBVc2VySGllciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgeyBzcGxpdEFuZFRyaW0sIHN3YXBJdGVtcyB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBoaWVyVG9TdHIgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcblxyXG4gIGxldCBjdXJySGllcnMgPSBbLi4ucGx1Z2luLnNldHRpbmdzLnVzZXJIaWVyc107XHJcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKGN1cnJIaWVyczogVXNlckhpZXJbXSkge1xyXG4gICAgcGx1Z2luLnNldHRpbmdzLnVzZXJIaWVycyA9IGN1cnJIaWVycztcclxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtQnV0dG9uc1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBhcmlhLWxhYmVsPVwiQWRkIE5ldyBIaWVyYXJjaHlcIlxyXG4gICAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4gKGN1cnJIaWVycyA9IFsuLi5jdXJySGllcnMsIGJsYW5rVXNlckhpZXIoKV0pfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYVBsdXMgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgYXJpYS1sYWJlbD1cIlJlc2V0IEFsbCBIaWVyYXJjaGllc1wiXHJcbiAgICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IGFsbCBoaWVyYXJjaGllcz9cIikpIHtcclxuICAgICAgICAgIGN1cnJIaWVycyA9IFtdO1xyXG4gICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9fVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYVJlZ1RyYXNoQWx0IC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJTaG93IEhpZXJhcmNoaWVzXCJcclxuICAgICAgb246Y2xpY2s9eygpID0+IG5ldyBOb3RpY2UoY3VyckhpZXJzLm1hcChoaWVyVG9TdHIpLmpvaW4oXCJcXG5cXG5cIikpfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxGYUxpc3RVbCAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICB7I2VhY2ggY3VyckhpZXJzIGFzIGhpZXIsIGl9XHJcbiAgICA8ZGV0YWlscyBjbGFzcz1cIkJDLUhpZXItRGV0YWlsc1wiPlxyXG4gICAgICA8c3VtbWFyeT5cclxuICAgICAgICB7RElSRUNUSU9OUy5tYXAoKGRpcikgPT4gaGllcltkaXJdPy5qb2luKFwiLCBcIikgPz8gXCJcIilcclxuICAgICAgICAgIC5tYXAoKGRpckZpZWxkcykgPT4gYCgke2RpckZpZWxkc30pYClcclxuICAgICAgICAgIC5qb2luKFwiIFwiKX1cclxuXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJCQy1CdXR0b25zXCI+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2FwIHdpdGggSGllcmFyY2h5IEFib3ZlXCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBzd2FwSXRlbXMoaSwgaSAtIDEsIGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFx1MjE5MVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTd2FwIHdpdGggSGllcmFyY2h5IEJlbG93XCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBzd2FwSXRlbXMoaSwgaSArIDEsIGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFx1MjE5M1xyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgSGllcmFyY2h5XCJcclxuICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvbGRIaWVyID0gY3VyckhpZXJzLnNwbGljZShpLCAxKVswXTtcclxuICAgICAgICAgICAgICBvbGRIaWVyLnVwLmZvckVhY2goKHVwRmllbGQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMuaW5kZXhPZih1cEZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBESVJFQ1RJT05TLmZvckVhY2goKGRpcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2xkSGllcltkaXJdLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4SSA9IHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuaW5kZXhPZihmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleEkgPiAtMSlcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdEp1bXBUb0ZpcnN0RmllbGRzLnNwbGljZShpbmRleEksIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhKID0gc2V0dGluZ3MubGltaXRXcml0ZUJDQ2hlY2tib3hlcy5pbmRleE9mKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SiA+IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuc3BsaWNlKGluZGV4SiwgMSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgY3VyckhpZXJzID0gY3VyckhpZXJzO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZShjdXJySGllcnMpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBYXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvc3VtbWFyeT5cclxuICAgICAgeyNlYWNoIERJUkVDVElPTlMgYXMgZGlyfVxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJCQy1BcnJvdy1MYWJlbFwiIGZvcj17ZGlyfT5cclxuICAgICAgICAgICAge0FSUk9XX0RJUkVDVElPTlNbZGlyXX1cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBzaXplPVwiMjBcIlxyXG4gICAgICAgICAgICBuYW1lPXtkaXJ9XHJcbiAgICAgICAgICAgIHZhbHVlPXtoaWVyW2Rpcl0/LmpvaW4oXCIsIFwiKSA/PyBcIlwifVxyXG4gICAgICAgICAgICBvbjpjaGFuZ2U9e2FzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBbmRUcmltKHZhbHVlKTtcclxuICAgICAgICAgICAgICBjdXJySGllcnNbaV1bZGlyXSA9IHNwbGl0cztcclxuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGUoY3VyckhpZXJzKTtcclxuXHJcbiAgICAgICAgICAgICAgc3BsaXRzLmZvckVhY2goKHNwbGl0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgIGRpciA9PT0gXCJ1cFwiICYmXHJcbiAgICAgICAgICAgICAgICAgICFzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5pbmNsdWRlcyhzcGxpdClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMucHVzaChzcGxpdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuaW5jbHVkZXMoc3BsaXQpKVxyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdEp1bXBUb0ZpcnN0RmllbGRzLnB1c2goc3BsaXQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5saW1pdFdyaXRlQkNDaGVja2JveGVzLmluY2x1ZGVzKHNwbGl0KSlcclxuICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRXcml0ZUJDQ2hlY2tib3hlcy5wdXNoKHNwbGl0KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2VhY2h9XHJcbiAgICA8L2RldGFpbHM+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICBsYWJlbC5CQy1BcnJvdy1MYWJlbCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB3aWR0aDogMjBweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuICBkaXYuQkMtQnV0dG9ucyB7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xyXG4gIH1cclxuXHJcbiAgZGV0YWlscy5CQy1IaWVyLURldGFpbHMge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIHBhZGRpbmc6IDEwcHggNXB4IDEwcHggMTBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XHJcbiAgfVxyXG4gIC5CQy1IaWVyLURldGFpbHMgc3VtbWFyeTo6bWFya2VyIHtcclxuICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICB9XHJcblxyXG4gIC5CQy1IaWVyLURldGFpbHMgc3VtbWFyeSBidXR0b24ge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDNweDtcclxuICAgIHdpZHRoOiAxN3B4O1xyXG4gICAgaGVpZ2h0OiAxN3B4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgIjxzY3JpcHQ+XG4gIGV4cG9ydCBsZXQgdGl0bGUgPSBudWxsO1xuICBleHBvcnQgbGV0IHZpZXdCb3g7XG48L3NjcmlwdD5cblxuPHN0eWxlPlxuICBzdmcge1xuICAgIHN0cm9rZTogY3VycmVudENvbG9yO1xuICAgIGZpbGw6IGN1cnJlbnRDb2xvcjtcbiAgICBzdHJva2Utd2lkdGg6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH0gIFxuPC9zdHlsZT5cblxuPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIge3ZpZXdCb3h9PlxuICB7I2lmIHRpdGxlfVxuICAgIDx0aXRsZT57dGl0bGV9PC90aXRsZT5cbiAgey9pZn1cbiAgPHNsb3QgLz5cbjwvc3ZnPlxuIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA1MTIgNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDggNDhhNDggNDggMCAxIDAgNDggNDggNDggNDggMCAwIDAtNDgtNDh6bTAgMTYwYTQ4IDQ4IDAgMSAwIDQ4IDQ4IDQ4IDQ4IDAgMCAwLTQ4LTQ4em0wIDE2MGE0OCA0OCAwIDEgMCA0OCA0OCA0OCA0OCAwIDAgMC00OC00OHptNDQ4IDE2SDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZ2LTMyYTE2IDE2IDAgMCAwLTE2LTE2em0wLTMyMEgxNzZhMTYgMTYgMCAwIDAtMTYgMTZ2MzJhMTYgMTYgMCAwIDAgMTYgMTZoMzIwYTE2IDE2IDAgMCAwIDE2LTE2VjgwYTE2IDE2IDAgMCAwLTE2LTE2em0wIDE2MEgxNzZhMTYgMTYgMCAwIDAtMTYgMTZ2MzJhMTYgMTYgMCAwIDAgMTYgMTZoMzIwYTE2IDE2IDAgMCAwIDE2LTE2di0zMmExNiAxNiAwIDAgMC0xNi0xNnpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA0NDggNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDE2IDIwOEgyNzJWNjRjMC0xNy42Ny0xNC4zMy0zMi0zMi0zMmgtMzJjLTE3LjY3IDAtMzIgMTQuMzMtMzIgMzJ2MTQ0SDMyYy0xNy42NyAwLTMyIDE0LjMzLTMyIDMydjMyYzAgMTcuNjcgMTQuMzMgMzIgMzIgMzJoMTQ0djE0NGMwIDE3LjY3IDE0LjMzIDMyIDMyIDMyaDMyYzE3LjY3IDAgMzItMTQuMzMgMzItMzJWMzA0aDE0NGMxNy42NyAwIDMyLTE0LjMzIDMyLTMydi0zMmMwLTE3LjY3LTE0LjMzLTMyLTMyLTMyelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk0yNjggNDE2aDI0YTEyIDEyIDAgMCAwIDEyLTEyVjE4OGExMiAxMiAwIDAgMC0xMi0xMmgtMjRhMTIgMTIgMCAwIDAtMTIgMTJ2MjE2YTEyIDEyIDAgMCAwIDEyIDEyek00MzIgODBoLTgyLjQxbC0zNC01Ni43QTQ4IDQ4IDAgMCAwIDI3NC40MSAwSDE3My41OWE0OCA0OCAwIDAgMC00MS4xNiAyMy4zTDk4LjQxIDgwSDE2QTE2IDE2IDAgMCAwIDAgOTZ2MTZhMTYgMTYgMCAwIDAgMTYgMTZoMTZ2MzM2YTQ4IDQ4IDAgMCAwIDQ4IDQ4aDI4OGE0OCA0OCAwIDAgMCA0OC00OFYxMjhoMTZhMTYgMTYgMCAwIDAgMTYtMTZWOTZhMTYgMTYgMCAwIDAtMTYtMTZ6TTE3MS44NCA1MC45MUE2IDYgMCAwIDEgMTc3IDQ4aDk0YTYgNiAwIDAgMSA1LjE1IDIuOTFMMjkzLjYxIDgwSDE1NC4zOXpNMzY4IDQ2NEg4MFYxMjhoMjg4em0tMjEyLTQ4aDI0YTEyIDEyIDAgMCAwIDEyLTEyVjE4OGExMiAxMiAwIDAgMC0xMi0xMmgtMjRhMTIgMTIgMCAwIDAtMTIgMTJ2MjE2YTEyIDEyIDAgMCAwIDEyIDEyelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiaW1wb3J0IFVzZXJIaWVyYXJjaGllcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9Vc2VySGllcmFyY2hpZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRIaWVyYXJjaHlTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCBmaWVsZERldGFpbHMgPSBkZXRhaWxzKFwiSGllcmFyY2hpZXNcIiwgY29udGFpbmVyRWwpO1xyXG5cclxuICBmaWVsZERldGFpbHMuY3JlYXRlRWwoXCJwXCIsIHtcclxuICAgIHRleHQ6IFwiSGVyZSB5b3UgY2FuIHNldCB1cCBkaWZmZXJlbnQgaGllcmFyY2hpZXMgeW91IHVzZSBpbiB5b3VyIHZhdWx0LiBUbyBhZGQgYSBuZXcgaGllcmFyY2h5LCBjbGljayB0aGUgcGx1cyBidXR0b24uIFRoZW4sIGZpbGwgaW4gdGhlIGZpZWxkIG5hbWVzIG9mIHlvdXIgaGllcmFjaHkgaW50byB0aGUgNSBib3hlcyB0aGF0IGFwcGVhci5cIixcclxuICB9KTtcclxuICBmaWVsZERldGFpbHMuY3JlYXRlRWwoXCJwXCIsIHtcclxuICAgIHRleHQ6IFwiRm9yIGVhY2ggZGlyZWN0aW9uLCB5b3UgY2FuIGVudGVyIG11bHRpcGxlIGZpZWxkIG5hbWVzIGluIGEgY29tbWEtc2VwZXJhdGVkIGxpc3QuIEZvciBleGFtcGxlOiBgcGFyZW50LCBicm9hZGVyLCB1cHBlcmBcIixcclxuICB9KTtcclxuXHJcbiAgbmV3IFVzZXJIaWVyYXJjaGllcyh7XHJcbiAgICB0YXJnZXQ6IGZpZWxkRGV0YWlscyxcclxuICAgIHByb3BzOiB7IHBsdWdpbiB9LFxyXG4gIH0pO1xyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgc2V0dGluZ05hbWU6IHN0cmluZztcclxuICBleHBvcnQgbGV0IG9wdGlvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcblxyXG4gIGxldCBzZWxlY3RlZCA9IHNldHRpbmdzW3NldHRpbmdOYW1lXTtcclxuXHJcbiAgJDogdG9Ob25lID0gc2VsZWN0ZWQubGVuZ3RoID09PSAwID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICBhc3luYyBmdW5jdGlvbiBzYXZlKCkge1xyXG4gICAgaWYgKHNldHRpbmdzW3NldHRpbmdOYW1lXSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICByZXR1cm4gd2FybihzZXR0aW5nTmFtZSArIFwiIG5vdCBmb3VuZCBpbiBCQyBzZXR0aW5nc1wiKTtcclxuXHJcbiAgICBzZXR0aW5nc1tzZXR0aW5nTmFtZV0gPSBzZWxlY3RlZDtcclxuICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIH1cclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2PlxyXG4gIDxidXR0b25cclxuICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmICh0b05vbmUpIHNlbGVjdGVkID0gW107XHJcbiAgICAgIGVsc2Ugc2VsZWN0ZWQgPSBvcHRpb25zO1xyXG4gICAgICBhd2FpdCBzYXZlKCk7XHJcbiAgICB9fVxyXG4gID5cclxuICAgIFNlbGVjdCB7dG9Ob25lID8gXCJOb25lXCIgOiBcIkFsbFwifVxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgeyNlYWNoIG9wdGlvbnMgYXMgb3B0aW9ufVxyXG4gICAgPGRpdj5cclxuICAgICAgPGxhYmVsPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIHZhbHVlPXtvcHRpb259XHJcbiAgICAgICAgICBiaW5kOmdyb3VwPXtzZWxlY3RlZH1cclxuICAgICAgICAgIG9uOmNoYW5nZT17YXN5bmMgKCkgPT4gYXdhaXQgc2F2ZSgpfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAge29wdGlvbn1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgLmdyaWQge1xyXG4gICAgZGlzcGxheTogZ3JpZDtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTAwcHgsIDFmcikpO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCBDaGVja2JveGVzIGZyb20gXCIuLi9Db21wb25lbnRzL0NoZWNrYm94ZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1bXBUb05leHRTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGp1bXBUb0RpckRldGFpbHMgPSBzdWJEZXRhaWxzKFwiSnVtcCB0byBOZXh0IERpcmVjdGlvblwiLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gIGp1bXBUb0RpckRldGFpbHMuY3JlYXRlRGl2KHsgY2xzOiAnc2V0dGluZy1pdGVtLW5hbWUnLCB0ZXh0OiAnTGltaXQgd2hpY2ggZmllbGRzIHRvIGp1bXAgdG8nIH0pXHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDoganVtcFRvRGlyRGV0YWlscyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIHBsdWdpbixcclxuICAgICAgc2V0dGluZ05hbWU6IFwibGltaXRKdW1wVG9GaXJzdEZpZWxkc1wiLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKSxcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBvcGVuVmlldyB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHsgTUFUUklYX1ZJRVcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuLi9WaWV3cy9NYXRyaXhWaWV3XCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1hdHJpeFZpZXdTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IE1MVmlld0RldGFpbHMgPSBzdWJEZXRhaWxzKFwiTWF0cml4IFZpZXdcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93IGFsbCBmaWVsZCBuYW1lcyBvciBqdXN0IHJlbGF0aW9uIHR5cGVzXCIpXHJcbiAgICAuc2V0RGVzYyhmcmFnV2l0aEhUTUwoXHJcbiAgICAgIFwiU2hvdyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBmaWVsZHMgZm9yIGVhY2ggcmVsYXRpb24gdHlwZSAoZS5nLiA8Y29kZT5wYXJlbnQsIGJyb2FkZXIsIHVwcGVyPC9jb2RlPiksIG9yIGp1c3QgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHR5cGUsIGkuZS4gJzxjb2RlPlBhcmVudDwvY29kZT4nLCAnPGNvZGU+U2libGluZzwvY29kZT4nLCAnPGNvZGU+Q2hpbGQ8L2NvZGU+Jy48L2JyPlx1MjcwNSA9IHNob3cgdGhlIGZ1bGwgbGlzdC5cIilcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dOYW1lT3JUeXBlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93TmFtZU9yVHlwZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgUmVsYXRpb25zaGlwIFR5cGVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTaG93IHdoZXRoZXIgYSBsaW5rIGlzIHJlYWwgb3IgaW1wbGllZC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93UmVsYXRpb25UeXBlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93UmVsYXRpb25UeXBlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGlyZWN0aW9ucyBPcmRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgQ2hhbmdlIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlyZWN0aW9ucyBhcHBlYXIgaW4gdGhlIE1hdHJpeCB2aWV3LjwvYnI+VGhlIGRlZmF1bHQgaXMgXCJ1cCwgc2FtZSwgZG93biwgbmV4dCwgcHJldlwiICg8Y29kZT4wMTIzNDwvY29kZT4pLlxyXG4gICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICA8bGk+MCBcdTIxOTIgdXA8L2xpPlxyXG4gICAgICAgICAgICA8bGk+MSBcdTIxOTIgc2FtZTwvbGk+XHJcbiAgICAgICAgICAgIDxsaT4yIFx1MjE5MiBkb3duPC9saT5cclxuICAgICAgICAgICAgPGxpPjMgXHUyMTkyIG5leHQ8L2xpPlxyXG4gICAgICAgICAgICA8bGk+NCBcdTIxOTIgcHJldjwvbGk+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgY2FuIHJlbW92ZSBudW1iZXJzIHRvIGhpZGUgdGhvc2UgZGlyZWN0aW9ucyBpbiB0aGUgTWF0cml4IFZpZXcuIEZvciBleGFtcGxlLCA8Y29kZT4wMjwvY29kZT4gd2lsbCBvbmx5IHNob3cgdXAgYW5kIGRvd24sIGluIHRoYXQgb3JkZXIuYFxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLnNxdWFyZURpcmVjdGlvbnNPcmRlci5qb2luKFwiXCIpKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdChcIlwiKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPD0gNSAmJlxyXG4gICAgICAgICAgdmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gW1wiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIl0uaW5jbHVkZXModmFsdWUpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc3F1YXJlRGlyZWN0aW9uc09yZGVyID0gdmFsdWVzLm1hcCgob3JkZXIpID0+XHJcbiAgICAgICAgICAgIE51bWJlci5wYXJzZUludChvcmRlcilcclxuICAgICAgICAgICkgYXMgKDAgfCAxIHwgMiB8IDMgfCA0KVtdO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgICdUaGUgdmFsdWUgbXVzdCBiZSBhIDUgZGlnaXQgbnVtYmVyIHVzaW5nIG9ubHkgdGhlIGRpZ2l0cyBcIjBcIiwgXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCInXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgQWxwYWhlYnRpY2FsIFNvcnRpbmdcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIkJ5IGRlZmF1bHQsIGl0ZW1zIGluIHRoZSBNYXRyaXggdmlldyBhcmUgc29ydGVkIGJ5IHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB5b3VyIG5vdGVzLiBUb2dnbGUgdGhpcyBvbiB0byBlbmFibGUgYWxwaGFiZXRpY2FsIHNvcnRpbmcuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZUFscGhhU29ydCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZW5hYmxlQWxwaGFTb3J0ID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgLy8gVE9ETyBoaWRlIHRoaXMgc2V0dGluZyBpZiAhZW5hYmxlQWxwaGFTb3J0XHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU29ydCBBbHBoYWJldGljYWxseSBBc2NlbmRpbmcvRGVzY2VuZGluZ1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiU29ydCBzcXVhcmUgaXRlbXMgYWxwaGFiZXRpY2FsbHkgaW4gQXNjZW5kaW5nIChcdTI3MDUpIG9yIERlc2NlbmRpbmcgKFx1Mjc0Qykgb3JkZXIuXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLmFscGhhU29ydEFzYykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWxwaGFTb3J0QXNjID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU29ydCBieSBub3RlIG5hbWUsIGJ1dCBzaG93IGFsaWFzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJXaGVuIHRoaXMgaXMgdHVybmVkIG9mZiwgbm90ZXMgd2lsbCBmaXJzdCBiZSBzb3J0ZWQgYnkgdGhlaXIgYWxpYXMsIGFuZCB0aGVuIGJ5IHRoZWlyIG5hbWUgaWYgbm8gYWxpYXMgaXMgZm91bmQuIFR1cm4gdGhpcyBvbiB0byBzb3J0IGJ5IG5vdGUgbmFtZSBhbHdheXMsIGJ1dCBzdGlsbCBzaG93IHRoZSBhbGlhcyBpbiB0aGUgcmVzdWx0cy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc29ydEJ5TmFtZVNob3dBbGlhcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc29ydEJ5TmFtZVNob3dBbGlhcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgSW1wbGllZCBSZWxhdGlvbnNcIilcclxuICAgIC5zZXREZXNjKFwiV2hldGhlciBvciBub3QgdG8gc2hvdyBpbXBsaWVkIHJlbGF0aW9ucyBhdCBhbGwuXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93SW1wbGllZFJlbGF0aW9ucykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0ltcGxpZWRSZWxhdGlvbnMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAvLyBUT0RPIEkgZG9uJ3QgdGhpbmsgdGhpcyBzZXR0aW5nIHdvcmtzIGFueW1vcmUuIEkgcmVtb3ZlZCBpdCdzIGZ1bmN0aW9uYWxpdHkgd2hlbiBhZGRpbmcgbXVsdGlwbGUgaGllcmFyY2hpZXNcclxuICAvLyBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gIC8vICAgLnNldE5hbWUoXCJGaWx0ZXIgSW1wbGllZCBTaWJsaW5nc1wiKVxyXG4gIC8vICAgLnNldERlc2MoXHJcbiAgLy8gICAgIGZyYWdXaXRoSFRNTChcclxuICAvLyAgICAgICBgSW1wbGllZCBzaWJsaW5ncyBhcmU6XHJcbiAgLy8gICAgICAgICA8b2w+XHJcbiAgLy8gICAgICAgICAgIDxsaT5ub3RlcyB3aXRoIHRoZSBzYW1lIHBhcmVudCwgb3I8L2xpPlxyXG4gIC8vICAgICAgICAgICA8bGk+bm90ZXMgdGhhdCBhcmUgcmVhbCBzaWJsaW5ncy48L2xpPlxyXG4gIC8vICAgICAgICAgPC9vbD5cclxuICAvLyAgICAgICAgIFRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gdHlwZSAxIGltcGxpZWQgc2libGluZ3MuIElmIGVuYWJsZWQsIEJyZWFkY3J1bWJzIHdpbGwgZmlsdGVyIHR5cGUgMSBpbXBsaWVkIHNpYmxpbmdzIHNvIHRoYXQgdGhleSBub3Qgb25seSBzaGFyZSB0aGUgc2FtZSBwYXJlbnQsIGJ1dCB0aGUgcGFyZW50IHJlbGF0aW9uIGhhcyB0aGUgZXhhY3Qgc2FtZSB0eXBlLiBGb3IgZXhhbXBsZSwgdGhlIHR3byByZWFsIHJlbGF0aW9ucyA8Y29kZT5CIC1wYXJlbnQtPiBBPC9jb2RlPiwgYW5kIDxjb2RlPkMgLXBhcmVudC0+IEE8L2NvZGU+IGNyZWF0ZSBhbiBpbXBsaWVkIHNpYmxpbmcgYmV0d2VlbiBCIGFuZCBDICh0aGV5IGhhdmUgdGhlIHNhbWUgcGFyZW50LCBBKS4gVGhlIHR3byByZWFsIHJlbGF0aW9ucyA8Y29kZT5CIC1wYXJlbnQtPiBBPC9jb2RlPiwgYW5kIDxjb2RlPkMgLXVwLT4gQTwvY29kZT4gY3JlYXRlIGFuIGltcGxpZWQgc2libGluZyBiZXR3ZWVuIEIgYW5kIEMgKHRoZXkgYWxzbyBoYXZlIHRoZSBzYW1lIHBhcmVudCwgQSkuIEJ1dCBpZiB0aGlzIHNldHRpbmcgaXMgdHVybmVkIG9uLCB0aGUgc2Vjb25kIGltcGxpZWQgc2libGluZyB3b3VsZCBub3Qgc2hvdywgYmVjYXVzZSB0aGUgcGFyZW50IHR5cGVzIGFyZSBkaWZmZXJuZXQgKHBhcmVudCB2ZXJzdXMgdXApLmBcclxuICAvLyAgICAgKVxyXG4gIC8vICAgKVxyXG4gIC8vICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gIC8vICAgICB0b2dnbGVcclxuICAvLyAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlcylcclxuICAvLyAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgLy8gICAgICAgICBzZXR0aW5ncy5maWx0ZXJJbXBsaWVkU2libGluZ3NPZkRpZmZlcmVudFR5cGVzID0gdmFsdWU7XHJcbiAgLy8gICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgLy8gICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAvLyAgICAgICB9KVxyXG4gIC8vICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT3BlbiBWaWV3IGluIFJpZ2h0IG9yIExlZnQgc2lkZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiBsb2FkaW5nIHRoZSBtYXRyaXggdmlldywgc2hvdWxkIGl0IG9wZW4gb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBsZWFmPyBcdTI3MDUgPSBSaWdodCwgXHUyNzRDID0gTGVmdC5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MucmxMZWFmKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5ybExlYWYgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXBwLndvcmtzcGFjZS5kZXRhY2hMZWF2ZXNPZlR5cGUoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgIGF3YWl0IG9wZW5WaWV3KFxyXG4gICAgICAgICAgYXBwLFxyXG4gICAgICAgICAgTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgICBNYXRyaXhWaWV3LFxyXG4gICAgICAgICAgdmFsdWUgPyBcInJpZ2h0XCIgOiBcImxlZnRcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBOb3RpY2UsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBzdHJUb1JlZ2V4IH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vU3lzdGVtU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG5cclxuICBjb25zdCBub1N5c3RlbURldGFpbHMgPSBzdWJEZXRhaWxzKFxyXG4gICAgXCJOYW1pbmcgU3lzdGVtXCIsXHJcbiAgICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHNcclxuICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gUmVnZXhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJJZiB5b3UgbmFtZSB5b3VyIG5vdGVzIHVzaW5nIHRoZSBKb2hubnkgRGVjaW1hbCBTeXN0ZW0gb3IgYSByZWxhdGVkIHN5c3RlbSwgZW50ZXIgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgbmFtaW5nIHN5c3RlbSB5b3UgdXNlLiBUaGUgcmVnZXggc2hvdWxkIG9ubHkgbWF0Y2ggdGhlIG5hbWluZyBzeXN0ZW0gcGFydCBvZiB0aGUgbmFtZSwgbm90IHRoZSBhY3R1YWwgbm90ZSB0aXRsZS48L2JyPiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSB0aGUgSm9obm55IERlY2ltYWwgU3lzdGVtLCB5b3UgbWlnaHQgdXNlIDxjb2RlPi9eXFxcXGRcXFxcLlxcXFxkXFxcXC5cXFxcdy9nPC9jb2RlPiB0byBtYXRjaCB0aGUgbm90ZSBuYW1lZCA8Y29kZT4xLjIuYSBDYXJzPC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1SZWdleCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHN0clRvUmVnZXgodmFsdWUpKSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1SZWdleCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXCJJbnZhbGlkIFJlZ2V4XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKG5vU3lzdGVtRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmFtaW5nIFN5c3RlbSBEZWxpbWl0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJXaGF0IGNoYXJhY3RlciBkbyB5b3UgdXNlIHRvIHNwbGl0IHVwIHlvdXIgbmFtaW5nIGNvbnZlbnRpb24/IEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIDxjb2RlPjEuMi5hLmI8L2NvZGU+LCB0aGVuIHlvdXIgZGVsaW1pdGVyIGlzIGEgcGVyaW9kICg8Y29kZT4uPC9jb2RlPikuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1TcGxpdCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgc2V0dGluZ3MubmFtaW5nU3lzdGVtU3BsaXQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcobm9TeXN0ZW1EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJOYW1pbmcgU3lzdGVtIEZpZWxkXCIpXHJcbiAgICAuc2V0RGVzYyhcIldoaWNoIGZpZWxkIHNob3VsZCBCcmVhZGNydW1icyB1c2UgZm9yIE5hbWluZyBTeXN0ZW0gbm90ZXM/XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkKSA9PiB7XHJcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGRkLmFkZE9wdGlvbihmaWVsZCwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MubmFtaW5nU3lzdGVtRmllbGQpO1xyXG4gICAgICBkZC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1GaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gRW5kcyB3aXRoIERlbGltaXRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkRvZXMgeW91ciBuYW1pbmcgY29udmVudGlvbiBlbmQgd2l0aCB0aGUgZGVsaW1pdGVyPyBGb3IgZXhhbXBsZSwgPGNvZGU+MS4yLiBOb3RlPC9jb2RlPiBkb2VzIGVuZCB3aXRoIHRoZSBkZWxpbWl0ZXIsIGJ1dCA8Y29kZT4xLjIgTm90ZTwvY29kZT4gZG9lcyBub3QuPC9icj5Gb3IgbWF0Y2hpbmcgcHVycG9zZXMsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBuYW1lIHlvdXIgbm90ZXMgd2l0aCB0aGUgZGVsaW1pdGVyIG9uIHRoZSBlbmQuIE9ubHkgdHVybiB0aGlzIHNldHRpbmcgb24gaWYgeW91IGRvIG5hbWUgeW91ciBub3RlcyB0aGlzIHdheSwgYnV0IGtub3cgdGhhdCB0aGUgcmVzdWx0cyBtYXkgbm90IGJlIGFzIGFjY3VyYXRlIGlmIHlvdSBkb24ndC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+XHJcbiAgICAgIHRvZ1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1FbmRzV2l0aERlbGltaXRlcilcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1FbmRzV2l0aERlbGltaXRlciA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCByZWdleE5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiUmVnZXggTm90ZXNcIixcclxuICAgIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsc1xyXG4gICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlZ2V4Tm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgUmVnZXggTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIHJlZ2V4IG5vdGVzIHVzZSB0aGUgZmlyc3QgZmllbGQgaW4geW91ciBoaWVyYXJjaGllcyAodXN1YWxseSBhbiA8Y29kZT5cdTIxOTE8L2NvZGU+IGZpZWxkKS4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdCwgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSA8Y29kZT5CQy1yZWdleC1ub3RlLWZpZWxkOiB7ZmllbGR9PC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKS5mb3JFYWNoKFxyXG4gICAgICAgIChmaWVsZCkgPT4gKG9wdGlvbnNbZmllbGRdID0gZmllbGQpXHJcbiAgICAgICk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IFwiXCI6IFwiXCIgfSkpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlZ2V4Tm90ZUZpZWxkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnJlZ2V4Tm90ZUZpZWxkID0gZmllbGQ7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBkZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IE1hcmtkb3duUmVuZGVyZXIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWxhdGlvblNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCByZWxhdGlvbkRldGFpbHMgPSBkZXRhaWxzKFwiUmVsYXRpb25zaGlwc1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gIGZ1bmN0aW9uIG1lcm1haWREaWFncmFtKGRpYWdyYW1TdHI6IHN0cmluZykge1xyXG4gICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihcclxuICAgICAgZGlhZ3JhbVN0cixcclxuICAgICAgcmVsYXRpb25EZXRhaWxzLmNyZWF0ZURpdigpLFxyXG4gICAgICBcIlwiLFxyXG4gICAgICBudWxsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIHJlbGF0aW9uRGV0YWlscy5jcmVhdGVFbChcInBcIiwge1xyXG4gICAgdGV4dDogXCJIZXJlIHlvdSBjYW4gdG9nZ2xlIG9uL29mZiBkaWZmZXJlbnQgdHlwZXMgb2YgaW1wbGllZCByZWxhdGlvbnNoaXBzLiBBbGwgb2YgeW91ciBleHBsaWNpdCAocmVhbCkgcmVsYXRpb25zaGlwcyB3aWxsIHN0aWxsIHNob3csIGJ1dCB5b3UgY2FuIGNob29zZSB3aGljaCBpbXBsaWVkIG9uZXMgZ2V0IGZpbGxlZCBpbi5cXG5BbGwgaW1wbGllZCByZWxhdGlvbnNoaXBzIGFyZSBnaXZlbiBhIENTUyBjbGFzcyBvZiB0aGUgdHlwZSBvZiBpbXBsaWVkIHJlbGF0aW9uLCBzbyB5b3UgY2FuIHN0eWxlIHRoZW0gZGlmZmVyZW50bHkuIEZvciBleGFtcGxlIGAuQkMtQXVudGAuXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2FtZSBQYXJlbnQgaXMgU2libGluZ3NcIilcclxuICAgIC5zZXREZXNjKFwiSWYgb25lIG5vdGUgc2hhcmVzIGEgcGFyZW50IHdpdGggYW5vdGhlciwgdHJlYXQgdGhlbSBhcyBzaWJsaW5nc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2FtZVBhcmVudElzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zYW1lUGFyZW50SXNTaWJsaW5nID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcbk1lIC0tPnx1cHwgRGFkXFxuU2lzdGVyIC0tPnx1cHwgRGFkXFxuTWUgPC0uLT58c2FtZXwgU2lzdGVyXFxuYGBgXCIpXHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2libGluZ3MnIFNpYmxpbmdzXCIpXHJcbiAgICAuc2V0RGVzYyhcIlRyZWF0IHlvdXIgc2libGluZ3MnIHNpYmxpbmdzIGFzIHlvdXIgc2libGluZ3NcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzU2libGluZ0lzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmcgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHNhbWV8IFNpc3Rlclxcbk1lIC0tPnxzYW1lfCBCcm90aGVyXFxuU2lzdGVyIDwtLi0+fHNhbWV8IEJyb3RoZXJcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaWJsaW5ncycgUGFyZW50IGlzIFBhcmVudFwiKVxyXG4gICAgLnNldERlc2MoXCJZb3VyIHNpYmxpbmdzJyBwYXJlbnRzIGFyZSB5b3VyIHBhcmVudHNcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzUGFyZW50SXNQYXJlbnQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWwpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2libGluZ3NQYXJlbnRJc1BhcmVudCA9IHZhbDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBtZXJtYWlkRGlhZ3JhbShcImBgYG1lcm1haWRcXG5mbG93Y2hhcnQgTFJcXG5TaXN0ZXIgLS0+fHVwfCBEYWRcXG5TaXN0ZXIgPC0tPnxzYW1lfCBNZVxcbk1lIC0uLT58dXB8IERhZFxcbmBgYFwiKVxyXG5cclxuICBuZXcgU2V0dGluZyhyZWxhdGlvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkF1bnQvVW5jbGVcIilcclxuICAgIC5zZXREZXNjKFwiVHJlYXQgeW91ciBwYXJlbnQncyBzaWJsaW5ncyBhcyB5b3VyIHBhcmVudHMgKGF1bnRzL3VuY2xlcylcIilcclxuICAgIC5hZGRUb2dnbGUoKHRnKSA9PlxyXG4gICAgICB0Z1xyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnBhcmVudHNTaWJsaW5nc0lzUGFyZW50cylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5wYXJlbnRzU2libGluZ3NJc1BhcmVudHMgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHVwfCBEYWRcXG5EYWQgLS0+fHNhbWV8IFVuY2xlXFxuTWUgLS4tPnx1cHwgVW5jbGVcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJDb3VzaW5zXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJUcmVhdCB0aGUgY291c2lucyBvZiBhIG5vdGUgYXMgc2libGluZ3MgKHBhcmVudHMnIHNpYmxpbmdzJyBjaGlsZHJlbiBhcmUgY291c2lucylcIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuY291c2luc0lzU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5jb3VzaW5zSXNTaWJsaW5nID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcbk1lIC0tPnx1cHwgRGFkXFxuRGFkIC0tPnxzYW1lfCBVbmNsZVxcblVuY2xlIC0tPnxkb3dufCBDb3VzaW5cXG5NZSA8LS4tPnxzYW1lfCBDb3VzaW5cXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJNYWtlIEN1cnJlbnQgTm90ZSBhbiBJbXBsaWVkIFNpYmxpbmdcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRlY2hpbmNhbGx5LCB0aGUgY3VycmVudCBub3RlIGlzIGFsd2F5cyBpdCdzIG93biBpbXBsaWVkIHNpYmxpbmcuIEJ5IGRlZmF1bHQsIGl0IGlzIG5vdCBzaG93IGFzIHN1Y2guIFRvZ2dsZSB0aGlzIG9uIHRvIG1ha2UgaXQgc2hvdy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MudHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MudHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmcgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHRhZ05vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcIlRhZyBOb3Rlc1wiLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh0YWdOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBUYWcgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIHRhZyBub3RlcyB1c2UgdGhlIGZpcnN0IGZpZWxkIGluIHlvdXIgaGllcmFyY2hpZXMgKHVzdWFsbHkgYW4gPGNvZGU+XHUyMTkxPC9jb2RlPiBmaWVsZCkuIENob29zZSBhIGRpZmZlcmVudCBvbmUgdG8gdXNlIGJ5IGRlZmF1bHQsIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgPGNvZGU+QkMtdGFnLW5vdGUtZmllbGQ6IHtmaWVsZH08L2NvZGU+LjwvYnI+SWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG5cclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xyXG4gICAgICBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKS5mb3JFYWNoKFxyXG4gICAgICAgIChmaWVsZCkgPT4gKG9wdGlvbnNbZmllbGRdID0gZmllbGQpXHJcbiAgICAgICk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7IFwiXCI6IFwiXCIgfSkpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRhZ05vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50YWdOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEFSUk9XX0RJUkVDVElPTlMsXHJcbiAgREVGQVVMVF9TRVRUSU5HUyxcclxuICBESVJFQ1RJT05TLFxyXG4gIElMTEVHQUxfRklMRU5BTUVfQ0hBUlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRUaHJlYWRpbmdTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNtZHNEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHRocmVhZGluZ0RldGFpbHMgPSBzdWJEZXRhaWxzKFwiVGhyZWFkaW5nXCIsIGNtZHNEZXRhaWxzKTtcclxuXHJcbiAgdGhyZWFkaW5nRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgdGV4dDogXCJTZXR0aW5ncyBmb3IgdGhlIGNvbW1hbmRzIGBDcmVhdGUgbmV3IDxmaWVsZD4gZnJvbSBjdXJyZW50IG5vdGVgXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk9wZW4gbmV3IHRocmVhZHMgaW4gbmV3IHBhbmUgb3IgY3VycmVudCBwYW5lXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+IHtcclxuICAgICAgdG9nLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZEludG9OZXdQYW5lKTtcclxuICAgICAgdG9nLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnRocmVhZEludG9OZXdQYW5lID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlRocmVhZCB1bmRlciBDdXJzb3JcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJJZiB0aGUgc2V0dGluZyA8Y29kZT5Xcml0ZSBCcmVhZGNydW1icyBJbmxpbmU8L2NvZGU+IGlzIGVuYWJsZWQsIHdoZXJlIHNob3VsZCB0aGUgbmV3IEJyZWFkY3J1bWIgYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgbm90ZT8gXHUyNzA1ID0gVW5kZXIgdGhlIGN1cnNvciwgXHUyNzRDID0gQXQgdGhlIHRvcCBvZiB0aGUgbm90ZSAodW5kZXIgdGhlIHlhbWwsIGlmIGFwcGxpY2FibGUpXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nKSA9PiB7XHJcbiAgICAgIHRvZy5zZXRWYWx1ZShzZXR0aW5ncy50aHJlYWRVbmRlckN1cnNvcik7XHJcbiAgICAgIHRvZy5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50aHJlYWRVbmRlckN1cnNvciA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmV3IE5vdGUgTmFtZSBUZW1wbGF0ZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgV2hlbiB0aHJlYWRpbmcgaW50byBhIG5ldyBub3RlLCBjaG9vc2UgdGhlIHRlbXBsYXRlIGZvciB0aGUgbmV3IG5vdGUgbmFtZS48L2JyPlxyXG4gICAgICAgIE9wdGlvbnMgaW5jbHVkZTo8L2JyPlxyXG4gICAgICAgIDx1bD5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2ZpZWxkfX08L2NvZGU+OiB0aGUgZmllbGQgYmVpbmcgdGhyZWFkIGludG88L2xpPlxyXG4gICAgICAgICAgPGxpPjxjb2RlPnt7ZGlyfX08L2NvZGU+OiB0aGUgZGlyZWN0aW9uIGJlaW5nIHRocmVhZCBpbnRvPC9saT5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2N1cnJlbnR9fTwvY29kZT46IHRoZSBjdXJyZW50IG5vdGUgbmFtZTwvbGk+XHJcbiAgICAgICAgICA8bGk+PGNvZGU+e3tkYXRlfX08L2NvZGU+OiB0aGUgY3VycmVudCBkYXRlIChTZXQgdGhlIGZvcm1hdCBpbiB0aGUgc2V0dGluZyBiZWxvdyk8L2xpPlxyXG4gICAgICAgIDwvdWw+YFxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLnRocmVhZGluZ1RlbXBsYXRlKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoSUxMRUdBTF9GSUxFTkFNRV9DSEFSUy5zb21lKChjaGFyKSA9PiB2YWx1ZS5pbmNsdWRlcyhjaGFyKSkpIHtcclxuICAgICAgICAgIG5ldyBOb3RpY2UoXHJcbiAgICAgICAgICAgIGBGaWxlIG5hbWUgY2Fubm90IGNvbnRhaW4gYW55IG9mIHRoZXNlIGNoYXJhY3RlcnM6ICR7SUxMRUdBTF9GSUxFTkFNRV9DSEFSUy5qb2luKFxyXG4gICAgICAgICAgICAgIFwiIFwiXHJcbiAgICAgICAgICAgICl9YFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MudGhyZWFkaW5nVGVtcGxhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50aHJlYWRpbmdUZW1wbGF0ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHRocmVhZGluZ0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRhdGUgRm9ybWF0XCIpXHJcbiAgICAuc2V0RGVzYyhcIlRoZSBkYXRlIGZvcm1hdCB1c2VkIGluIHRoZSBUaHJlYWRpbmcgVGVtcGxhdGUgKHNldHRpbmcgYWJvdmUpXCIpXHJcbiAgICAuYWRkTW9tZW50Rm9ybWF0KChmb3JtYXQpID0+IHtcclxuICAgICAgZm9ybWF0XHJcbiAgICAgICAgLnNldERlZmF1bHRGb3JtYXQoREVGQVVMVF9TRVRUSU5HUy5kYXRlRm9ybWF0KVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kYXRlRm9ybWF0KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmRhdGVGb3JtYXQgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBjb25zdCB0aHJlYWREaXJUZW1wbGF0ZXNTZXR0aW5nID0gbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXRDbGFzcyhcInRocmVhZC1kaXItdGVtcGxhdGVzXCIpXHJcbiAgICAuc2V0TmFtZShcIlRlbXBsYXRlciBUZW1wbGF0ZSBwZXIgRGlyZWN0aW9uXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIGBGb3IgZWFjaCBkaXJlY3Rpb24gdG8gYmUgdGhyZWFkIGludG8sIGNob29zZSBhIFRlbXBsYXRlciB0ZW1wbGF0ZSB0byBpbnNlcnQgaW50byB0aGUgbmV3IG5vdGUuPC9icj5cclxuICAgICAgICAgIEdpdmUgdGhlIGJhc2VuYW1lLCBvciB0aGUgZnVsbCBmaWxlIHBhdGggKGUuZy4gPGNvZGU+VGVtcGxhdGVzL1BhcmVudCBUZW1wbGF0ZTwvY29kZT4pLmBcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgRElSRUNUSU9OUy5mb3JFYWNoKChkaXIpID0+XHJcbiAgICB0aHJlYWREaXJUZW1wbGF0ZXNTZXR0aW5nLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dFxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihBUlJPV19ESVJFQ1RJT05TW2Rpcl0pXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZGluZ0RpclRlbXBsYXRlc1tkaXJdKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50aHJlYWRpbmdEaXJUZW1wbGF0ZXNbZGlyXSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IEp1Z2dsTGF5b3V0cyB9IGZyb20gXCJqdWdnbC1hcGlcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBpc0luVmF1bHQgfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbmltcG9ydCB7IFRSQUlMX0xFTkdUSFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCBDaGVja2JveGVzIGZyb20gXCIuLi9Db21wb25lbnRzL0NoZWNrYm94ZXMuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHNwbGl0QW5kVHJpbSB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBkcmF3VHJhaWwgfSBmcm9tIFwiLi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRyYWlsVmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdmlld0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgdHJhaWxEZXRhaWxzID0gc3ViRGV0YWlscyhcIlRyYWlsL0dyaWQvSnVnZ2xcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgQnJlYWRjcnVtYnMgaW4gRWRpdC9MaXZlLVByZXZpZXcgTW9kZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSXQgYWx3YXlzIHNob3dzIGluIHByZXZpZXcgbW9kZSwgYnV0IHNob3VsZCBpdCBhbHNvIHNob3cgaW4gdGhlIG90aGVyIHR3bz9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0JDc0luRWRpdExQTW9kZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0JDc0luRWRpdExQTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIHRyYWlsRGV0YWlscy5jcmVhdGVFbCgnaHInKVxyXG4gIHRyYWlsRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgY2xzOiBcInNldHRpbmctaXRlbS1uYW1lXCIsXHJcbiAgICB0ZXh0OiBcIkxpbWl0IFRyYWlsIFZpZXcgdG8gb25seSBzaG93IGNlcnRhaW4gZmllbGRzXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDogdHJhaWxEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBzZXR0aW5nTmFtZTogXCJsaW1pdFRyYWlsQ2hlY2tib3hlc1wiLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzLCBcInVwXCIpLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgY29uc3Qgdmlld3NUb1Nob3cgPSBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlZpZXdzIHRvIHNob3dcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIkNob29zZSB3aGljaCBvZiB0aGUgdmlld3MgdG8gc2hvdyBhdCB0aGUgdG9wIG9mIHRoZSBub3RlLiBKdWdnbCBWaWV3IHJlcXVpcmVzIHRoZSBKdWdnbCBwbHVnaW4uXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIlRyYWlsIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1RyYWlsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dUcmFpbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRUb29sdGlwKFwiR3JpZCB2aWV3XCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnNob3dHcmlkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dHcmlkID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFRvb2x0aXAoXCJOZXh0L1ByZXZpb3VzIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1ByZXZOZXh0KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dQcmV2TmV4dCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG5cclxuICBpZiAoYXBwLnBsdWdpbnMucGx1Z2lucy5qdWdnbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB2aWV3c1RvU2hvdy5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIkp1Z2dsIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0p1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dKdWdnbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoJ0dyaWQgdmlldyBkZXB0aCcpXHJcbiAgICAuc2V0RGVzYygnTGltaXQgdGhlIGluaXRpYWwgZGVwdGggb2YgdGhlIGdyaWQgdmlldycpXHJcbiAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+IHtcclxuICAgICAgc2xpZGVyXHJcbiAgICAgICAgLnNldExpbWl0cygwLCAyNSwgMSlcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuZ3JpZERlZmF1bHREZXB0aClcclxuICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKTtcclxuXHJcbiAgICAgIHNsaWRlci5zbGlkZXJFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZ3JpZERlZmF1bHREZXB0aCA9IHNsaWRlci5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiSW5kZXggTm90ZShzKVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlRoZSBub3RlIHRoYXQgYWxsIG9mIHlvdXIgb3RoZXIgbm90ZXMgbGVhZCBiYWNrIHRvLiBUaGUgcGFyZW50IG9mIGFsbCB5b3VyIHBhcmVudCBub3Rlcy4gSnVzdCBlbnRlciB0aGUgYmFzZW5hbWUuPC9icj5Zb3UgY2FuIGFsc28gaGF2ZSBtdWx0aXBsZSBpbmRleCBub3RlcyAoY29tbWEtc2VwYXJhdGVkIGxpc3QpLjwvYnI+TGVhdmluZyB0aGlzIGZpZWxkIGVtcHR5IHdpbGwgbWFrZSB0aGUgdHJhaWwgc2hvdyBhbGwgcGF0aHMgZ29pbmcgYXMgZmFyIHVwIHRoZSBwYXJlbnQtdHJlZSBhcyBwb3NzaWJsZS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiSW5kZXggTm90ZVwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5pbmRleE5vdGVzLmpvaW4oXCIsIFwiKSk7XHJcblxyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IHNwbGl0QW5kVHJpbSh0ZXh0LmdldFZhbHVlKCkpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHNwbGl0c1swXSA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICBzcGxpdHMuZXZlcnkoKGluZGV4KSA9PiBpc0luVmF1bHQoaW5kZXgpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW5kZXhOb3RlcyA9IHNwbGl0cztcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9IGVsc2UgbmV3IE5vdGljZShcIkF0bGVhc3Qgb25lIG9mIHRoZSBub3RlcyBpcyBub3QgaW4geW91ciB2YXVsdFwiKTtcclxuXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93cyBhbGwgcGF0aHMgaWYgbm9uZSB0byBpbmRleCBub3RlIGFyZSBmb3VuZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSWYgeW91IGhhdmUgYW4gaW5kZXggbm90ZSBjaG9zZW4sIGJ1dCB0aGUgdHJhaWwgdmlldyBoYXMgbm8gcGF0aHMgZ29pbmcgdXAgdG8gdGhvc2UgaW5kZXggbm90ZXMsIHNob3VsZCBpdCBzaG93IGFsbCBwYXRocyBpbnN0ZWFkP1wiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSlcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5zaG93QWxsUGF0aHNJZk5vbmVUb0luZGV4Tm90ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQ6IEFsbCwgTG9uZ2VzdCwgb3IgU2hvcnRlc3RcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIG11bHRpcGxlIHBhdGhzIGFyZSBmb3VuZCBnb2luZyB1cCB0aGUgcGFyZW50IHRyZWUsIHdoaWNoIG9mIHRoZW0gc2hvdWxkIHNob3c/XCJcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bihkZCA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fVxyXG4gICAgICBUUkFJTF9MRU5HVEhTLmZvckVhY2gobGVuZ3RoID0+IHtcclxuICAgICAgICBvcHRpb25zW2xlbmd0aF0gPSBsZW5ndGg7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBkZC5hZGRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QWxsKTtcclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dBbGwgPSB2YWw7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgfSlcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTZXBlcmF0b3JcIilcclxuICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcclxuICAgICAgXCJUaGUgY2hhcmFjdGVyIHRvIHNob3cgYmV0d2VlbiBjcnVtYnMgaW4gdGhlIGJyZWFkY3J1bWIgdHJhaWwuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPlx1MjE5MjwvY29kZT5cIilcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiXHUyMTkyXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnRyYWlsU2VwZXJhdG9yKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnRyYWlsU2VwZXJhdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJObyBwYXRoIGZvdW5kIG1lc3NhZ2VcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRoZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBubyBwYXRoIHRvIHRoZSBpbmRleCBub3RlIGlzIGZvdW5kLCBvciB0aGUgY3VycmVudCBub3RlIGhhcyBubyBwYXJlbnQuXCJcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiTm8gcGF0aCB0byBpbmRleCBub3RlIHdhcyBmb3VuZFwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ub1BhdGhNZXNzYWdlKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLm5vUGF0aE1lc3NhZ2UgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlc3BlY3QgUmVhZGFibGUgTGluZSBMZW5ndGhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlNob3VsZCB0aGUgYnJlYWRjcnVtYnMgdHJhaWwgYWRqdXN0IGl0cyB3aWR0aCB0byB0aGUgcmVhZGFibGUgbGluZSBsZW5ndGgsIG9yIHVzZSBhcyBtdWNoIHNwYWNlIGFzIHBvc3NpYmxlPyBcdTI3MDUgPSB1c2UgcmVhZGFibGUgbGluZSBsZW5ndGguXCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGgpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MucmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgdXAgZmllbGRzIGluIEp1Z2dsXCIpXHJcbiAgICAuc2V0RGVzYyhcIkp1Z2dsIHdpbGwgc2hvdyBib3RoIHVwIGFuZCBkb3duIGZpZWxkc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93VXBJbkp1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dVcEluSnVnZ2wgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkp1Z2dsIHZpZXcgbGF5b3V0XCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiVGhlIGxheW91dCB0eXBlIHRvIHVzZSBmb3IgdGhlIEp1Z2dsIHZpZXcuPGJyPlRoZSBoaWVyYXJjaHkgbGF5b3V0IGlzIG1vc3QgbmF0dXJhbCBmb3IgQnJlYWRjcnVtYnMsIGJ1dCBmb3IgbGFyZ2UgZ3JhcGhzIEQzIEZvcmNlIGlzIHJlY29tbWVuZGVkLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGM6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImhpZXJhcmNoeVwiLCBcIkhpZXJhcmNoeVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiZDMtZm9yY2VcIiwgXCJEMyBGb3JjZVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiY29sYVwiLCBcIkNvbGEgRm9yY2VcIik7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImdyaWRcIiwgXCJHcmlkXCIpO1xyXG4gICAgICBkYy5hZGRPcHRpb24oXCJjb25jZW50cmljXCIsIFwiQ29uY2VudHJpY1wiKTtcclxuXHJcbiAgICAgIGRjLnNldFZhbHVlKHNldHRpbmdzLmp1Z2dsTGF5b3V0KTtcclxuICAgICAgZGMub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuanVnZ2xMYXlvdXQgPSB2YWx1ZSBhcyBKdWdnbExheW91dHM7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBBTExVTkxJTktFRCwgUkVBbENMT1NFRCwgUkVMQVRJT05TLCBWSVNUWVBFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBSZWxhdGlvbnMsIFZpc1R5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVmlzTW9kYWxTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIHZpZXdEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHZpc01vZGFsRGV0YWlscyA9IHN1YkRldGFpbHMoXCJWaXN1YWxpc2F0aW9uIE1vZGFsXCIsIHZpZXdEZXRhaWxzKTtcclxuXHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFZpc3VhbGlzYXRpb24gVHlwZVwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCB2aXN1YWxpc2F0aW9uIHRvIHNob3cgYnkgZGVmYXVsdFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChjYjogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgVklTVFlQRVMuZm9yRWFjaCgob3B0aW9uOiBWaXNUeXBlKSA9PiB7XHJcbiAgICAgICAgY2IuYWRkT3B0aW9uKG9wdGlvbiwgb3B0aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNiLnNldFZhbHVlKHNldHRpbmdzLnZpc0dyYXBoKTtcclxuXHJcbiAgICAgIGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogVmlzVHlwZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnZpc0dyYXBoID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHZpc01vZGFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBSZWxhdGlvblwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCByZWxhdGlvbiB0eXBlIHRvIHNob3cgZmlyc3Qgd2hlbiBvcGVuaW5nIHRoZSBtb2RhbFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZCkgPT4ge1xyXG4gICAgICBSRUxBVElPTlMuZm9yRWFjaCgob3B0aW9uOiBSZWxhdGlvbnMpID0+IHtcclxuICAgICAgICBkZC5hZGRPcHRpb24ob3B0aW9uLCBvcHRpb24pO1xyXG4gICAgICB9KTtcclxuICAgICAgZGQuc2V0VmFsdWUoc2V0dGluZ3MudmlzUmVsYXRpb24pO1xyXG5cclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBSZWxhdGlvbnMpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNSZWxhdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyh2aXNNb2RhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgUmVhbC9DbG9zZWRcIilcclxuICAgIC5zZXREZXNjKFwiU2hvdyB0aGUgcmVhbCBvciBjbG9zZWQgZ3JhcGggYnkgZGVmYXVsdFwiKVxyXG4gICAgLmFkZERyb3Bkb3duKChjYjogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgUkVBbENMT1NFRC5mb3JFYWNoKChvcHRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNiLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjYi5zZXRWYWx1ZShzZXR0aW5ncy52aXNDbG9zZWQpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNDbG9zZWQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFVubGlua2VkXCIpXHJcbiAgICAuc2V0RGVzYyhcIlNob3cgYWxsIG5vZGVzIG9yIG9ubHkgdGhvc2Ugd2hpY2ggaGF2ZSBsaW5rcyBieSBkZWZhdWx0XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGNiOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBBTExVTkxJTktFRC5mb3JFYWNoKChvcHRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNiLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjYi5zZXRWYWx1ZShzZXR0aW5ncy52aXNBbGwpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy52aXNBbGwgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IENoZWNrYm94ZXMgZnJvbSBcIi4uL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRXcml0ZUJDc1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY21kc0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3Qgd3JpdGVCQ3NUb0ZpbGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiV3JpdGUgQnJlYWRjcnVtYnMgdG8gRmlsZVwiLFxyXG4gICAgY21kc0RldGFpbHNcclxuICApO1xyXG5cclxuICB3cml0ZUJDc1RvRmlsZURldGFpbHMuY3JlYXRlRGl2KHtcclxuICAgIGNsczogXCJzZXR0aW5nLWl0ZW0tbmFtZVwiLFxyXG4gICAgdGV4dDogXCJMaW1pdCB0byBvbmx5IHdyaXRlIGNlcnRhaW4gZmllbGRzXCIsXHJcbiAgfSk7XHJcblxyXG4gIG5ldyBDaGVja2JveGVzKHtcclxuICAgIHRhcmdldDogd3JpdGVCQ3NUb0ZpbGVEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBvcHRpb25zOiBnZXRGaWVsZHMoc2V0dGluZ3MudXNlckhpZXJzKSxcclxuICAgICAgc2V0dGluZ05hbWU6IFwibGltaXRXcml0ZUJDQ2hlY2tib3hlc1wiLFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcod3JpdGVCQ3NUb0ZpbGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJXcml0ZSBJbmxpbmVcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIldoZW4gd3JpdGluZyBCQ3MgdG8gZmlsZSwgc2hvdWxkIHRoZXkgYmUgd3JpdHRlbiBpbmxpbmUgKHVzaW5nIERhdGF2aWV3IHN5bnRheCksIG9yIGludG8gdGhlIFlBTUwgb2YgdGhlIG5vdGU/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLndyaXRlQkNzSW5saW5lKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy53cml0ZUJDc0lubGluZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHdyaXRlQkNzVG9GaWxlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJTaG93IHRoZSA8Y29kZT5Xcml0ZSBCcmVhZGNydW1icyB0byBBTEwgRmlsZXM8L2NvZGU+IGNvbW1hbmRcIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJUaGlzIGNvbW1hbmQgYXR0ZW1wdHMgdG8gdXBkYXRlIEFMTCBmaWxlcyB3aXRoIGltcGxpZWQgYnJlYWRjcnVtYnMgcG9pbnRpbmcgdG8gdGhlbS4gU28sIGl0IGlzIG5vdCBzaG93biBieSBkZWZhdWx0IChldmVuIHRob3VnaCBpdCBoYXMgMyBjb25maXJtYXRpb24gYm94ZXMgdG8gZW5zdXJlIHlvdSB3YW50IHRvIHJ1biBpdFwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93V3JpdGVBbGxCQ3NDbWQpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IEl0ZW1WaWV3LCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBEdWNrcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9EdWNrcy5zdmVsdGVcIjtcclxuaW1wb3J0IHsgRFVDS19JQ09OLCBEVUNLX1ZJRVcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdWNrc1ZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcbiAgcHJpdmF0ZSBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogRHVja3M7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYsIHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGxlYWYpO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBzdXBlci5vbmxvYWQoKTtcclxuICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5kcmF3KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFZpZXdUeXBlKCkge1xyXG4gICAgcmV0dXJuIERVQ0tfVklFVztcclxuICB9XHJcbiAgZ2V0RGlzcGxheVRleHQoKSB7XHJcbiAgICByZXR1cm4gXCJCcmVhZGNydW1icyBEdWNrc1wiO1xyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyBEdWNrIGljb25cclxuICBpY29uID0gRFVDS19JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMudmlldyA9IG5ldyBEdWNrcyh7XHJcbiAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7IHBsdWdpbjogdGhpcy5wbHVnaW4sIGR1Y2tzVmlldzogdGhpcyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsICI8c2NyaXB0PlxuICAgICAgICBpbXBvcnQgSWNvbkJhc2UgZnJvbSAnLi4vY29tcG9uZW50cy9JY29uQmFzZS5zdmVsdGUnO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPEljb25CYXNlIHZpZXdCb3g9XCIwIDAgMTkyIDUxMlwiIHsuLi4kJHByb3BzfT5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIwIDQyNC4yMjloMjBWMjc5Ljc3MUgyMGMtMTEuMDQ2IDAtMjAtOC45NTQtMjAtMjBWMjEyYzAtMTEuMDQ2IDguOTU0LTIwIDIwLTIwaDExMmMxMS4wNDYgMCAyMCA4Ljk1NCAyMCAyMHYyMTIuMjI5aDIwYzExLjA0NiAwIDIwIDguOTU0IDIwIDIwVjQ5MmMwIDExLjA0Ni04Ljk1NCAyMC0yMCAyMEgyMGMtMTEuMDQ2IDAtMjAtOC45NTQtMjAtMjB2LTQ3Ljc3MWMwLTExLjA0NiA4Ljk1NC0yMCAyMC0yMHpNOTYgMEM1Ni4yMzUgMCAyNCAzMi4yMzUgMjQgNzJzMzIuMjM1IDcyIDcyIDcyIDcyLTMyLjIzNSA3Mi03MlMxMzUuNzY0IDAgOTYgMHpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgaG92ZXJQcmV2aWV3LCBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG4gIGltcG9ydCBGYUluZm8gZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYUluZm8uc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgdHlwZSBEdWNrc1ZpZXcgZnJvbSBcIi4uL1ZpZXdzL0R1Y2tzVmlld1wiO1xyXG5cclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcbiAgZXhwb3J0IGxldCBkdWNrc1ZpZXc6IER1Y2tzVmlldztcclxuXHJcbiAgY29uc3QgeyBtYWluRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuXHJcbiAgbGV0IHF1ZXJ5OiBzdHJpbmcgPSBcIlwiO1xyXG4gIGxldCByZWdleCA9IG5ldyBSZWdFeHAocXVlcnksIFwiZ1wiKTtcclxuICBsZXQgaW5jbHVkZSA9IHRydWU7XHJcblxyXG4gICQ6IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG5ld1JlZyA9IG5ldyBSZWdFeHAocXVlcnksIFwiZ1wiKTtcclxuICAgICAgcmVnZXggPSBuZXdSZWc7XHJcbiAgICB9IGNhdGNoIChlKSB7fVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0RHVja3MgPSAocmVnZXg6IFJlZ0V4cCkgPT4ge1xyXG4gICAgaWYgKCFyZWdleCkgcmV0dXJuO1xyXG4gICAgcmV0dXJuIGZpbGVzXHJcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG5hbWUpID0+ICFtYWluRy5uZWlnaGJvcnMobmFtZSkubGVuZ3RoICYmIGluY2x1ZGUgPT09IHJlZ2V4LnRlc3QobmFtZSlcclxuICAgICAgKTtcclxuICB9O1xyXG5cclxuICAkOiBkdWNrcyA9IGdldER1Y2tzKHJlZ2V4KTtcclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2IGNsYXNzPVwiQkMtRHVja3MgbWFya2Rvd24tcHJldmlldy12aWV3XCI+XHJcbiAgPGg2Pk5vdGVzIHdpdGhvdXQgQnJlYWRjcnVtYnM8L2g2PlxyXG4gIDxzcGFuXHJcbiAgICBjbGFzcz1cImljb25cIlxyXG4gICAgYXJpYS1sYWJlbD17YEEgUmVnZXggdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuXFxuSWYgJ0luY2x1ZGUnIGlzIGNoZWNrZWQsIGl0IHdpbGwgb25seSBzaG93IG5vdGVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4LlxcbklmICdJbmNsdWRlJyBpcyBub3QgY2hlY2tlZCwgdGhpcyByZWdleCB3aWxsIGZpbHRlciBvdXQgbm90ZXMgdGhhdCBtYXRjaCBpdC5gfVxyXG4gID5cclxuICAgIDxGYUluZm8gLz5cclxuICA8L3NwYW4+XHJcbiAgPGxhYmVsPlxyXG4gICAgRmlsdGVyOlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSZWdleFwiIGJpbmQ6dmFsdWU9e3F1ZXJ5fSAvPlxyXG4gIDwvbGFiZWw+XHJcbiAgPGlucHV0IGFyaWEtbGFiZWw9XCJJbmNsdWRlXCIgdHlwZT1cImNoZWNrYm94XCIgYmluZDpjaGVja2VkPXtpbmNsdWRlfSAvPlxyXG5cclxuICB7I2VhY2ggZHVja3MgYXMgZHVja31cclxuICAgIDxkaXZcclxuICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2goZHVjaywgZSl9XHJcbiAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBkdWNrc1ZpZXcsIGR1Y2spfVxyXG4gICAgPlxyXG4gICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1taXNzaW5nLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgPGEgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCI+e2R1Y2t9PC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDVweCAhaW1wb3J0YW50O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgYWRkRmVhdGhlckljb24gfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgU2lkZVRyZWUgZnJvbSBcIi4uL0NvbXBvbmVudHMvU2lkZVRyZWUuc3ZlbHRlXCI7XHJcbmltcG9ydCB7IFRSRUVfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uLy4uL21haW5cIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyZWVWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xyXG4gIHByaXZhdGUgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBwcml2YXRlIHZpZXc6IFNpZGVUcmVlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihsZWFmKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgc3VwZXIub25sb2FkKCk7XHJcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmRyYXcoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gVFJFRV9WSUVXO1xyXG4gIH1cclxuICBnZXREaXNwbGF5VGV4dCgpIHtcclxuICAgIHJldHVybiBcIkJyZWFkY3J1bWJzIERvd25cIjtcclxuICB9XHJcblxyXG4gIGljb24gPSBhZGRGZWF0aGVySWNvbihcImNvcm5lci1yaWdodC1kb3duXCIpIGFzIHN0cmluZztcclxuXHJcbiAgYXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge31cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMudmlldyA9IG5ldyBTaWRlVHJlZSh7XHJcbiAgICAgIHRhcmdldDogdGhpcy5jb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7IHBsdWdpbjogdGhpcy5wbHVnaW4sIHZpZXc6IHRoaXMgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbiAgaW1wb3J0IHtcclxuICAgIGhvdmVyUHJldmlldyxcclxuICAgIGlzSW5WYXVsdCxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbiAgaW1wb3J0IEZhRmlyZSBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhRmlyZS5zdmVsdGVcIjtcclxuICBpbXBvcnQgRmFSZWdTbm93Zmxha2UgZnJvbSBcInN2ZWx0ZS1pY29ucy9mYS9GYVJlZ1Nub3dmbGFrZS5zdmVsdGVcIjtcclxuICBpbXBvcnQgeyBjcmVhdGVJbmRleCwgaW5kZXhUb0xpbmVQYWlycyB9IGZyb20gXCIuLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG4gIGltcG9ydCB7IERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuICBpbXBvcnQgeyBkcm9wRGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBkZnNBbGxQYXRocywgZ2V0U3ViSW5EaXJzIH0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBUcmVlVmlldyBmcm9tIFwiLi4vVmlld3MvVHJlZVZpZXdcIjtcclxuICBpbXBvcnQgeyBnZXRDdXJyRmlsZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBleHBvcnQgbGV0IHZpZXc6IFRyZWVWaWV3O1xyXG5cclxuICBjb25zdCB7IHNldHRpbmdzLCBhcHAsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuXHJcbiAgbGV0IGRpcjogRGlyZWN0aW9ucyA9IFwiZG93blwiO1xyXG4gIGxldCBmcm96ZW4gPSBmYWxzZTtcclxuICBsZXQgeyBiYXNlbmFtZSB9ID0gZ2V0Q3VyckZpbGUoKTtcclxuXHJcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICBhcHAud29ya3NwYWNlLm9uKFwiYWN0aXZlLWxlYWYtY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgaWYgKGZyb3plbikgcmV0dXJuO1xyXG4gICAgICBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBsZXQgbGluZXM6IFtzdHJpbmcsIHN0cmluZ11bXTtcclxuICAkOiB7XHJcbiAgICBjb25zdCBkb3duRyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBkaXIpO1xyXG4gICAgY29uc3QgYWxsUGF0aHMgPSBkZnNBbGxQYXRocyhkb3duRywgYmFzZW5hbWUpO1xyXG4gICAgY29uc3QgaW5kZXggPSBjcmVhdGVJbmRleChhbGxQYXRocywgZmFsc2UsIGNyZWF0ZUluZGV4SW5kZW50KTtcclxuICAgIGluZm8oeyBhbGxQYXRocywgaW5kZXggfSk7XHJcblxyXG4gICAgbGluZXMgPSBpbmRleFRvTGluZVBhaXJzKGluZGV4KTtcclxuICB9XHJcbjwvc2NyaXB0PlxyXG5cclxuPCEtLSBzdmVsdGUtaWdub3JlIGExMXktdW5rbm93bi1hcmlhLWF0dHJpYnV0ZSAtLT5cclxuPHNwYW5cclxuICBjbGFzcz1cImljb25cIlxyXG4gIGFyaWEtbGFiZWw9e2Zyb3plbiA/IGBGcm96ZW4gb246ICR7YmFzZW5hbWV9YCA6IFwiVW5mcm96ZW5cIn1cclxuICBhcmlhLWxhYmVsLXBvc2l0aW9uPVwibGVmdFwiXHJcbiAgb246Y2xpY2s9eygpID0+IHtcclxuICAgIGZyb3plbiA9ICFmcm96ZW47XHJcbiAgICBpZiAoIWZyb3plbikgYmFzZW5hbWUgPSBnZXRDdXJyRmlsZSgpPy5iYXNlbmFtZTtcclxuICB9fVxyXG4+XHJcbiAgeyNpZiBmcm96ZW59XHJcbiAgICA8RmFSZWdTbm93Zmxha2UgLz5cclxuICB7OmVsc2V9XHJcbiAgICA8RmFGaXJlIC8+XHJcbiAgey9pZn1cclxuPC9zcGFuPlxyXG5cclxuPGJ1dHRvblxyXG4gIGFyaWEtbGFiZWw9XCJSZWZyZXNoIFN0YXRzIFZpZXcgKGFsc28gcmVmcmVzaGVzIEJyZWFkY3J1bWJzIEluZGV4KVwiXHJcbiAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgYXdhaXQgdmlldy5kcmF3KCk7XHJcbiAgfX1cclxuPlxyXG4gIFx1MjFCQlxyXG48L2J1dHRvbj5cclxuXHJcbjxzZWxlY3QgY2xhc3M9XCJkcm9wZG93blwiIGJpbmQ6dmFsdWU9e2Rpcn0+XHJcbiAgeyNlYWNoIERJUkVDVElPTlMgYXMgZGlyZWN0aW9ufVxyXG4gICAgPG9wdGlvbiB2YWx1ZT17ZGlyZWN0aW9ufT57ZGlyZWN0aW9ufTwvb3B0aW9uPlxyXG4gIHsvZWFjaH1cclxuPC9zZWxlY3Q+XHJcblxyXG48ZGl2IGNsYXNzPVwiQkMtZG93bnNcIj5cclxuICB7I2VhY2ggbGluZXMgYXMgbGluZX1cclxuICAgIHsjaWYgbGluZS5sZW5ndGggPiAxfVxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxwcmU+e2xpbmVbMF0gKyBcIi1cIn08L3ByZT5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJpbnRlcm5hbC1saW5rXCJcclxuICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKGxpbmVbMV0sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIHZpZXcsIGxpbmVbMV0pfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1pc3NpbmctYXR0cmlidXRlIC0tPlxyXG4gICAgICAgICAgPGEgY2xhc3M9XCJpbnRlcm5hbC1saW5rIHtpc0luVmF1bHQobGluZVsxXSkgPyAnJyA6ICdpcy11bnJlc29sdmVkJ31cIlxyXG4gICAgICAgICAgICA+e2Ryb3BEZW5kcm9uKGxpbmVbMV0sIHNldHRpbmdzKX08L2FcclxuICAgICAgICAgID5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9pZn1cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIGJ1dHRvbiB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmU7XHJcbiAgICBwYWRkaW5nOiAxcHggNnB4IDJweCA2cHg7XHJcbiAgfVxyXG5cclxuICAuQkMtZG93bnMge1xyXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XHJcbiAgfVxyXG4gIHByZSB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmU7XHJcbiAgfVxyXG5cclxuICAuaXMtdW5yZXNvbHZlZCB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7XHJcbiAgfVxyXG5cclxuICAuaWNvbiB7XHJcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1ub3JtYWwpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgcGFkZGluZy10b3A6IDVweCAhaW1wb3J0YW50O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDM4NCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk0yMTYgMjMuODZjMC0yMy44LTMwLjY1LTMyLjc3LTQ0LjE1LTEzLjA0QzQ4IDE5MS44NSAyMjQgMjAwIDIyNCAyODhjMCAzNS42My0yOS4xMSA2NC40Ni02NC44NSA2My45OS0zNS4xNy0uNDUtNjMuMTUtMjkuNzctNjMuMTUtNjQuOTR2LTg1LjUxYzAtMjEuNy0yNi40Ny0zMi4yMy00MS40My0xNi41QzI3LjggMjEzLjE2IDAgMjYxLjMzIDAgMzIwYzAgMTA1Ljg3IDg2LjEzIDE5MiAxOTIgMTkyczE5Mi04Ni4xMyAxOTItMTkyYzAtMTcwLjI5LTE2OC0xOTMtMTY4LTI5Ni4xNHpcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCA0NDggNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNDQwLjEgMzU1LjJsLTM5LjItMjMgMzQuMS05LjNjOC40LTIuMyAxMy40LTExLjEgMTEuMS0xOS42bC00LjEtMTUuNWMtMi4yLTguNS0xMC45LTEzLjYtMTkuMy0xMS4zTDM0MyAyOTguMiAyNzEuMiAyNTZsNzEuOS00Mi4yIDc5LjcgMjEuN2M4LjQgMi4zIDE3LTIuOCAxOS4zLTExLjNsNC4xLTE1LjVjMi4yLTguNS0yLjctMTcuMy0xMS4xLTE5LjZsLTM0LjEtOS4zIDM5LjItMjNjNy41LTQuNCAxMC4xLTE0LjIgNS44LTIxLjlsLTcuOS0xMy45Yy00LjMtNy43LTE0LTEwLjMtMjEuNS01LjlsLTM5LjIgMjMgOS4xLTM0LjdjMi4yLTguNS0yLjctMTcuMy0xMS4xLTE5LjZsLTE1LjItNC4xYy04LjQtMi4zLTE3IDIuOC0xOS4zIDExLjNsLTIxLjMgODEtNzEuOSA0Mi4ydi04NC41TDMwNiA3MC40YzYuMS02LjIgNi4xLTE2LjQgMC0yMi42bC0xMS4xLTExLjNjLTYuMS02LjItMTYuMS02LjItMjIuMiAwbC0yNC45IDI1LjRWMTZjMC04LjgtNy0xNi0xNS43LTE2aC0xNS43Yy04LjcgMC0xNS43IDcuMi0xNS43IDE2djQ2LjFsLTI0LjktMjUuNGMtNi4xLTYuMi0xNi4xLTYuMi0yMi4yIDBMMTQyLjEgNDhjLTYuMSA2LjItNi4xIDE2LjQgMCAyMi42bDU4LjMgNTkuM3Y4NC41bC03MS45LTQyLjItMjEuMy04MWMtMi4yLTguNS0xMC45LTEzLjYtMTkuMy0xMS4zTDcyLjcgODRjLTguNCAyLjMtMTMuNCAxMS4xLTExLjEgMTkuNmw5LjEgMzQuNy0zOS4yLTIzYy03LjUtNC40LTE3LjEtMS44LTIxLjUgNS45bC03LjkgMTMuOWMtNC4zIDcuNy0xLjggMTcuNCA1LjggMjEuOWwzOS4yIDIzLTM0LjEgOS4xYy04LjQgMi4zLTEzLjQgMTEuMS0xMS4xIDE5LjZMNiAyMjQuMmMyLjIgOC41IDEwLjkgMTMuNiAxOS4zIDExLjNsNzkuNy0yMS43IDcxLjkgNDIuMi03MS45IDQyLjItNzkuNy0yMS43Yy04LjQtMi4zLTE3IDIuOC0xOS4zIDExLjNsLTQuMSAxNS41Yy0yLjIgOC41IDIuNyAxNy4zIDExLjEgMTkuNmwzNC4xIDkuMy0zOS4yIDIzYy03LjUgNC40LTEwLjEgMTQuMi01LjggMjEuOUwxMCAzOTFjNC4zIDcuNyAxNCAxMC4zIDIxLjUgNS45bDM5LjItMjMtOS4xIDM0LjdjLTIuMiA4LjUgMi43IDE3LjMgMTEuMSAxOS42bDE1LjIgNC4xYzguNCAyLjMgMTctMi44IDE5LjMtMTEuM2wyMS4zLTgxIDcxLjktNDIuMnY4NC41bC01OC4zIDU5LjNjLTYuMSA2LjItNi4xIDE2LjQgMCAyMi42bDExLjEgMTEuM2M2LjEgNi4yIDE2LjEgNi4yIDIyLjIgMGwyNC45LTI1LjRWNDk2YzAgOC44IDcgMTYgMTUuNyAxNmgxNS43YzguNyAwIDE1LjctNy4yIDE1LjctMTZ2LTQ2LjFsMjQuOSAyNS40YzYuMSA2LjIgMTYuMSA2LjIgMjIuMiAwbDExLjEtMTEuM2M2LjEtNi4yIDYuMS0xNi40IDAtMjIuNmwtNTguMy01OS4zdi04NC41bDcxLjkgNDIuMiAyMS4zIDgxYzIuMiA4LjUgMTAuOSAxMy42IDE5LjMgMTEuM0wzNzUgNDI4YzguNC0yLjMgMTMuNC0xMS4xIDExLjEtMTkuNmwtOS4xLTM0LjcgMzkuMiAyM2M3LjUgNC40IDE3LjEgMS44IDIxLjUtNS45bDcuOS0xMy45YzQuNi03LjUgMi4xLTE3LjMtNS41LTIxLjd6XCIgLz5cbiAgICAgICAgPC9JY29uQmFzZT5cbiAgICAgICIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsICJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihmKSB7XG4gIGxldCBkZWx0YSA9IGY7XG4gIGxldCBjb21wYXJlID0gZjtcblxuICBpZiAoZi5sZW5ndGggPT09IDEpIHtcbiAgICBkZWx0YSA9IChkLCB4KSA9PiBmKGQpIC0geDtcbiAgICBjb21wYXJlID0gYXNjZW5kaW5nQ29tcGFyYXRvcihmKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlZnQoYSwgeCwgbG8sIGhpKSB7XG4gICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTtcbiAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJpZ2h0KGEsIHgsIGxvLCBoaSkge1xuICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7XG4gICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7XG4gICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDtcbiAgICAgIGVsc2UgbG8gPSBtaWQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gbG87XG4gIH1cblxuICBmdW5jdGlvbiBjZW50ZXIoYSwgeCwgbG8sIGhpKSB7XG4gICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICBjb25zdCBpID0gbGVmdChhLCB4LCBsbywgaGkgLSAxKTtcbiAgICByZXR1cm4gaSA+IGxvICYmIGRlbHRhKGFbaSAtIDFdLCB4KSA+IC1kZWx0YShhW2ldLCB4KSA/IGkgLSAxIDogaTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgY2VudGVyLCByaWdodH07XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoZikge1xuICByZXR1cm4gKGQsIHgpID0+IGFzY2VuZGluZyhmKGQpLCB4KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5pbXBvcnQgYmlzZWN0b3IgZnJvbSBcIi4vYmlzZWN0b3IuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbmNvbnN0IGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7XG5leHBvcnQgY29uc3QgYmlzZWN0UmlnaHQgPSBhc2NlbmRpbmdCaXNlY3QucmlnaHQ7XG5leHBvcnQgY29uc3QgYmlzZWN0TGVmdCA9IGFzY2VuZGluZ0Jpc2VjdC5sZWZ0O1xuZXhwb3J0IGNvbnN0IGJpc2VjdENlbnRlciA9IGJpc2VjdG9yKG51bWJlcikuY2VudGVyO1xuZXhwb3J0IGRlZmF1bHQgYmlzZWN0UmlnaHQ7XG4iLCAidmFyIGUxMCA9IE1hdGguc3FydCg1MCksXG4gICAgZTUgPSBNYXRoLnNxcnQoMTApLFxuICAgIGUyID0gTWF0aC5zcXJ0KDIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgdmFyIHJldmVyc2UsXG4gICAgICBpID0gLTEsXG4gICAgICBuLFxuICAgICAgdGlja3MsXG4gICAgICBzdGVwO1xuXG4gIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50O1xuICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSByZXR1cm4gW3N0YXJ0XTtcbiAgaWYgKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpIG4gPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gbjtcbiAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTtcblxuICBpZiAoc3RlcCA+IDApIHtcbiAgICBsZXQgcjAgPSBNYXRoLnJvdW5kKHN0YXJ0IC8gc3RlcCksIHIxID0gTWF0aC5yb3VuZChzdG9wIC8gc3RlcCk7XG4gICAgaWYgKHIwICogc3RlcCA8IHN0YXJ0KSArK3IwO1xuICAgIGlmIChyMSAqIHN0ZXAgPiBzdG9wKSAtLXIxO1xuICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSByMSAtIHIwICsgMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHIwICsgaSkgKiBzdGVwO1xuICB9IGVsc2Uge1xuICAgIHN0ZXAgPSAtc3RlcDtcbiAgICBsZXQgcjAgPSBNYXRoLnJvdW5kKHN0YXJ0ICogc3RlcCksIHIxID0gTWF0aC5yb3VuZChzdG9wICogc3RlcCk7XG4gICAgaWYgKHIwIC8gc3RlcCA8IHN0YXJ0KSArK3IwO1xuICAgIGlmIChyMSAvIHN0ZXAgPiBzdG9wKSAtLXIxO1xuICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSByMSAtIHIwICsgMSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHIwICsgaSkgLyBzdGVwO1xuICB9XG5cbiAgaWYgKHJldmVyc2UpIHRpY2tzLnJldmVyc2UoKTtcblxuICByZXR1cm4gdGlja3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXApIC8gTWF0aC5MTjEwKSxcbiAgICAgIGVycm9yID0gc3RlcCAvIE1hdGgucG93KDEwLCBwb3dlcik7XG4gIHJldHVybiBwb3dlciA+PSAwXG4gICAgICA/IChlcnJvciA+PSBlMTAgPyAxMCA6IGVycm9yID49IGU1ID8gNSA6IGVycm9yID49IGUyID8gMiA6IDEpICogTWF0aC5wb3coMTAsIHBvd2VyKVxuICAgICAgOiAtTWF0aC5wb3coMTAsIC1wb3dlcikgLyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLFxuICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSxcbiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTtcbiAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7XG4gIGVsc2UgaWYgKGVycm9yID49IGU1KSBzdGVwMSAqPSA1O1xuICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjtcbiAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuICBzdGFydCA9ICtzdGFydCwgc3RvcCA9ICtzdG9wLCBzdGVwID0gKG4gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDIgPyAoc3RvcCA9IHN0YXJ0LCBzdGFydCA9IDAsIDEpIDogbiA8IDMgPyAxIDogK3N0ZXA7XG5cbiAgdmFyIGkgPSAtMSxcbiAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSkgfCAwLFxuICAgICAgcmFuZ2UgPSBuZXcgQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICByYW5nZVtpXSA9IHN0YXJ0ICsgaSAqIHN0ZXA7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59XG4iLCAidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCAiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwgImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbn1cbiIsICJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwgImZ1bmN0aW9uIG5vbmUoKSB7fVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiB4XG4gICAgPyB4IC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbSh4KTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsICJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGdyb3VwID0gc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGdyb3VwID09IG51bGwgPyBbXSA6IGFycmF5KGdyb3VwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwgImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwgImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcblxuZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gIHJldHVybiB0aGlzLmNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkZpbHRlcihtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKG1hdGNoID09IG51bGwgPyBjaGlsZHJlblxuICAgICAgOiBjaGlsZHJlbkZpbHRlcih0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odXBkYXRlKSB7XG4gIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7XG59XG4iLCAiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9uXHUyMDE5dCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5KHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuIiwgImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBlbnRlciA9IHR5cGVvZiBvbmVudGVyID09PSBcImZ1bmN0aW9uXCIgPyBvbmVudGVyKGVudGVyKSA6IGVudGVyLmFwcGVuZChvbmVudGVyICsgXCJcIik7XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpO1xuICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpO1xuICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rpb24pIHtcbiAgaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uKSkgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBtZXJnZVwiKTtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCAiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCAiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsICJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsICJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwgImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCAiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5mdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSxcbiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwgImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwgImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsICJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwgImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCAiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbihldmVudCkge1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3R9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2V2ZW50IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmlldykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbm9ldmVudCwgdHJ1ZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG51bGwpOyB9LCAwKTtcbiAgfVxuICBpZiAoXCJvbnNlbGVjdHN0YXJ0XCIgaW4gcm9vdCkge1xuICAgIHNlbGVjdGlvbi5vbihcInNlbGVjdHN0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gcm9vdC5fX25vc2VsZWN0O1xuICAgIGRlbGV0ZSByb290Ll9fbm9zZWxlY3Q7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRHJhZ0V2ZW50KHR5cGUsIHtcbiAgc291cmNlRXZlbnQsXG4gIHN1YmplY3QsXG4gIHRhcmdldCxcbiAgaWRlbnRpZmllcixcbiAgYWN0aXZlLFxuICB4LCB5LCBkeCwgZHksXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc3ViamVjdDoge3ZhbHVlOiBzdWJqZWN0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRhcmdldDoge3ZhbHVlOiB0YXJnZXQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgaWRlbnRpZmllcjoge3ZhbHVlOiBpZGVudGlmaWVyLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGFjdGl2ZToge3ZhbHVlOiBhY3RpdmUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgeDoge3ZhbHVlOiB4LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHk6IHt2YWx1ZTogeSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBkeDoge3ZhbHVlOiBkeCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBkeToge3ZhbHVlOiBkeSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBfOiB7dmFsdWU6IGRpc3BhdGNofVxuICB9KTtcbn1cblxuRHJhZ0V2ZW50LnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdmFsdWUgPSB0aGlzLl8ub24uYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdmFsdWUgPT09IHRoaXMuXyA/IHRoaXMgOiB2YWx1ZTtcbn07XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZHJhZywge3llc2RyYWd9IGZyb20gXCIuL25vZHJhZy5qc1wiO1xuaW1wb3J0IG5vZXZlbnQsIHtub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBEcmFnRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29udGFpbmVyKCkge1xuICByZXR1cm4gdGhpcy5wYXJlbnROb2RlO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U3ViamVjdChldmVudCwgZCkge1xuICByZXR1cm4gZCA9PSBudWxsID8ge3g6IGV2ZW50LngsIHk6IGV2ZW50Lnl9IDogZDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgY29udGFpbmVyID0gZGVmYXVsdENvbnRhaW5lcixcbiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBnZXN0dXJlcyA9IHt9LFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImRyYWdcIiwgXCJlbmRcIiksXG4gICAgICBhY3RpdmUgPSAwLFxuICAgICAgbW91c2Vkb3dueCxcbiAgICAgIG1vdXNlZG93bnksXG4gICAgICBtb3VzZW1vdmluZyxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwO1xuXG4gIGZ1bmN0aW9uIGRyYWcoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi5kcmFnXCIsIG1vdXNlZG93bmVkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuZHJhZ1wiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5kcmFnXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZ1wiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgZCkge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmNhbGwodGhpcywgZXZlbnQsIGQpKSByZXR1cm47XG4gICAgdmFyIGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0aGlzLCBjb250YWluZXIuY2FsbCh0aGlzLCBldmVudCwgZCksIGV2ZW50LCBkLCBcIm1vdXNlXCIpO1xuICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuO1xuICAgIHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS5kcmFnXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC5kcmFnXCIsIG1vdXNldXBwZWQsIHRydWUpO1xuICAgIG5vZHJhZyhldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBtb3VzZW1vdmluZyA9IGZhbHNlO1xuICAgIG1vdXNlZG93bnggPSBldmVudC5jbGllbnRYO1xuICAgIG1vdXNlZG93bnkgPSBldmVudC5jbGllbnRZO1xuICAgIGdlc3R1cmUoXCJzdGFydFwiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKCFtb3VzZW1vdmluZykge1xuICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIG1vdXNlZG93bngsIGR5ID0gZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7XG4gICAgICBtb3VzZW1vdmluZyA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgfVxuICAgIGdlc3R1cmVzLm1vdXNlKFwiZHJhZ1wiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnXCIsIG51bGwpO1xuICAgIHllc2RyYWcoZXZlbnQudmlldywgbW91c2Vtb3ZpbmcpO1xuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGdlc3R1cmVzLm1vdXNlKFwiZW5kXCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgZCkge1xuICAgIGlmICghZmlsdGVyLmNhbGwodGhpcywgZXZlbnQsIGQpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgYyA9IGNvbnRhaW5lci5jYWxsKHRoaXMsIGV2ZW50LCBkKSxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0aGlzLCBjLCBldmVudCwgZCwgdG91Y2hlc1tpXS5pZGVudGlmaWVyLCB0b3VjaGVzW2ldKSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcInN0YXJ0XCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50KSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwiZHJhZ1wiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCkge1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTtcblxuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIVxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcImVuZFwiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYmVmb3Jlc3RhcnQodGhhdCwgY29udGFpbmVyLCBldmVudCwgZCwgaWRlbnRpZmllciwgdG91Y2gpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBsaXN0ZW5lcnMuY29weSgpLFxuICAgICAgICBwID0gcG9pbnRlcih0b3VjaCB8fCBldmVudCwgY29udGFpbmVyKSwgZHgsIGR5LFxuICAgICAgICBzO1xuXG4gICAgaWYgKChzID0gc3ViamVjdC5jYWxsKHRoYXQsIG5ldyBEcmFnRXZlbnQoXCJiZWZvcmVzdGFydFwiLCB7XG4gICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgdGFyZ2V0OiBkcmFnLFxuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIHg6IHBbMF0sXG4gICAgICAgIHk6IHBbMV0sXG4gICAgICAgIGR4OiAwLFxuICAgICAgICBkeTogMCxcbiAgICAgICAgZGlzcGF0Y2hcbiAgICAgIH0pLCBkKSkgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgZHggPSBzLnggLSBwWzBdIHx8IDA7XG4gICAgZHkgPSBzLnkgLSBwWzFdIHx8IDA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZ2VzdHVyZSh0eXBlLCBldmVudCwgdG91Y2gpIHtcbiAgICAgIHZhciBwMCA9IHAsIG47XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0YXJ0XCI6IGdlc3R1cmVzW2lkZW50aWZpZXJdID0gZ2VzdHVyZSwgbiA9IGFjdGl2ZSsrOyBicmVhaztcbiAgICAgICAgY2FzZSBcImVuZFwiOiBkZWxldGUgZ2VzdHVyZXNbaWRlbnRpZmllcl0sIC0tYWN0aXZlOyAvLyBub2JyZWFrXG4gICAgICAgIGNhc2UgXCJkcmFnXCI6IHAgPSBwb2ludGVyKHRvdWNoIHx8IGV2ZW50LCBjb250YWluZXIpLCBuID0gYWN0aXZlOyBicmVhaztcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoYXQsXG4gICAgICAgIG5ldyBEcmFnRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICBzdWJqZWN0OiBzLFxuICAgICAgICAgIHRhcmdldDogZHJhZyxcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGFjdGl2ZTogbixcbiAgICAgICAgICB4OiBwWzBdICsgZHgsXG4gICAgICAgICAgeTogcFsxXSArIGR5LFxuICAgICAgICAgIGR4OiBwWzBdIC0gcDBbMF0sXG4gICAgICAgICAgZHk6IHBbMV0gLSBwMFsxXSxcbiAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgZHJhZy5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBkcmFnKSA6IGZpbHRlcjtcbiAgfTtcblxuICBkcmFnLmNvbnRhaW5lciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250YWluZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBkcmFnKSA6IGNvbnRhaW5lcjtcbiAgfTtcblxuICBkcmFnLnN1YmplY3QgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ViamVjdCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogc3ViamVjdDtcbiAgfTtcblxuICBkcmFnLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIGRyYWcub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gZHJhZyA6IHZhbHVlO1xuICB9O1xuXG4gIGRyYWcuY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgZHJhZykgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHJldHVybiBkcmFnO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwgImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZUksIHJlSSwgcmVJXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xcXFxcKFwiICsgW3JlTiwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJeaHNsYVxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArIFwiXFxcXCkkXCIpO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5OiBmdW5jdGlvbihjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBcIiNcIiArIGhleCh0aGlzLnIpICsgaGV4KHRoaXMuZykgKyBoZXgodGhpcy5iKTtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7XG4gIHJldHVybiAoYSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwiKVxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgXCIsIFwiXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmIpIHx8IDApKVxuICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgICByZXR1cm4gKGEgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIilcbiAgICAgICAgKyAodGhpcy5oIHx8IDApICsgXCIsIFwiXG4gICAgICAgICsgKHRoaXMucyB8fCAwKSAqIDEwMCArIFwiJSwgXCJcbiAgICAgICAgKyAodGhpcy5sIHx8IDApICogMTAwICsgXCIlXCJcbiAgICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbiAgfVxufSkpO1xuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCAiZXhwb3J0IGNvbnN0IHJhZGlhbnMgPSBNYXRoLlBJIC8gMTgwO1xuZXhwb3J0IGNvbnN0IGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuIiwgImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuaW1wb3J0IHtDb2xvciwgcmdiQ29udmVydCwgUmdiLCBkYXJrZXIsIGJyaWdodGVyfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuaW1wb3J0IHtkZWdyZWVzLCByYWRpYW5zfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbnZhciBBID0gLTAuMTQ4NjEsXG4gICAgQiA9ICsxLjc4Mjc3LFxuICAgIEMgPSAtMC4yOTIyNyxcbiAgICBEID0gLTAuOTA2NDksXG4gICAgRSA9ICsxLjk3Mjk0LFxuICAgIEVEID0gRSAqIEQsXG4gICAgRUIgPSBFICogQixcbiAgICBCQ19EQSA9IEIgKiBDIC0gRCAqIEE7XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEN1YmVoZWxpeCkgcmV0dXJuIG5ldyBDdWJlaGVsaXgoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbCA9IChCQ19EQSAqIGIgKyBFRCAqIHIgLSBFQiAqIGcpIC8gKEJDX0RBICsgRUQgLSBFQiksXG4gICAgICBibCA9IGIgLSBsLFxuICAgICAgayA9IChFICogKGcgLSBsKSAtIEMgKiBibCkgLyBELFxuICAgICAgcyA9IE1hdGguc3FydChrICogayArIGJsICogYmwpIC8gKEUgKiBsICogKDEgLSBsKSksIC8vIE5hTiBpZiBsPTAgb3IgbD0xXG4gICAgICBoID0gcyA/IE1hdGguYXRhbjIoaywgYmwpICogZGVncmVlcyAtIDEyMCA6IE5hTjtcbiAgcmV0dXJuIG5ldyBDdWJlaGVsaXgoaCA8IDAgPyBoICsgMzYwIDogaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjdWJlaGVsaXhDb252ZXJ0KGgpIDogbmV3IEN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIHJhZGlhbnMsXG4gICAgICAgIGwgPSArdGhpcy5sLFxuICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSxcbiAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLFxuICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICAyNTUgKiAobCArIGEgKiAoQSAqIGNvc2ggKyBCICogc2luaCkpLFxuICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSxcbiAgICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfVxufSkpO1xuIiwgImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsICJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIGlmICghYikgYiA9IFtdO1xuICB2YXIgbiA9IGEgPyBNYXRoLm1pbihiLmxlbmd0aCwgYS5sZW5ndGgpIDogMCxcbiAgICAgIGMgPSBiLnNsaWNlKCksXG4gICAgICBpO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNbaV0gPSBhW2ldICogKDEgLSB0KSArIGJbaV0gKiB0O1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJBcnJheSh4KSB7XG4gIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoeCkgJiYgISh4IGluc3RhbmNlb2YgRGF0YVZpZXcpO1xufVxuIiwgImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gKGlzTnVtYmVyQXJyYXkoYikgPyBudW1iZXJBcnJheSA6IGdlbmVyaWNBcnJheSkoYSwgYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljQXJyYXkoYSwgYikge1xuICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLFxuICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsXG4gICAgICB4ID0gbmV3IEFycmF5KG5hKSxcbiAgICAgIGMgPSBuZXcgQXJyYXkobmIpLFxuICAgICAgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgeFtpXSA9IHZhbHVlKGFbaV0sIGJbaV0pO1xuICBmb3IgKDsgaSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldO1xuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZTtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGQuc2V0VGltZShhICogKDEgLSB0KSArIGIgKiB0KSwgZDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwgImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBpID0ge30sXG4gICAgICBjID0ge30sXG4gICAgICBrO1xuXG4gIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSBcIm9iamVjdFwiKSBhID0ge307XG4gIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSBiID0ge307XG5cbiAgZm9yIChrIGluIGIpIHtcbiAgICBpZiAoayBpbiBhKSB7XG4gICAgICBpW2tdID0gdmFsdWUoYVtrXSwgYltrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNba10gPSBiW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwgImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCAiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgcmdiIGZyb20gXCIuL3JnYi5qc1wiO1xuaW1wb3J0IHtnZW5lcmljQXJyYXl9IGZyb20gXCIuL2FycmF5LmpzXCI7XG5pbXBvcnQgZGF0ZSBmcm9tIFwiLi9kYXRlLmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IG9iamVjdCBmcm9tIFwiLi9vYmplY3QuanNcIjtcbmltcG9ydCBzdHJpbmcgZnJvbSBcIi4vc3RyaW5nLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBudW1iZXJBcnJheSwge2lzTnVtYmVyQXJyYXl9IGZyb20gXCIuL251bWJlckFycmF5LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIHQgPSB0eXBlb2YgYiwgYztcbiAgcmV0dXJuIGIgPT0gbnVsbCB8fCB0ID09PSBcImJvb2xlYW5cIiA/IGNvbnN0YW50KGIpXG4gICAgICA6ICh0ID09PSBcIm51bWJlclwiID8gbnVtYmVyXG4gICAgICA6IHQgPT09IFwic3RyaW5nXCIgPyAoKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIHJnYikgOiBzdHJpbmcpXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IHJnYlxuICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVcbiAgICAgIDogaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5XG4gICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJyYXlcbiAgICAgIDogdHlwZW9mIGIudmFsdWVPZiAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSBcImZ1bmN0aW9uXCIgfHwgaXNOYU4oYikgPyBvYmplY3RcbiAgICAgIDogbnVtYmVyKShhLCBiKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKiAoMSAtIHQpICsgYiAqIHQpO1xuICB9O1xufVxuIiwgInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwgImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsICJpbXBvcnQgbnVtYmVyIGZyb20gXCIuLi9udW1iZXIuanNcIjtcbmltcG9ydCB7cGFyc2VDc3MsIHBhcnNlU3ZnfSBmcm9tIFwiLi9wYXJzZS5qc1wiO1xuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHtcblxuICBmdW5jdGlvbiBwb3Aocykge1xuICAgIHJldHVybiBzLmxlbmd0aCA/IHMucG9wKCkgKyBcIiBcIiA6IFwiXCI7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiB8fCB5Yikge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGhcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkge1xuICAgIGlmIChhICE9PSBiKSB7XG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTtcbiAgICB9IGVsc2UgaWYgKGIpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNrZXdYKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiLCBudWxsLCBcIixcIiwgbnVsbCwgXCIpXCIpO1xuICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7XG4gICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIgKyB4YiArIFwiLFwiICsgeWIgKyBcIilcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9yc1xuICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpO1xuICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpO1xuICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpO1xuICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7IC8vIGdjXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgXCJweCwgXCIsIFwicHgpXCIsIFwiZGVnKVwiKTtcbmV4cG9ydCB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywgXCIsIFwiLCBcIilcIiwgXCIpXCIpO1xuIiwgInZhciBlcHNpbG9uMiA9IDFlLTEyO1xuXG5mdW5jdGlvbiBjb3NoKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHNpbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gdGFuaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gem9vbVJobyhyaG8sIHJobzIsIHJobzQpIHtcblxuICAvLyBwMCA9IFt1eDAsIHV5MCwgdzBdXG4gIC8vIHAxID0gW3V4MSwgdXkxLCB3MV1cbiAgZnVuY3Rpb24gem9vbShwMCwgcDEpIHtcbiAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLFxuICAgICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sXG4gICAgICAgIGR4ID0gdXgxIC0gdXgwLFxuICAgICAgICBkeSA9IHV5MSAtIHV5MCxcbiAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgICAgaSxcbiAgICAgICAgUztcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAgXHUyMjQ1IHUxLlxuICAgIGlmIChkMiA8IGVwc2lsb24yKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHQgKiBkeCxcbiAgICAgICAgICB1eTAgKyB0ICogZHksXG4gICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8gKiB0ICogUylcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmFsIGNhc2UuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLFxuICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLFxuICAgICAgICAgIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gcmhvNCAqIGQyKSAvICgyICogdzEgKiByaG8yICogZDEpLFxuICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSxcbiAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUyxcbiAgICAgICAgICAgIGNvc2hyMCA9IGNvc2gocjApLFxuICAgICAgICAgICAgdSA9IHcwIC8gKHJobzIgKiBkMSkgKiAoY29zaHIwICogdGFuaChyaG8gKiBzICsgcjApIC0gc2luaChyMCkpO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHV4MCArIHUgKiBkeCxcbiAgICAgICAgICB1eTAgKyB1ICogZHksXG4gICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDAgKiByaG8gLyBNYXRoLlNRUlQyO1xuXG4gICAgcmV0dXJuIGk7XG4gIH1cblxuICB6b29tLnJobyA9IGZ1bmN0aW9uKF8pIHtcbiAgICB2YXIgXzEgPSBNYXRoLm1heCgxZS0zLCArXyksIF8yID0gXzEgKiBfMSwgXzQgPSBfMiAqIF8yO1xuICAgIHJldHVybiB6b29tUmhvKF8xLCBfMiwgXzQpO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufSkoTWF0aC5TUVJUMiwgMiwgNCk7XG4iLCAiaW1wb3J0IHtjdWJlaGVsaXggYXMgY29sb3JDdWJlaGVsaXh9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGNvbG9yLCB7aHVlfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5mdW5jdGlvbiBjdWJlaGVsaXgoaHVlKSB7XG4gIHJldHVybiAoZnVuY3Rpb24gY3ViZWhlbGl4R2FtbWEoeSkge1xuICAgIHkgPSAreTtcblxuICAgIGZ1bmN0aW9uIGN1YmVoZWxpeChzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjb2xvckN1YmVoZWxpeChzdGFydCkpLmgsIChlbmQgPSBjb2xvckN1YmVoZWxpeChlbmQpKS5oKSxcbiAgICAgICAgICBzID0gY29sb3Ioc3RhcnQucywgZW5kLnMpLFxuICAgICAgICAgIGwgPSBjb2xvcihzdGFydC5sLCBlbmQubCksXG4gICAgICAgICAgb3BhY2l0eSA9IGNvbG9yKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHN0YXJ0LmggPSBoKHQpO1xuICAgICAgICBzdGFydC5zID0gcyh0KTtcbiAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpO1xuICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY3ViZWhlbGl4LmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7XG5cbiAgICByZXR1cm4gY3ViZWhlbGl4O1xuICB9KSgxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3ViZWhlbGl4KGh1ZSk7XG5leHBvcnQgdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgoY29sb3IpO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGludGVycG9sYXRvciwgbikge1xuICB2YXIgc2FtcGxlcyA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNhbXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpO1xuICByZXR1cm4gc2FtcGxlcztcbn1cbiIsICJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2VcdTIwMTl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVuXHUyMDE5dCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpO1xuICAgIHQgPSB0Ll9uZXh0O1xuICB9XG4gIC0tZnJhbWU7XG59XG5cbmZ1bmN0aW9uIHdha2UoKSB7XG4gIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldztcbiAgZnJhbWUgPSB0aW1lb3V0ID0gMDtcbiAgdHJ5IHtcbiAgICB0aW1lckZsdXNoKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZnJhbWUgPSAwO1xuICAgIG5hcCgpO1xuICAgIGNsb2NrTm93ID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb2tlKCkge1xuICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0O1xuICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93O1xufVxuXG5mdW5jdGlvbiBuYXAoKSB7XG4gIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUgPSBJbmZpbml0eTtcbiAgd2hpbGUgKHQxKSB7XG4gICAgaWYgKHQxLl9jYWxsKSB7XG4gICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7XG4gICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7XG4gICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkID0gdDI7XG4gICAgfVxuICB9XG4gIHRhc2tUYWlsID0gdDA7XG4gIHNsZWVwKHRpbWUpO1xufVxuXG5mdW5jdGlvbiBzbGVlcCh0aW1lKSB7XG4gIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLlxuICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy5cbiAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpO1xuICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpO1xuICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7XG4gIH1cbn1cbiIsICJpbXBvcnQge1RpbWVyfSBmcm9tIFwiLi90aW1lci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7XG4gIHQucmVzdGFydChlbGFwc2VkID0+IHtcbiAgICB0LnN0b3AoKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7U1RBUlRJTkcsIEVORElORywgRU5ERUR9IGZyb20gXCIuL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSkge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICBzY2hlZHVsZSxcbiAgICAgIGFjdGl2ZSxcbiAgICAgIGVtcHR5ID0gdHJ1ZSxcbiAgICAgIGk7XG5cbiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjtcblxuICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuXG4gIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9XG4gICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORztcbiAgICBzY2hlZHVsZS5zdGF0ZSA9IEVOREVEO1xuICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTtcbiAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/IFwiaW50ZXJydXB0XCIgOiBcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gIH1cblxuICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbn1cbiIsICJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUmdiLCBpbnRlcnBvbGF0ZVN0cmluZ30gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGM7XG4gIHJldHVybiAodHlwZW9mIGIgPT09IFwibnVtYmVyXCIgPyBpbnRlcnBvbGF0ZU51bWJlclxuICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYlxuICAgICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpXG4gICAgICA6IGludGVycG9sYXRlU3RyaW5nKShhLCBiKTtcbn1cbiIsICJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb25cbiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5O1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsICJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHR5cGVvZiB2ICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMuZWFjaChlYXNlVmFyeWluZyh0aGlzLl9pZCwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge21hdGNoZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsICJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBzdGFydChuYW1lKSB7XG4gIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykuZXZlcnkoZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4gIXQgfHwgdCA9PT0gXCJzdGFydFwiO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQ7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDJcbiAgICAgID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSlcbiAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7XG59XG4iLCAiZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9uKFwiZW5kLnJlbW92ZVwiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdG9yQWxsfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPSBjaGlsZHJlbltrXSkge1xuICAgICAgICAgICAgc2NoZWR1bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCAiZnVuY3Rpb24gc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaS5jYWxsKHRoaXMsIHQpLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciB0LCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdCA9IChpMCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIga2V5ID0gXCJzdHlsZS5cIiArIChuYW1lICs9IFwiXCIpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpO1xufVxuIiwgImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsICJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkMCA9IHRoaXMuX2lkLFxuICAgICAgaWQxID0gbmV3SWQoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApO1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7XG4gICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZGVsYXk6IDAsXG4gICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7XG59XG4iLCAiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LFxuICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19O1xuXG4gICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgICAgaWYgKG9uICE9PSBvbjApIHtcbiAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7XG4gICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5XG4gICAgaWYgKHNpemUgPT09IDApIHJlc29sdmUoKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsXG4gIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sXG4gIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLFxuICBvbjogdHJhbnNpdGlvbl9vbixcbiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLFxuICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLFxuICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSxcbiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLFxuICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsXG4gIHRleHRUd2VlbjogdHJhbnNpdGlvbl90ZXh0VHdlZW4sXG4gIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsXG4gIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLFxuICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sXG4gIGVhc2U6IHRyYW5zaXRpb25fZWFzZSxcbiAgZWFzZVZhcnlpbmc6IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcsXG4gIGVuZDogdHJhbnNpdGlvbl9lbmQsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25fcHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1cbn07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge2RyYWdEaXNhYmxlLCBkcmFnRW5hYmxlfSBmcm9tIFwiZDMtZHJhZ1wiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3BvaW50ZXIsIHNlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBCcnVzaEV2ZW50IGZyb20gXCIuL2V2ZW50LmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxudmFyIE1PREVfRFJBRyA9IHtuYW1lOiBcImRyYWdcIn0sXG4gICAgTU9ERV9TUEFDRSA9IHtuYW1lOiBcInNwYWNlXCJ9LFxuICAgIE1PREVfSEFORExFID0ge25hbWU6IFwiaGFuZGxlXCJ9LFxuICAgIE1PREVfQ0VOVEVSID0ge25hbWU6IFwiY2VudGVyXCJ9O1xuXG5jb25zdCB7YWJzLCBtYXgsIG1pbn0gPSBNYXRoO1xuXG5mdW5jdGlvbiBudW1iZXIxKGUpIHtcbiAgcmV0dXJuIFsrZVswXSwgK2VbMV1dO1xufVxuXG5mdW5jdGlvbiBudW1iZXIyKGUpIHtcbiAgcmV0dXJuIFtudW1iZXIxKGVbMF0pLCBudW1iZXIxKGVbMV0pXTtcbn1cblxudmFyIFggPSB7XG4gIG5hbWU6IFwieFwiLFxuICBoYW5kbGVzOiBbXCJ3XCIsIFwiZVwiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih4LCBlKSB7IHJldHVybiB4ID09IG51bGwgPyBudWxsIDogW1sreFswXSwgZVswXVsxXV0sIFsreFsxXSwgZVsxXVsxXV1dOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMF0sIHh5WzFdWzBdXTsgfVxufTtcblxudmFyIFkgPSB7XG4gIG5hbWU6IFwieVwiLFxuICBoYW5kbGVzOiBbXCJuXCIsIFwic1wiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih5LCBlKSB7IHJldHVybiB5ID09IG51bGwgPyBudWxsIDogW1tlWzBdWzBdLCAreVswXV0sIFtlWzFdWzBdLCAreVsxXV1dOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMV0sIHh5WzFdWzFdXTsgfVxufTtcblxudmFyIFhZID0ge1xuICBuYW1lOiBcInh5XCIsXG4gIGhhbmRsZXM6IFtcIm5cIiwgXCJ3XCIsIFwiZVwiLCBcInNcIiwgXCJud1wiLCBcIm5lXCIsIFwic3dcIiwgXCJzZVwiXS5tYXAodHlwZSksXG4gIGlucHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgPT0gbnVsbCA/IG51bGwgOiBudW1iZXIyKHh5KTsgfSxcbiAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHk7IH1cbn07XG5cbnZhciBjdXJzb3JzID0ge1xuICBvdmVybGF5OiBcImNyb3NzaGFpclwiLFxuICBzZWxlY3Rpb246IFwibW92ZVwiLFxuICBuOiBcIm5zLXJlc2l6ZVwiLFxuICBlOiBcImV3LXJlc2l6ZVwiLFxuICBzOiBcIm5zLXJlc2l6ZVwiLFxuICB3OiBcImV3LXJlc2l6ZVwiLFxuICBudzogXCJud3NlLXJlc2l6ZVwiLFxuICBuZTogXCJuZXN3LXJlc2l6ZVwiLFxuICBzZTogXCJud3NlLXJlc2l6ZVwiLFxuICBzdzogXCJuZXN3LXJlc2l6ZVwiXG59O1xuXG52YXIgZmxpcFggPSB7XG4gIGU6IFwid1wiLFxuICB3OiBcImVcIixcbiAgbnc6IFwibmVcIixcbiAgbmU6IFwibndcIixcbiAgc2U6IFwic3dcIixcbiAgc3c6IFwic2VcIlxufTtcblxudmFyIGZsaXBZID0ge1xuICBuOiBcInNcIixcbiAgczogXCJuXCIsXG4gIG53OiBcInN3XCIsXG4gIG5lOiBcInNlXCIsXG4gIHNlOiBcIm5lXCIsXG4gIHN3OiBcIm53XCJcbn07XG5cbnZhciBzaWduc1ggPSB7XG4gIG92ZXJsYXk6ICsxLFxuICBzZWxlY3Rpb246ICsxLFxuICBuOiBudWxsLFxuICBlOiArMSxcbiAgczogbnVsbCxcbiAgdzogLTEsXG4gIG53OiAtMSxcbiAgbmU6ICsxLFxuICBzZTogKzEsXG4gIHN3OiAtMVxufTtcblxudmFyIHNpZ25zWSA9IHtcbiAgb3ZlcmxheTogKzEsXG4gIHNlbGVjdGlvbjogKzEsXG4gIG46IC0xLFxuICBlOiBudWxsLFxuICBzOiArMSxcbiAgdzogbnVsbCxcbiAgbnc6IC0xLFxuICBuZTogLTEsXG4gIHNlOiArMSxcbiAgc3c6ICsxXG59O1xuXG5mdW5jdGlvbiB0eXBlKHQpIHtcbiAgcmV0dXJuIHt0eXBlOiB0fTtcbn1cblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgc3ZnID0gdGhpcy5vd25lclNWR0VsZW1lbnQgfHwgdGhpcztcbiAgaWYgKHN2Zy5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgc3ZnID0gc3ZnLnZpZXdCb3guYmFzZVZhbDtcbiAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBzdmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbc3ZnLndpZHRoLmJhc2VWYWwudmFsdWUsIHN2Zy5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG4vLyBMaWtlIGQzLmxvY2FsLCBidXQgd2l0aCB0aGUgbmFtZSBcdTIwMUNfX2JydXNoXHUyMDFEIHJhdGhlciB0aGFuIGF1dG8tZ2VuZXJhdGVkLlxuZnVuY3Rpb24gbG9jYWwobm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX19icnVzaCkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjtcbiAgcmV0dXJuIG5vZGUuX19icnVzaDtcbn1cblxuZnVuY3Rpb24gZW1wdHkoZXh0ZW50KSB7XG4gIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4dGVudFsxXVswXVxuICAgICAgfHwgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFNlbGVjdGlvbihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDtcbiAgcmV0dXJuIHN0YXRlID8gc3RhdGUuZGltLm91dHB1dChzdGF0ZS5zZWxlY3Rpb24pIDogbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoWCgpIHtcbiAgcmV0dXJuIGJydXNoKFgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hZKCkge1xuICByZXR1cm4gYnJ1c2goWSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gYnJ1c2goWFkpO1xufVxuXG5mdW5jdGlvbiBicnVzaChkaW0pIHtcbiAgdmFyIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGtleXMgPSB0cnVlLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImJydXNoXCIsIFwiZW5kXCIpLFxuICAgICAgaGFuZGxlU2l6ZSA9IDYsXG4gICAgICB0b3VjaGVuZGluZztcblxuICBmdW5jdGlvbiBicnVzaChncm91cCkge1xuICAgIHZhciBvdmVybGF5ID0gZ3JvdXBcbiAgICAgICAgLnByb3BlcnR5KFwiX19icnVzaFwiLCBpbml0aWFsaXplKVxuICAgICAgLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAuZGF0YShbdHlwZShcIm92ZXJsYXlcIildKTtcblxuICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJvdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KVxuICAgICAgLm1lcmdlKG92ZXJsYXkpXG4gICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBleHRlbnQgPSBsb2NhbCh0aGlzKS5leHRlbnQ7XG4gICAgICAgICAgc2VsZWN0KHRoaXMpXG4gICAgICAgICAgICAgIC5hdHRyKFwieFwiLCBleHRlbnRbMF1bMF0pXG4gICAgICAgICAgICAgIC5hdHRyKFwieVwiLCBleHRlbnRbMF1bMV0pXG4gICAgICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKVxuICAgICAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pO1xuICAgICAgICB9KTtcblxuICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgIC5kYXRhKFt0eXBlKFwic2VsZWN0aW9uXCIpXSlcbiAgICAgIC5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcInNlbGVjdGlvblwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLnNlbGVjdGlvbilcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwiIzc3N1wiKVxuICAgICAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAwLjMpXG4gICAgICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiI2ZmZlwiKVxuICAgICAgICAuYXR0cihcInNoYXBlLXJlbmRlcmluZ1wiLCBcImNyaXNwRWRnZXNcIik7XG5cbiAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKFwiLmhhbmRsZVwiKVxuICAgICAgLmRhdGEoZGltLmhhbmRsZXMsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZTsgfSk7XG5cbiAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpO1xuXG4gICAgaGFuZGxlLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwiaGFuZGxlIGhhbmRsZS0tXCIgKyBkLnR5cGU7IH0pXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnNbZC50eXBlXTsgfSk7XG5cbiAgICBncm91cFxuICAgICAgICAuZWFjaChyZWRyYXcpXG4gICAgICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxuICAgICAgICAub24oXCJtb3VzZWRvd24uYnJ1c2hcIiwgc3RhcnRlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0LmJydXNoXCIsIHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5icnVzaFwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaFwiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBicnVzaC5tb3ZlID0gZnVuY3Rpb24oZ3JvdXAsIHNlbGVjdGlvbikge1xuICAgIGlmIChncm91cC50d2Vlbikge1xuICAgICAgZ3JvdXBcbiAgICAgICAgICAub24oXCJzdGFydC5icnVzaFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydChldmVudCk7IH0pXG4gICAgICAgICAgLm9uKFwiaW50ZXJydXB0LmJydXNoIGVuZC5icnVzaFwiLCBmdW5jdGlvbihldmVudCkgeyBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykuZW5kKGV2ZW50KTsgfSlcbiAgICAgICAgICAudHdlZW4oXCJicnVzaFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCxcbiAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjAgPSBzdGF0ZS5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSxcbiAgICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoc2VsZWN0aW9uMCwgc2VsZWN0aW9uMSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHR3ZWVuKHQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gdCA9PT0gMSAmJiBzZWxlY3Rpb24xID09PSBudWxsID8gbnVsbCA6IGkodCk7XG4gICAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICAgICAgICBlbWl0LmJydXNoKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24wICE9PSBudWxsICYmIHNlbGVjdGlvbjEgIT09IG51bGwgPyB0d2VlbiA6IHR3ZWVuKDEpO1xuICAgICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cFxuICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgc3RhdGUgPSB0aGF0Ll9fYnJ1c2gsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3Rpb24uYXBwbHkodGhhdCwgYXJncykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksXG4gICAgICAgICAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJncykuYmVmb3Jlc3RhcnQoKTtcblxuICAgICAgICAgICAgaW50ZXJydXB0KHRoYXQpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gc2VsZWN0aW9uMSA9PT0gbnVsbCA/IG51bGwgOiBzZWxlY3Rpb24xO1xuICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgICAgICBlbWl0LnN0YXJ0KCkuYnJ1c2goKS5lbmQoKTtcbiAgICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbihncm91cCkge1xuICAgIGJydXNoLm1vdmUoZ3JvdXAsIG51bGwpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhpcyksXG4gICAgICAgIHNlbGVjdGlvbiA9IGxvY2FsKHRoaXMpLnNlbGVjdGlvbjtcblxuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb25cIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIHNlbGVjdGlvblswXVswXSlcbiAgICAgICAgICAuYXR0cihcInlcIiwgc2VsZWN0aW9uWzBdWzFdKVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSk7XG5cbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5oYW5kbGVcIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVtkLnR5cGUubGVuZ3RoIC0gMV0gPT09IFwiZVwiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSlcbiAgICAgICAgICAuYXR0cihcInlcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlWzBdID09PSBcInNcIiA/IHNlbGVjdGlvblsxXVsxXSAtIGhhbmRsZVNpemUgLyAyIDogc2VsZWN0aW9uWzBdWzFdIC0gaGFuZGxlU2l6ZSAvIDI7IH0pXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09IFwiblwiIHx8IGQudHlwZSA9PT0gXCJzXCIgPyBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSlcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09IFwiZVwiIHx8IGQudHlwZSA9PT0gXCJ3XCIgPyBzZWxlY3Rpb25bMV1bMV0gLSBzZWxlY3Rpb25bMF1bMV0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSk7XG4gICAgfVxuXG4gICAgZWxzZSB7XG4gICAgICBncm91cC5zZWxlY3RBbGwoXCIuc2VsZWN0aW9uLC5oYW5kbGVcIilcbiAgICAgICAgICAuc3R5bGUoXCJkaXNwbGF5XCIsIFwibm9uZVwiKVxuICAgICAgICAgIC5hdHRyKFwieFwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwid2lkdGhcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcImhlaWdodFwiLCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgdmFyIGVtaXQgPSB0aGF0Ll9fYnJ1c2guZW1pdHRlcjtcbiAgICByZXR1cm4gZW1pdCAmJiAoIWNsZWFuIHx8ICFlbWl0LmNsZWFuKSA/IGVtaXQgOiBuZXcgRW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbik7XG4gIH1cblxuICBmdW5jdGlvbiBFbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuc3RhdGUgPSB0aGF0Ll9fYnJ1c2g7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuY2xlYW4gPSBjbGVhbjtcbiAgfVxuXG4gIEVtaXR0ZXIucHJvdG90eXBlID0ge1xuICAgIGJlZm9yZXN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB0aGlzLnN0YXRlLmVtaXR0ZXIgPSB0aGlzLCB0aGlzLnN0YXJ0aW5nID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICBpZiAodGhpcy5zdGFydGluZykgdGhpcy5zdGFydGluZyA9IGZhbHNlLCB0aGlzLmVtaXQoXCJzdGFydFwiLCBldmVudCwgbW9kZSk7XG4gICAgICBlbHNlIHRoaXMuZW1pdChcImJydXNoXCIsIGV2ZW50KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgYnJ1c2g6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlKSB7XG4gICAgICB0aGlzLmVtaXQoXCJicnVzaFwiLCBldmVudCwgbW9kZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oZXZlbnQsIG1vZGUpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSBkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLCB0aGlzLmVtaXQoXCJlbmRcIiwgZXZlbnQsIG1vZGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlLCBldmVudCwgbW9kZSkge1xuICAgICAgdmFyIGQgPSBzZWxlY3QodGhpcy50aGF0KS5kYXR1bSgpO1xuICAgICAgbGlzdGVuZXJzLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudGhhdCxcbiAgICAgICAgbmV3IEJydXNoRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICB0YXJnZXQ6IGJydXNoLFxuICAgICAgICAgIHNlbGVjdGlvbjogZGltLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbiksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBzdGFydGVkKGV2ZW50KSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nICYmICFldmVudC50b3VjaGVzKSByZXR1cm47XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICB0eXBlID0gZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsXG4gICAgICAgIG1vZGUgPSAoa2V5cyAmJiBldmVudC5tZXRhS2V5ID8gdHlwZSA9IFwib3ZlcmxheVwiIDogdHlwZSkgPT09IFwic2VsZWN0aW9uXCIgPyBNT0RFX0RSQUcgOiAoa2V5cyAmJiBldmVudC5hbHRLZXkgPyBNT0RFX0NFTlRFUiA6IE1PREVfSEFORExFKSxcbiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVdLFxuICAgICAgICBzaWduWSA9IGRpbSA9PT0gWCA/IG51bGwgOiBzaWduc1lbdHlwZV0sXG4gICAgICAgIHN0YXRlID0gbG9jYWwodGhhdCksXG4gICAgICAgIGV4dGVudCA9IHN0YXRlLmV4dGVudCxcbiAgICAgICAgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsXG4gICAgICAgIE4gPSBleHRlbnRbMF1bMV0sIG4wLCBuMSxcbiAgICAgICAgRSA9IGV4dGVudFsxXVswXSwgZTAsIGUxLFxuICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsXG4gICAgICAgIGR4ID0gMCxcbiAgICAgICAgZHkgPSAwLFxuICAgICAgICBtb3ZpbmcsXG4gICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblkgJiYga2V5cyAmJiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgbG9ja1gsXG4gICAgICAgIGxvY2tZLFxuICAgICAgICBwb2ludHMgPSBBcnJheS5mcm9tKGV2ZW50LnRvdWNoZXMgfHwgW2V2ZW50XSwgdCA9PiB7XG4gICAgICAgICAgY29uc3QgaSA9IHQuaWRlbnRpZmllcjtcbiAgICAgICAgICB0ID0gcG9pbnRlcih0LCB0aGF0KTtcbiAgICAgICAgICB0LnBvaW50MCA9IHQuc2xpY2UoKTtcbiAgICAgICAgICB0LmlkZW50aWZpZXIgPSBpO1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9KTtcblxuICAgIGlmICh0eXBlID09PSBcIm92ZXJsYXlcIikge1xuICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHB0cyA9IFtwb2ludHNbMF0sIHBvaW50c1sxXSB8fCBwb2ludHNbMF1dO1xuICAgICAgc3RhdGUuc2VsZWN0aW9uID0gc2VsZWN0aW9uID0gW1tcbiAgICAgICAgICB3MCA9IGRpbSA9PT0gWSA/IFcgOiBtaW4ocHRzWzBdWzBdLCBwdHNbMV1bMF0pLFxuICAgICAgICAgIG4wID0gZGltID09PSBYID8gTiA6IG1pbihwdHNbMF1bMV0sIHB0c1sxXVsxXSlcbiAgICAgICAgXSwgW1xuICAgICAgICAgIGUwID0gZGltID09PSBZID8gRSA6IG1heChwdHNbMF1bMF0sIHB0c1sxXVswXSksXG4gICAgICAgICAgczAgPSBkaW0gPT09IFggPyBTIDogbWF4KHB0c1swXVsxXSwgcHRzWzFdWzFdKVxuICAgICAgICBdXTtcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoID4gMSkgbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3MCA9IHNlbGVjdGlvblswXVswXTtcbiAgICAgIG4wID0gc2VsZWN0aW9uWzBdWzFdO1xuICAgICAgZTAgPSBzZWxlY3Rpb25bMV1bMF07XG4gICAgICBzMCA9IHNlbGVjdGlvblsxXVsxXTtcbiAgICB9XG5cbiAgICB3MSA9IHcwO1xuICAgIG4xID0gbjA7XG4gICAgZTEgPSBlMDtcbiAgICBzMSA9IHMwO1xuXG4gICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoYXQpXG4gICAgICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpO1xuXG4gICAgdmFyIG92ZXJsYXkgPSBncm91cC5zZWxlY3RBbGwoXCIub3ZlcmxheVwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGVdKTtcblxuICAgIGludGVycnVwdCh0aGF0KTtcbiAgICB2YXIgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1lbnRzLCB0cnVlKS5iZWZvcmVzdGFydCgpO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDtcbiAgICAgIGVtaXQuZW5kZWQgPSBlbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXZlbnQudmlldylcbiAgICAgICAgICAub24oXCJtb3VzZW1vdmUuYnJ1c2hcIiwgbW92ZWQsIHRydWUpXG4gICAgICAgICAgLm9uKFwibW91c2V1cC5icnVzaFwiLCBlbmRlZCwgdHJ1ZSk7XG4gICAgICBpZiAoa2V5cykgdmlld1xuICAgICAgICAgIC5vbihcImtleWRvd24uYnJ1c2hcIiwga2V5ZG93bmVkLCB0cnVlKVxuICAgICAgICAgIC5vbihcImtleXVwLmJydXNoXCIsIGtleXVwcGVkLCB0cnVlKVxuXG4gICAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICB9XG5cbiAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICBlbWl0LnN0YXJ0KGV2ZW50LCBtb2RlLm5hbWUpO1xuXG4gICAgZnVuY3Rpb24gbW92ZWQoZXZlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBldmVudC5jaGFuZ2VkVG91Y2hlcyB8fCBbZXZlbnRdKSB7XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBwb2ludHMpXG4gICAgICAgICAgaWYgKGQuaWRlbnRpZmllciA9PT0gcC5pZGVudGlmaWVyKSBkLmN1ciA9IHBvaW50ZXIocCwgdGhhdCk7XG4gICAgICB9XG4gICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSAmJiBwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzWzBdO1xuICAgICAgICBpZiAoYWJzKHBvaW50LmN1clswXSAtIHBvaW50WzBdKSA+IGFicyhwb2ludC5jdXJbMV0gLSBwb2ludFsxXSkpXG4gICAgICAgICAgbG9ja1kgPSB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgbG9ja1ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpXG4gICAgICAgIGlmIChwb2ludC5jdXIpIHBvaW50WzBdID0gcG9pbnQuY3VyWzBdLCBwb2ludFsxXSA9IHBvaW50LmN1clsxXTtcbiAgICAgIG1vdmluZyA9IHRydWU7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIG1vdmUoZXZlbnQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzWzBdLCBwb2ludDAgPSBwb2ludC5wb2ludDA7XG4gICAgICB2YXIgdDtcblxuICAgICAgZHggPSBwb2ludFswXSAtIHBvaW50MFswXTtcbiAgICAgIGR5ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07XG5cbiAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIE1PREVfU1BBQ0U6XG4gICAgICAgIGNhc2UgTU9ERV9EUkFHOiB7XG4gICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IG1heChXIC0gdzAsIG1pbihFIC0gZTAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMCArIGR4O1xuICAgICAgICAgIGlmIChzaWduWSkgZHkgPSBtYXgoTiAtIG4wLCBtaW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wICsgZHksIHMxID0gczAgKyBkeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIE1PREVfSEFORExFOiB7XG4gICAgICAgICAgaWYgKHBvaW50c1sxXSkge1xuICAgICAgICAgICAgaWYgKHNpZ25YKSB3MSA9IG1heChXLCBtaW4oRSwgcG9pbnRzWzBdWzBdKSksIGUxID0gbWF4KFcsIG1pbihFLCBwb2ludHNbMV1bMF0pKSwgc2lnblggPSAxO1xuICAgICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IG1heChOLCBtaW4oUywgcG9pbnRzWzBdWzFdKSksIHMxID0gbWF4KE4sIG1pbihTLCBwb2ludHNbMV1bMV0pKSwgc2lnblkgPSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBkeCA9IG1heChXIC0gdzAsIG1pbihFIC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25YID4gMCkgZHggPSBtYXgoVyAtIGUwLCBtaW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwLCBlMSA9IGUwICsgZHg7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBkeSA9IG1heChOIC0gbjAsIG1pbihTIC0gbjAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25ZID4gMCkgZHkgPSBtYXgoTiAtIHMwLCBtaW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9DRU5URVI6IHtcbiAgICAgICAgICBpZiAoc2lnblgpIHcxID0gbWF4KFcsIG1pbihFLCB3MCAtIGR4ICogc2lnblgpKSwgZTEgPSBtYXgoVywgbWluKEUsIGUwICsgZHggKiBzaWduWCkpO1xuICAgICAgICAgIGlmIChzaWduWSkgbjEgPSBtYXgoTiwgbWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IG1heChOLCBtaW4oUywgczAgKyBkeSAqIHNpZ25ZKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUxIDwgdzEpIHtcbiAgICAgICAgc2lnblggKj0gLTE7XG4gICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0O1xuICAgICAgICB0ID0gdzEsIHcxID0gZTEsIGUxID0gdDtcbiAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFgpIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWFt0eXBlXV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoczEgPCBuMSkge1xuICAgICAgICBzaWduWSAqPSAtMTtcbiAgICAgICAgdCA9IG4wLCBuMCA9IHMwLCBzMCA9IHQ7XG4gICAgICAgIHQgPSBuMSwgbjEgPSBzMSwgczEgPSB0O1xuICAgICAgICBpZiAodHlwZSBpbiBmbGlwWSkgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZSA9IGZsaXBZW3R5cGVdXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIVxuICAgICAgaWYgKGxvY2tYKSB3MSA9IHNlbGVjdGlvblswXVswXSwgZTEgPSBzZWxlY3Rpb25bMV1bMF07XG4gICAgICBpZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTtcblxuICAgICAgaWYgKHNlbGVjdGlvblswXVswXSAhPT0gdzFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMF1bMV0gIT09IG4xXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzBdICE9PSBlMVxuICAgICAgICAgIHx8IHNlbGVjdGlvblsxXVsxXSAhPT0gczEpIHtcbiAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3MSwgbjFdLCBbZTEsIHMxXV07XG4gICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgICBlbWl0LmJydXNoKGV2ZW50LCBtb2RlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZGVkKGV2ZW50KSB7XG4gICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgIGlmIChldmVudC50b3VjaGVzKSB7XG4gICAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIG1vdmluZyk7XG4gICAgICAgIHZpZXcub24oXCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoXCIsIG51bGwpO1xuICAgICAgfVxuICAgICAgZ3JvdXAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpO1xuICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMub3ZlcmxheSk7XG4gICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSAob24gc3RhcnQpIVxuICAgICAgaWYgKGVtcHR5KHNlbGVjdGlvbikpIHN0YXRlLnNlbGVjdGlvbiA9IG51bGwsIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgICAgZW1pdC5lbmQoZXZlbnQsIG1vZGUubmFtZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5ZG93bmVkKGV2ZW50KSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVFxuICAgICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODogeyAvLyBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBkeCAqIHNpZ25YO1xuICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7XG4gICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0U7IHRha2VzIHByaW9yaXR5IG92ZXIgQUxUXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfSEFORExFIHx8IG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7XG4gICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxIC0gZHg7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MSAtIGR4O1xuICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMSAtIGR5OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjEgLSBkeTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX1NQQUNFO1xuICAgICAgICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24ga2V5dXBwZWQoZXZlbnQpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUXG4gICAgICAgICAgaWYgKHNoaWZ0aW5nKSB7XG4gICAgICAgICAgICBsb2NrWCA9IGxvY2tZID0gc2hpZnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAxODogeyAvLyBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9DRU5URVIpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hBTkRMRTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMjogeyAvLyBTUEFDRVxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX1NQQUNFKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBkeCAqIHNpZ25YO1xuICAgICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTtcbiAgICAgICAgICAgICAgbW9kZSA9IE1PREVfQ0VOVEVSO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxO1xuICAgICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxOyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7XG4gICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hBTkRMRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG92ZXJsYXkuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzW3R5cGVdKTtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgICAgfVxuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCkge1xuICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZChldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50KSB7XG4gICAgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZGVkKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fX2JydXNoIHx8IHtzZWxlY3Rpb246IG51bGx9O1xuICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIHN0YXRlLmRpbSA9IGRpbTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50O1xuICB9O1xuXG4gIGJydXNoLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGJydXNoKSA6IGZpbHRlcjtcbiAgfTtcblxuICBicnVzaC50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBicnVzaCkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgYnJ1c2guaGFuZGxlU2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7XG4gIH07XG5cbiAgYnJ1c2gua2V5TW9kaWZpZXJzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSAhIV8sIGJydXNoKSA6IGtleXM7XG4gIH07XG5cbiAgYnJ1c2gub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gYnJ1c2g7XG59XG4iLCAiY29uc3QgcGkgPSBNYXRoLlBJLFxuICAgIHRhdSA9IDIgKiBwaSxcbiAgICBlcHNpbG9uID0gMWUtNixcbiAgICB0YXVFcHNpbG9uID0gdGF1IC0gZXBzaWxvbjtcblxuZnVuY3Rpb24gUGF0aCgpIHtcbiAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJlbnQgc3VicGF0aFxuICB0aGlzLl94MSA9IHRoaXMuX3kxID0gbnVsbDsgLy8gZW5kIG9mIGN1cnJlbnQgc3VicGF0aFxuICB0aGlzLl8gPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gbmV3IFBhdGg7XG59XG5cblBhdGgucHJvdG90eXBlID0gcGF0aC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBQYXRoLFxuICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGNsb3NlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX3gxICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl94MSA9IHRoaXMuX3gwLCB0aGlzLl95MSA9IHRoaXMuX3kwO1xuICAgICAgdGhpcy5fICs9IFwiWlwiO1xuICAgIH1cbiAgfSxcbiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiTFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIlFcIiArICgreDEpICsgXCIsXCIgKyAoK3kxKSArIFwiLFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiQ1wiICsgKCt4MSkgKyBcIixcIiArICgreTEpICsgXCIsXCIgKyAoK3gyKSArIFwiLFwiICsgKCt5MikgKyBcIixcIiArICh0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kxID0gK3kpO1xuICB9LFxuICBhcmNUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHIpIHtcbiAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyO1xuICAgIHZhciB4MCA9IHRoaXMuX3gxLFxuICAgICAgICB5MCA9IHRoaXMuX3kxLFxuICAgICAgICB4MjEgPSB4MiAtIHgxLFxuICAgICAgICB5MjEgPSB5MiAtIHkxLFxuICAgICAgICB4MDEgPSB4MCAtIHgxLFxuICAgICAgICB5MDEgPSB5MCAtIHkxLFxuICAgICAgICBsMDFfMiA9IHgwMSAqIHgwMSArIHkwMSAqIHkwMTtcblxuICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLlxuICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibmVnYXRpdmUgcmFkaXVzOiBcIiArIHIpO1xuXG4gICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MSx5MSkuXG4gICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7XG4gICAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDEgPSB4MSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxKTtcbiAgICB9XG5cbiAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy5cbiAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbikpO1xuXG4gICAgLy8gT3IsIGFyZSAoeDAseTApLCAoeDEseTEpIGFuZCAoeDIseTIpIGNvbGxpbmVhcj9cbiAgICAvLyBFcXVpdmFsZW50bHksIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4Mix5Mik/XG4gICAgLy8gT3IsIGlzIHRoZSByYWRpdXMgemVybz8gTGluZSB0byAoeDEseTEpLlxuICAgIGVsc2UgaWYgKCEoTWF0aC5hYnMoeTAxICogeDIxIC0geTIxICogeDAxKSA+IGVwc2lsb24pIHx8ICFyKSB7XG4gICAgICB0aGlzLl8gKz0gXCJMXCIgKyAodGhpcy5feDEgPSB4MSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkxKTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGRyYXcgYW4gYXJjIVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHgyMCA9IHgyIC0geDAsXG4gICAgICAgICAgeTIwID0geTIgLSB5MCxcbiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSxcbiAgICAgICAgICBsMjBfMiA9IHgyMCAqIHgyMCArIHkyMCAqIHkyMCxcbiAgICAgICAgICBsMjEgPSBNYXRoLnNxcnQobDIxXzIpLFxuICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksXG4gICAgICAgICAgbCA9IHIgKiBNYXRoLnRhbigocGkgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLFxuICAgICAgICAgIHQwMSA9IGwgLyBsMDEsXG4gICAgICAgICAgdDIxID0gbCAvIGwyMTtcblxuICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLlxuICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbikge1xuICAgICAgICB0aGlzLl8gKz0gXCJMXCIgKyAoeDEgKyB0MDEgKiB4MDEpICsgXCIsXCIgKyAoeTEgKyB0MDEgKiB5MDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwwLFwiICsgKCsoeTAxICogeDIwID4geDAxICogeTIwKSkgKyBcIixcIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEgKyB0MjEgKiB5MjEpO1xuICAgIH1cbiAgfSxcbiAgYXJjOiBmdW5jdGlvbih4LCB5LCByLCBhMCwgYTEsIGNjdykge1xuICAgIHggPSAreCwgeSA9ICt5LCByID0gK3IsIGNjdyA9ICEhY2N3O1xuICAgIHZhciBkeCA9IHIgKiBNYXRoLmNvcyhhMCksXG4gICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSxcbiAgICAgICAgeDAgPSB4ICsgZHgsXG4gICAgICAgIHkwID0geSArIGR5LFxuICAgICAgICBjdyA9IDEgXiBjY3csXG4gICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7XG5cbiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci5cbiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcihcIm5lZ2F0aXZlIHJhZGl1czogXCIgKyByKTtcblxuICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDAseTApLlxuICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fICs9IFwiTVwiICsgeDAgKyBcIixcIiArIHkwO1xuICAgIH1cblxuICAgIC8vIE9yLCBpcyAoeDAseTApIG5vdCBjb2luY2lkZW50IHdpdGggdGhlIHByZXZpb3VzIHBvaW50PyBMaW5lIHRvICh4MCx5MCkuXG4gICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5feDEgLSB4MCkgPiBlcHNpbG9uIHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiTFwiICsgeDAgKyBcIixcIiArIHkwO1xuICAgIH1cblxuICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZVx1MjAxOXJlIGRvbmUuXG4gICAgaWYgKCFyKSByZXR1cm47XG5cbiAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBGbGlwIHRoZSBkaXJlY3Rpb24uXG4gICAgaWYgKGRhIDwgMCkgZGEgPSBkYSAlIHRhdSArIHRhdTtcblxuICAgIC8vIElzIHRoaXMgYSBjb21wbGV0ZSBjaXJjbGU/IERyYXcgdHdvIGFyY3MgdG8gY29tcGxldGUgdGhlIGNpcmNsZS5cbiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwxLFwiICsgY3cgKyBcIixcIiArICh4IC0gZHgpICsgXCIsXCIgKyAoeSAtIGR5KSArIFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsMSxcIiArIGN3ICsgXCIsXCIgKyAodGhpcy5feDEgPSB4MCkgKyBcIixcIiArICh0aGlzLl95MSA9IHkwKTtcbiAgICB9XG5cbiAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIVxuICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbikge1xuICAgICAgdGhpcy5fICs9IFwiQVwiICsgciArIFwiLFwiICsgciArIFwiLDAsXCIgKyAoKyhkYSA+PSBwaSkpICsgXCIsXCIgKyBjdyArIFwiLFwiICsgKHRoaXMuX3gxID0geCArIHIgKiBNYXRoLmNvcyhhMSkpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5ICsgciAqIE1hdGguc2luKGExKSk7XG4gICAgfVxuICB9LFxuICByZWN0OiBmdW5jdGlvbih4LCB5LCB3LCBoKSB7XG4gICAgdGhpcy5fICs9IFwiTVwiICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpICsgXCJoXCIgKyAoK3cpICsgXCJ2XCIgKyAoK2gpICsgXCJoXCIgKyAoLXcpICsgXCJaXCI7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwYXRoO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIG5vZGVzLCBzdHJlbmd0aCA9IDE7XG5cbiAgaWYgKHggPT0gbnVsbCkgeCA9IDA7XG4gIGlmICh5ID09IG51bGwpIHkgPSAwO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBub2RlLFxuICAgICAgICBzeCA9IDAsXG4gICAgICAgIHN5ID0gMDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgc3ggKz0gbm9kZS54LCBzeSArPSBub2RlLnk7XG4gICAgfVxuXG4gICAgZm9yIChzeCA9IChzeCAvIG4gLSB4KSAqIHN0cmVuZ3RoLCBzeSA9IChzeSAvIG4gLSB5KSAqIHN0cmVuZ3RoLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnggLT0gc3gsIG5vZGUueSAtPSBzeTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArXywgZm9yY2UpIDogeDtcbiAgfTtcblxuICBmb3JjZS55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSArXywgZm9yY2UpIDogeTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICBjb25zdCB4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSxcbiAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpO1xuICByZXR1cm4gYWRkKHRoaXMuY292ZXIoeCwgeSksIHgsIHksIGQpO1xufVxuXG5mdW5jdGlvbiBhZGQodHJlZSwgeCwgeSwgZCkge1xuICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiB0cmVlOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHNcblxuICB2YXIgcGFyZW50LFxuICAgICAgbm9kZSA9IHRyZWUuX3Jvb3QsXG4gICAgICBsZWFmID0ge2RhdGE6IGR9LFxuICAgICAgeDAgPSB0cmVlLl94MCxcbiAgICAgIHkwID0gdHJlZS5feTAsXG4gICAgICB4MSA9IHRyZWUuX3gxLFxuICAgICAgeTEgPSB0cmVlLl95MSxcbiAgICAgIHhtLFxuICAgICAgeW0sXG4gICAgICB4cCxcbiAgICAgIHlwLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlO1xuXG4gIC8vIEZpbmQgdGhlIGV4aXN0aW5nIGxlYWYgZm9yIHRoZSBuZXcgcG9pbnQsIG9yIGFkZCBpdC5cbiAgd2hpbGUgKG5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gICAgaWYgKHBhcmVudCA9IG5vZGUsICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7XG4gIH1cblxuICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29pbmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD9cbiAgeHAgPSArdHJlZS5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSk7XG4gIHlwID0gK3RyZWUuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpO1xuICBpZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQgPyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7XG5cbiAgLy8gT3RoZXJ3aXNlLCBzcGxpdCB0aGUgbGVhZiBub2RlIHVudGlsIHRoZSBvbGQgYW5kIG5ldyBwb2ludCBhcmUgc2VwYXJhdGVkLlxuICBkbyB7XG4gICAgcGFyZW50ID0gcGFyZW50ID8gcGFyZW50W2ldID0gbmV3IEFycmF5KDQpIDogdHJlZS5fcm9vdCA9IG5ldyBBcnJheSg0KTtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgfSB3aGlsZSAoKGkgPSBib3R0b20gPDwgMSB8IHJpZ2h0KSA9PT0gKGogPSAoeXAgPj0geW0pIDw8IDEgfCAoeHAgPj0geG0pKSk7XG4gIHJldHVybiBwYXJlbnRbal0gPSBub2RlLCBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHtcbiAgdmFyIGQsIGksIG4gPSBkYXRhLmxlbmd0aCxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeHogPSBuZXcgQXJyYXkobiksXG4gICAgICB5eiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHgwID0gSW5maW5pdHksXG4gICAgICB5MCA9IEluZmluaXR5LFxuICAgICAgeDEgPSAtSW5maW5pdHksXG4gICAgICB5MSA9IC1JbmZpbml0eTtcblxuICAvLyBDb21wdXRlIHRoZSBwb2ludHMgYW5kIHRoZWlyIGV4dGVudC5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkID0gZGF0YVtpXSkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgY29udGludWU7XG4gICAgeHpbaV0gPSB4O1xuICAgIHl6W2ldID0geTtcbiAgICBpZiAoeCA8IHgwKSB4MCA9IHg7XG4gICAgaWYgKHggPiB4MSkgeDEgPSB4O1xuICAgIGlmICh5IDwgeTApIHkwID0geTtcbiAgICBpZiAoeSA+IHkxKSB5MSA9IHk7XG4gIH1cblxuICAvLyBJZiB0aGVyZSB3ZXJlIG5vICh2YWxpZCkgcG9pbnRzLCBhYm9ydC5cbiAgaWYgKHgwID4geDEgfHwgeTAgPiB5MSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRXhwYW5kIHRoZSB0cmVlIHRvIGNvdmVyIHRoZSBuZXcgcG9pbnRzLlxuICB0aGlzLmNvdmVyKHgwLCB5MCkuY292ZXIoeDEsIHkxKTtcblxuICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgaWYgKGlzTmFOKHggPSAreCkgfHwgaXNOYU4oeSA9ICt5KSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxO1xuXG4gIC8vIElmIHRoZSBxdWFkdHJlZSBoYXMgbm8gZXh0ZW50LCBpbml0aWFsaXplIHRoZW0uXG4gIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nhcnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCxcbiAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9uXHUyMDE5dCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIVxuICBpZiAoaXNOYU4oeDApKSB7XG4gICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgpKSArIDE7XG4gICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIGRvdWJsZSByZXBlYXRlZGx5IHRvIGNvdmVyLlxuICBlbHNlIHtcbiAgICB2YXIgeiA9IHgxIC0geDAgfHwgMSxcbiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaTtcblxuICAgIHdoaWxlICh4MCA+IHggfHwgeCA+PSB4MSB8fCB5MCA+IHkgfHwgeSA+PSB5MSkge1xuICAgICAgaSA9ICh5IDwgeTApIDw8IDEgfCAoeCA8IHgwKTtcbiAgICAgIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyO1xuICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgIGNhc2UgMDogeDEgPSB4MCArIHosIHkxID0geTAgKyB6OyBicmVhaztcbiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IHgxID0geDAgKyB6LCB5MCA9IHkxIC0gejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogeDAgPSB4MSAtIHosIHkwID0geTEgLSB6OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICB0aGlzLl94MCA9IHgwO1xuICB0aGlzLl95MCA9IHkwO1xuICB0aGlzLl94MSA9IHgxO1xuICB0aGlzLl95MSA9IHkxO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGRhdGEgPSBbXTtcbiAgdGhpcy52aXNpdChmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gZGF0YS5wdXNoKG5vZGUuZGF0YSk7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KVxuICB9KTtcbiAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmNvdmVyKCtfWzBdWzBdLCArX1swXVsxXSkuY292ZXIoK19bMV1bMF0sICtfWzFdWzFdKVxuICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLngwID0geDA7XG4gIHRoaXMueTAgPSB5MDtcbiAgdGhpcy54MSA9IHgxO1xuICB0aGlzLnkxID0geTE7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgdmFyIGRhdGEsXG4gICAgICB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxLFxuICAgICAgeTEsXG4gICAgICB4MixcbiAgICAgIHkyLFxuICAgICAgeDMgPSB0aGlzLl94MSxcbiAgICAgIHkzID0gdGhpcy5feTEsXG4gICAgICBxdWFkcyA9IFtdLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBxLFxuICAgICAgaTtcblxuICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZChub2RlLCB4MCwgeTAsIHgzLCB5MykpO1xuICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5O1xuICBlbHNlIHtcbiAgICB4MCA9IHggLSByYWRpdXMsIHkwID0geSAtIHJhZGl1cztcbiAgICB4MyA9IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1cztcbiAgICByYWRpdXMgKj0gcmFkaXVzO1xuICB9XG5cbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuXG4gICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhpcyBxdWFkcmFudCBjYW5cdTIwMTl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS5cbiAgICBpZiAoIShub2RlID0gcS5ub2RlKVxuICAgICAgICB8fCAoeDEgPSBxLngwKSA+IHgzXG4gICAgICAgIHx8ICh5MSA9IHEueTApID4geTNcbiAgICAgICAgfHwgKHgyID0gcS54MSkgPCB4MFxuICAgICAgICB8fCAoeTIgPSBxLnkxKSA8IHkwKSBjb250aW51ZTtcblxuICAgIC8vIEJpc2VjdCB0aGUgY3VycmVudCBxdWFkcmFudC5cbiAgICBpZiAobm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsXG4gICAgICAgICAgeW0gPSAoeTEgKyB5MikgLyAyO1xuXG4gICAgICBxdWFkcy5wdXNoKFxuICAgICAgICBuZXcgUXVhZChub2RlWzNdLCB4bSwgeW0sIHgyLCB5MiksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMl0sIHgxLCB5bSwgeG0sIHkyKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVsxXSwgeG0sIHkxLCB4MiwgeW0pLFxuICAgICAgICBuZXcgUXVhZChub2RlWzBdLCB4MSwgeTEsIHhtLCB5bSlcbiAgICAgICk7XG5cbiAgICAgIC8vIFZpc2l0IHRoZSBjbG9zZXN0IHF1YWRyYW50IGZpcnN0LlxuICAgICAgaWYgKGkgPSAoeSA+PSB5bSkgPDwgMSB8ICh4ID49IHhtKSkge1xuICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDFdID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldO1xuICAgICAgICBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV0gPSBxO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50IHBvaW50cyBpc25cdTIwMTl0IG5lY2Vzc2FyeSEpXG4gICAgZWxzZSB7XG4gICAgICB2YXIgZHggPSB4IC0gK3RoaXMuX3guY2FsbChudWxsLCBub2RlLmRhdGEpLFxuICAgICAgICAgIGR5ID0geSAtICt0aGlzLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSxcbiAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgaWYgKGQyIDwgcmFkaXVzKSB7XG4gICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJhZGl1cyA9IGQyKTtcbiAgICAgICAgeDAgPSB4IC0gZCwgeTAgPSB5IC0gZDtcbiAgICAgICAgeDMgPSB4ICsgZCwgeTMgPSB5ICsgZDtcbiAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkKSB7XG4gIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHBhcmVudCxcbiAgICAgIG5vZGUgPSB0aGlzLl9yb290LFxuICAgICAgcmV0YWluZXIsXG4gICAgICBwcmV2aW91cyxcbiAgICAgIG5leHQsXG4gICAgICB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB4bSxcbiAgICAgIHltLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgICBpLFxuICAgICAgajtcblxuICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuXG4gIGlmICghbm9kZSkgcmV0dXJuIHRoaXM7XG5cbiAgLy8gRmluZCB0aGUgbGVhZiBub2RlIGZvciB0aGUgcG9pbnQuXG4gIC8vIFdoaWxlIGRlc2NlbmRpbmcsIGFsc28gcmV0YWluIHRoZSBkZWVwZXN0IHBhcmVudCB3aXRoIGEgbm9uLXJlbW92ZWQgc2libGluZy5cbiAgaWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTtcbiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltO1xuICAgIGlmICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiB0aGlzO1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGJyZWFrO1xuICAgIGlmIChwYXJlbnRbKGkgKyAxKSAmIDNdIHx8IHBhcmVudFsoaSArIDIpICYgM10gfHwgcGFyZW50WyhpICsgMykgJiAzXSkgcmV0YWluZXIgPSBwYXJlbnQsIGogPSBpO1xuICB9XG5cbiAgLy8gRmluZCB0aGUgcG9pbnQgdG8gcmVtb3ZlLlxuICB3aGlsZSAobm9kZS5kYXRhICE9PSBkKSBpZiAoIShwcmV2aW91cyA9IG5vZGUsIG5vZGUgPSBub2RlLm5leHQpKSByZXR1cm4gdGhpcztcbiAgaWYgKG5leHQgPSBub2RlLm5leHQpIGRlbGV0ZSBub2RlLm5leHQ7XG5cbiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQgcG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuXG4gIGlmIChwcmV2aW91cykgcmV0dXJuIChuZXh0ID8gcHJldmlvdXMubmV4dCA9IG5leHQgOiBkZWxldGUgcHJldmlvdXMubmV4dCksIHRoaXM7XG5cbiAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LlxuICBpZiAoIXBhcmVudCkgcmV0dXJuIHRoaXMuX3Jvb3QgPSBuZXh0LCB0aGlzO1xuXG4gIC8vIFJlbW92ZSB0aGlzIGxlYWYuXG4gIG5leHQgPyBwYXJlbnRbaV0gPSBuZXh0IDogZGVsZXRlIHBhcmVudFtpXTtcblxuICAvLyBJZiB0aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZsdW91cyBwYXJlbnRzLlxuICBpZiAoKG5vZGUgPSBwYXJlbnRbMF0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbM10pXG4gICAgICAmJiBub2RlID09PSAocGFyZW50WzNdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzBdKVxuICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7XG4gICAgaWYgKHJldGFpbmVyKSByZXRhaW5lcltqXSA9IG5vZGU7XG4gICAgZWxzZSB0aGlzLl9yb290ID0gbm9kZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBkYXRhLmxlbmd0aDsgaSA8IG47ICsraSkgdGhpcy5yZW1vdmUoZGF0YVtpXSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcm9vdDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNpemUgPSAwO1xuICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyArK3NpemU7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KVxuICB9KTtcbiAgcmV0dXJuIHNpemU7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgcSwgbm9kZSA9IHRoaXMuX3Jvb3QsIGNoaWxkLCB4MCwgeTAsIHgxLCB5MTtcbiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTtcbiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkge1xuICAgIGlmICghY2FsbGJhY2sobm9kZSA9IHEubm9kZSwgeDAgPSBxLngwLCB5MCA9IHEueTAsIHgxID0gcS54MSwgeTEgPSBxLnkxKSAmJiBub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIHhtID0gKHgwICsgeDEpIC8gMiwgeW0gPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzFdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeTAsIHgxLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgbmV4dCA9IFtdLCBxO1xuICBpZiAodGhpcy5fcm9vdCkgcXVhZHMucHVzaChuZXcgUXVhZCh0aGlzLl9yb290LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpO1xuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG4gICAgdmFyIG5vZGUgPSBxLm5vZGU7XG4gICAgaWYgKG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpO1xuICAgIH1cbiAgICBuZXh0LnB1c2gocSk7XG4gIH1cbiAgd2hpbGUgKHEgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2socS5ub2RlLCBxLngwLCBxLnkwLCBxLngxLCBxLnkxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gZGVmYXVsdFgoZCkge1xuICByZXR1cm4gZFswXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl94ID0gXywgdGhpcykgOiB0aGlzLl94O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WShkKSB7XG4gIHJldHVybiBkWzFdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSBfLCB0aGlzKSA6IHRoaXMuX3k7XG59XG4iLCAiaW1wb3J0IHRyZWVfYWRkLCB7YWRkQWxsIGFzIHRyZWVfYWRkQWxsfSBmcm9tIFwiLi9hZGQuanNcIjtcbmltcG9ydCB0cmVlX2NvdmVyIGZyb20gXCIuL2NvdmVyLmpzXCI7XG5pbXBvcnQgdHJlZV9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB0cmVlX2V4dGVudCBmcm9tIFwiLi9leHRlbnQuanNcIjtcbmltcG9ydCB0cmVlX2ZpbmQgZnJvbSBcIi4vZmluZC5qc1wiO1xuaW1wb3J0IHRyZWVfcmVtb3ZlLCB7cmVtb3ZlQWxsIGFzIHRyZWVfcmVtb3ZlQWxsfSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmVlX3Jvb3QgZnJvbSBcIi4vcm9vdC5qc1wiO1xuaW1wb3J0IHRyZWVfc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgdHJlZV92aXNpdCBmcm9tIFwiLi92aXNpdC5qc1wiO1xuaW1wb3J0IHRyZWVfdmlzaXRBZnRlciBmcm9tIFwiLi92aXNpdEFmdGVyLmpzXCI7XG5pbXBvcnQgdHJlZV94LCB7ZGVmYXVsdFh9IGZyb20gXCIuL3guanNcIjtcbmltcG9ydCB0cmVlX3ksIHtkZWZhdWx0WX0gZnJvbSBcIi4veS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFkdHJlZShub2RlcywgeCwgeSkge1xuICB2YXIgdHJlZSA9IG5ldyBRdWFkdHJlZSh4ID09IG51bGwgPyBkZWZhdWx0WCA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZIDogeSwgTmFOLCBOYU4sIE5hTiwgTmFOKTtcbiAgcmV0dXJuIG5vZGVzID09IG51bGwgPyB0cmVlIDogdHJlZS5hZGRBbGwobm9kZXMpO1xufVxuXG5mdW5jdGlvbiBRdWFkdHJlZSh4LCB5LCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLl94ID0geDtcbiAgdGhpcy5feSA9IHk7XG4gIHRoaXMuX3gwID0geDA7XG4gIHRoaXMuX3kwID0geTA7XG4gIHRoaXMuX3gxID0geDE7XG4gIHRoaXMuX3kxID0geTE7XG4gIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7XG4gIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5O1xuICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9O1xuICByZXR1cm4gY29weTtcbn1cblxudmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0cmVlLnByb3RvdHlwZTtcblxudHJlZVByb3RvLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvcHkgPSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBub2RlcyxcbiAgICAgIGNoaWxkO1xuXG4gIGlmICghbm9kZSkgcmV0dXJuIGNvcHk7XG5cbiAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkobm9kZSksIGNvcHk7XG5cbiAgbm9kZXMgPSBbe3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHtcbiAgICAgICAgaWYgKGNoaWxkLmxlbmd0aCkgbm9kZXMucHVzaCh7c291cmNlOiBjaGlsZCwgdGFyZ2V0OiBub2RlLnRhcmdldFtpXSA9IG5ldyBBcnJheSg0KX0pO1xuICAgICAgICBlbHNlIG5vZGUudGFyZ2V0W2ldID0gbGVhZl9jb3B5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbnRyZWVQcm90by5hZGQgPSB0cmVlX2FkZDtcbnRyZWVQcm90by5hZGRBbGwgPSB0cmVlX2FkZEFsbDtcbnRyZWVQcm90by5jb3ZlciA9IHRyZWVfY292ZXI7XG50cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTtcbnRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDtcbnRyZWVQcm90by5maW5kID0gdHJlZV9maW5kO1xudHJlZVByb3RvLnJlbW92ZSA9IHRyZWVfcmVtb3ZlO1xudHJlZVByb3RvLnJlbW92ZUFsbCA9IHRyZWVfcmVtb3ZlQWxsO1xudHJlZVByb3RvLnJvb3QgPSB0cmVlX3Jvb3Q7XG50cmVlUHJvdG8uc2l6ZSA9IHRyZWVfc2l6ZTtcbnRyZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7XG50cmVlUHJvdG8udmlzaXRBZnRlciA9IHRyZWVfdmlzaXRBZnRlcjtcbnRyZWVQcm90by54ID0gdHJlZV94O1xudHJlZVByb3RvLnkgPSB0cmVlX3k7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFuZG9tKSB7XG4gIHJldHVybiAocmFuZG9tKCkgLSAwLjUpICogMWUtNjtcbn1cbiIsICJpbXBvcnQge3F1YWR0cmVlfSBmcm9tIFwiZDMtcXVhZHRyZWVcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGUuanNcIjtcblxuZnVuY3Rpb24geChkKSB7XG4gIHJldHVybiBkLnggKyBkLnZ4O1xufVxuXG5mdW5jdGlvbiB5KGQpIHtcbiAgcmV0dXJuIGQueSArIGQudnk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhZGl1cykge1xuICB2YXIgbm9kZXMsXG4gICAgICByYWRpaSxcbiAgICAgIHJhbmRvbSxcbiAgICAgIHN0cmVuZ3RoID0gMSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmICh0eXBlb2YgcmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIHJhZGl1cyA9IGNvbnN0YW50KHJhZGl1cyA9PSBudWxsID8gMSA6ICtyYWRpdXMpO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKCkge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICB0cmVlLFxuICAgICAgICBub2RlLFxuICAgICAgICB4aSxcbiAgICAgICAgeWksXG4gICAgICAgIHJpLFxuICAgICAgICByaTI7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKHByZXBhcmUpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIHJpID0gcmFkaWlbbm9kZS5pbmRleF0sIHJpMiA9IHJpICogcmk7XG4gICAgICAgIHhpID0gbm9kZS54ICsgbm9kZS52eDtcbiAgICAgICAgeWkgPSBub2RlLnkgKyBub2RlLnZ5O1xuICAgICAgICB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MCwgeTAsIHgxLCB5MSkge1xuICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmluZGV4ID4gbm9kZS5pbmRleCkge1xuICAgICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LFxuICAgICAgICAgICAgICB5ID0geWkgLSBkYXRhLnkgLSBkYXRhLnZ5LFxuICAgICAgICAgICAgICBsID0geCAqIHggKyB5ICogeTtcbiAgICAgICAgICBpZiAobCA8IHIgKiByKSB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBsICogc3RyZW5ndGg7XG4gICAgICAgICAgICBub2RlLnZ4ICs9ICh4ICo9IGwpICogKHIgPSAocmogKj0gcmopIC8gKHJpMiArIHJqKSk7XG4gICAgICAgICAgICBub2RlLnZ5ICs9ICh5ICo9IGwpICogcjtcbiAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpO1xuICAgICAgICAgICAgZGF0YS52eSAtPSB5ICogcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyByIHx8IHkxIDwgeWkgLSByO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmUocXVhZCkge1xuICAgIGlmIChxdWFkLmRhdGEpIHJldHVybiBxdWFkLnIgPSByYWRpaVtxdWFkLmRhdGEuaW5kZXhdO1xuICAgIGZvciAodmFyIGkgPSBxdWFkLnIgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICBpZiAocXVhZFtpXSAmJiBxdWFkW2ldLnIgPiBxdWFkLnIpIHtcbiAgICAgICAgcXVhZC5yID0gcXVhZFtpXS5yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHJhZGlpID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgcmFkaWlbbm9kZS5pbmRleF0gPSArcmFkaXVzKG5vZGUsIGksIG5vZGVzKTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogcmFkaXVzO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5cbmZ1bmN0aW9uIGluZGV4KGQpIHtcbiAgcmV0dXJuIGQuaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGZpbmQobm9kZUJ5SWQsIG5vZGVJZCkge1xuICB2YXIgbm9kZSA9IG5vZGVCeUlkLmdldChub2RlSWQpO1xuICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcihcIm5vZGUgbm90IGZvdW5kOiBcIiArIG5vZGVJZCk7XG4gIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihsaW5rcykge1xuICB2YXIgaWQgPSBpbmRleCxcbiAgICAgIHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLFxuICAgICAgc3RyZW5ndGhzLFxuICAgICAgZGlzdGFuY2UgPSBjb25zdGFudCgzMCksXG4gICAgICBkaXN0YW5jZXMsXG4gICAgICBub2RlcyxcbiAgICAgIGNvdW50LFxuICAgICAgYmlhcyxcbiAgICAgIHJhbmRvbSxcbiAgICAgIGl0ZXJhdGlvbnMgPSAxO1xuXG4gIGlmIChsaW5rcyA9PSBudWxsKSBsaW5rcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7XG4gICAgcmV0dXJuIDEgLyBNYXRoLm1pbihjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0sIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgIGZvciAodmFyIGsgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGluaywgc291cmNlLCB0YXJnZXQsIHgsIHksIGwsIGI7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbGluayA9IGxpbmtzW2ldLCBzb3VyY2UgPSBsaW5rLnNvdXJjZSwgdGFyZ2V0ID0gbGluay50YXJnZXQ7XG4gICAgICAgIHggPSB0YXJnZXQueCArIHRhcmdldC52eCAtIHNvdXJjZS54IC0gc291cmNlLnZ4IHx8IGppZ2dsZShyYW5kb20pO1xuICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUocmFuZG9tKTtcbiAgICAgICAgbCA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgICAgbCA9IChsIC0gZGlzdGFuY2VzW2ldKSAvIGwgKiBhbHBoYSAqIHN0cmVuZ3Roc1tpXTtcbiAgICAgICAgeCAqPSBsLCB5ICo9IGw7XG4gICAgICAgIHRhcmdldC52eCAtPSB4ICogKGIgPSBiaWFzW2ldKTtcbiAgICAgICAgdGFyZ2V0LnZ5IC09IHkgKiBiO1xuICAgICAgICBzb3VyY2UudnggKz0geCAqIChiID0gMSAtIGIpO1xuICAgICAgICBzb3VyY2UudnkgKz0geSAqIGI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICB2YXIgaSxcbiAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCxcbiAgICAgICAgbm9kZUJ5SWQgPSBuZXcgTWFwKG5vZGVzLm1hcCgoZCwgaSkgPT4gW2lkKGQsIGksIG5vZGVzKSwgZF0pKSxcbiAgICAgICAgbGluaztcblxuICAgIGZvciAoaSA9IDAsIGNvdW50ID0gbmV3IEFycmF5KG4pOyBpIDwgbTsgKytpKSB7XG4gICAgICBsaW5rID0gbGlua3NbaV0sIGxpbmsuaW5kZXggPSBpO1xuICAgICAgaWYgKHR5cGVvZiBsaW5rLnNvdXJjZSAhPT0gXCJvYmplY3RcIikgbGluay5zb3VyY2UgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnNvdXJjZSk7XG4gICAgICBpZiAodHlwZW9mIGxpbmsudGFyZ2V0ICE9PSBcIm9iamVjdFwiKSBsaW5rLnRhcmdldCA9IGZpbmQobm9kZUJ5SWQsIGxpbmsudGFyZ2V0KTtcbiAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gfHwgMCkgKyAxO1xuICAgICAgY291bnRbbGluay50YXJnZXQuaW5kZXhdID0gKGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSB8fCAwKSArIDE7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgYmlhcyA9IG5ldyBBcnJheShtKTsgaSA8IG07ICsraSkge1xuICAgICAgbGluayA9IGxpbmtzW2ldLCBiaWFzW2ldID0gY291bnRbbGluay5zb3VyY2UuaW5kZXhdIC8gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSArIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7XG4gICAgfVxuXG4gICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplU3RyZW5ndGgoKTtcbiAgICBkaXN0YW5jZXMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVEaXN0YW5jZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVN0cmVuZ3RoKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobGlua3NbaV0sIGksIGxpbmtzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRGlzdGFuY2UoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIGRpc3RhbmNlc1tpXSA9ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5rcyA9IF8sIGluaXRpYWxpemUoKSwgZm9yY2UpIDogbGlua3M7XG4gIH07XG5cbiAgZm9yY2UuaWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaWQgPSBfLCBmb3JjZSkgOiBpZDtcbiAgfTtcblxuICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9ucztcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplU3RyZW5ndGgoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2UgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCksIGZvcmNlKSA6IGRpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICIvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfY29uZ3J1ZW50aWFsX2dlbmVyYXRvciNQYXJhbWV0ZXJzX2luX2NvbW1vbl91c2VcbmNvbnN0IGEgPSAxNjY0NTI1O1xuY29uc3QgYyA9IDEwMTM5MDQyMjM7XG5jb25zdCBtID0gNDI5NDk2NzI5NjsgLy8gMl4zMlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHMgPSAxO1xuICByZXR1cm4gKCkgPT4gKHMgPSAoYSAqIHMgKyBjKSAlIG0pIC8gbTtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXJ9IGZyb20gXCJkMy10aW1lclwiO1xuaW1wb3J0IGxjZyBmcm9tIFwiLi9sY2cuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54O1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnk7XG59XG5cbnZhciBpbml0aWFsUmFkaXVzID0gMTAsXG4gICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZXMpIHtcbiAgdmFyIHNpbXVsYXRpb24sXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBhbHBoYU1pbiA9IDAuMDAxLFxuICAgICAgYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyhhbHBoYU1pbiwgMSAvIDMwMCksXG4gICAgICBhbHBoYVRhcmdldCA9IDAsXG4gICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LFxuICAgICAgZm9yY2VzID0gbmV3IE1hcCgpLFxuICAgICAgc3RlcHBlciA9IHRpbWVyKHN0ZXApLFxuICAgICAgZXZlbnQgPSBkaXNwYXRjaChcInRpY2tcIiwgXCJlbmRcIiksXG4gICAgICByYW5kb20gPSBsY2coKTtcblxuICBpZiAobm9kZXMgPT0gbnVsbCkgbm9kZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwKCkge1xuICAgIHRpY2soKTtcbiAgICBldmVudC5jYWxsKFwidGlja1wiLCBzaW11bGF0aW9uKTtcbiAgICBpZiAoYWxwaGEgPCBhbHBoYU1pbikge1xuICAgICAgc3RlcHBlci5zdG9wKCk7XG4gICAgICBldmVudC5jYWxsKFwiZW5kXCIsIHNpbXVsYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soaXRlcmF0aW9ucykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgaXRlcmF0aW9ucyA9IDE7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTtcblxuICAgICAgZm9yY2VzLmZvckVhY2goZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgZm9yY2UoYWxwaGEpO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5meCA9PSBudWxsKSBub2RlLnggKz0gbm9kZS52eCAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueCA9IG5vZGUuZngsIG5vZGUudnggPSAwO1xuICAgICAgICBpZiAobm9kZS5meSA9PSBudWxsKSBub2RlLnkgKz0gbm9kZS52eSAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueSA9IG5vZGUuZnksIG5vZGUudnkgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaW11bGF0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUuaW5kZXggPSBpO1xuICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0gbm9kZS5meDtcbiAgICAgIGlmIChub2RlLmZ5ICE9IG51bGwpIG5vZGUueSA9IG5vZGUuZnk7XG4gICAgICBpZiAoaXNOYU4obm9kZS54KSB8fCBpc05hTihub2RlLnkpKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KDAuNSArIGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5nbGU7XG4gICAgICAgIG5vZGUueCA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgbm9kZS55ID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzTmFOKG5vZGUudngpIHx8IGlzTmFOKG5vZGUudnkpKSB7XG4gICAgICAgIG5vZGUudnggPSBub2RlLnZ5ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRm9yY2UoZm9yY2UpIHtcbiAgICBpZiAoZm9yY2UuaW5pdGlhbGl6ZSkgZm9yY2UuaW5pdGlhbGl6ZShub2RlcywgcmFuZG9tKTtcbiAgICByZXR1cm4gZm9yY2U7XG4gIH1cblxuICBpbml0aWFsaXplTm9kZXMoKTtcblxuICByZXR1cm4gc2ltdWxhdGlvbiA9IHtcbiAgICB0aWNrOiB0aWNrLFxuXG4gICAgcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RlcHBlci5yZXN0YXJ0KHN0ZXApLCBzaW11bGF0aW9uO1xuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjtcbiAgICB9LFxuXG4gICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVzID0gXywgaW5pdGlhbGl6ZU5vZGVzKCksIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogbm9kZXM7XG4gICAgfSxcblxuICAgIGFscGhhOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhO1xuICAgIH0sXG5cbiAgICBhbHBoYU1pbjogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYU1pbjtcbiAgICB9LFxuXG4gICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFEZWNheSA9ICtfLCBzaW11bGF0aW9uKSA6ICthbHBoYURlY2F5O1xuICAgIH0sXG5cbiAgICBhbHBoYVRhcmdldDogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFUYXJnZXQgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYVRhcmdldDtcbiAgICB9LFxuXG4gICAgdmVsb2NpdHlEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBzaW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5O1xuICAgIH0sXG5cbiAgICByYW5kb21Tb3VyY2U6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmRvbSA9IF8sIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogcmFuZG9tO1xuICAgIH0sXG5cbiAgICBmb3JjZTogZnVuY3Rpb24obmFtZSwgXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gKChfID09IG51bGwgPyBmb3JjZXMuZGVsZXRlKG5hbWUpIDogZm9yY2VzLnNldChuYW1lLCBpbml0aWFsaXplRm9yY2UoXykpKSwgc2ltdWxhdGlvbikgOiBmb3JjZXMuZ2V0KG5hbWUpO1xuICAgIH0sXG5cbiAgICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICAgIGR4LFxuICAgICAgICAgIGR5LFxuICAgICAgICAgIGQyLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY2xvc2VzdDtcblxuICAgICAgaWYgKHJhZGl1cyA9PSBudWxsKSByYWRpdXMgPSBJbmZpbml0eTtcbiAgICAgIGVsc2UgcmFkaXVzICo9IHJhZGl1cztcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGR4ID0geCAtIG5vZGUueDtcbiAgICAgICAgZHkgPSB5IC0gbm9kZS55O1xuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3QgPSBub2RlLCByYWRpdXMgPSBkMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsb3Nlc3Q7XG4gICAgfSxcblxuICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoZXZlbnQub24obmFtZSwgXyksIHNpbXVsYXRpb24pIDogZXZlbnQub24obmFtZSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7cXVhZHRyZWV9IGZyb20gXCJkMy1xdWFkdHJlZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgamlnZ2xlIGZyb20gXCIuL2ppZ2dsZS5qc1wiO1xuaW1wb3J0IHt4LCB5fSBmcm9tIFwiLi9zaW11bGF0aW9uLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZXMsXG4gICAgICBub2RlLFxuICAgICAgcmFuZG9tLFxuICAgICAgYWxwaGEsXG4gICAgICBzdHJlbmd0aCA9IGNvbnN0YW50KC0zMCksXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICBkaXN0YW5jZU1pbjIgPSAxLFxuICAgICAgZGlzdGFuY2VNYXgyID0gSW5maW5pdHksXG4gICAgICB0aGV0YTIgPSAwLjgxO1xuXG4gIGZ1bmN0aW9uIGZvcmNlKF8pIHtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4LCB5KS52aXNpdEFmdGVyKGFjY3VtdWxhdGUpO1xuICAgIGZvciAoYWxwaGEgPSBfLCBpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCB0cmVlLnZpc2l0KGFwcGx5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHN0cmVuZ3Roc1tub2RlLmluZGV4XSA9ICtzdHJlbmd0aChub2RlLCBpLCBub2Rlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBhY2N1bXVsYXRlKHF1YWQpIHtcbiAgICB2YXIgc3RyZW5ndGggPSAwLCBxLCBjLCB3ZWlnaHQgPSAwLCB4LCB5LCBpO1xuXG4gICAgLy8gRm9yIGludGVybmFsIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNoaWxkIHF1YWRyYW50cy5cbiAgICBpZiAocXVhZC5sZW5ndGgpIHtcbiAgICAgIGZvciAoeCA9IHkgPSBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICBpZiAoKHEgPSBxdWFkW2ldKSAmJiAoYyA9IE1hdGguYWJzKHEudmFsdWUpKSkge1xuICAgICAgICAgIHN0cmVuZ3RoICs9IHEudmFsdWUsIHdlaWdodCArPSBjLCB4ICs9IGMgKiBxLngsIHkgKz0gYyAqIHEueTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVhZC54ID0geCAvIHdlaWdodDtcbiAgICAgIHF1YWQueSA9IHkgLyB3ZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gRm9yIGxlYWYgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY29pbmNpZGVudCBxdWFkcmFudHMuXG4gICAgZWxzZSB7XG4gICAgICBxID0gcXVhZDtcbiAgICAgIHEueCA9IHEuZGF0YS54O1xuICAgICAgcS55ID0gcS5kYXRhLnk7XG4gICAgICBkbyBzdHJlbmd0aCArPSBzdHJlbmd0aHNbcS5kYXRhLmluZGV4XTtcbiAgICAgIHdoaWxlIChxID0gcS5uZXh0KTtcbiAgICB9XG5cbiAgICBxdWFkLnZhbHVlID0gc3RyZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MSwgXywgeDIpIHtcbiAgICBpZiAoIXF1YWQudmFsdWUpIHJldHVybiB0cnVlO1xuXG4gICAgdmFyIHggPSBxdWFkLnggLSBub2RlLngsXG4gICAgICAgIHkgPSBxdWFkLnkgLSBub2RlLnksXG4gICAgICAgIHcgPSB4MiAtIHgxLFxuICAgICAgICBsID0geCAqIHggKyB5ICogeTtcblxuICAgIC8vIEFwcGx5IHRoZSBCYXJuZXMtSHV0IGFwcHJveGltYXRpb24gaWYgcG9zc2libGUuXG4gICAgLy8gTGltaXQgZm9yY2VzIGZvciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuXG4gICAgaWYgKHcgKiB3IC8gdGhldGEyIDwgbCkge1xuICAgICAgaWYgKGwgPCBkaXN0YW5jZU1heDIpIHtcbiAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgICAgaWYgKGwgPCBkaXN0YW5jZU1pbjIpIGwgPSBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yICogbCk7XG4gICAgICAgIG5vZGUudnggKz0geCAqIHF1YWQudmFsdWUgKiBhbHBoYSAvIGw7XG4gICAgICAgIG5vZGUudnkgKz0geSAqIHF1YWQudmFsdWUgKiBhbHBoYSAvIGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgcG9pbnRzIGRpcmVjdGx5LlxuICAgIGVsc2UgaWYgKHF1YWQubGVuZ3RoIHx8IGwgPj0gZGlzdGFuY2VNYXgyKSByZXR1cm47XG5cbiAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC5cbiAgICBpZiAocXVhZC5kYXRhICE9PSBub2RlIHx8IHF1YWQubmV4dCkge1xuICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geSAqIHk7XG4gICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTtcbiAgICB9XG5cbiAgICBkbyBpZiAocXVhZC5kYXRhICE9PSBub2RlKSB7XG4gICAgICB3ID0gc3RyZW5ndGhzW3F1YWQuZGF0YS5pbmRleF0gKiBhbHBoYSAvIGw7XG4gICAgICBub2RlLnZ4ICs9IHggKiB3O1xuICAgICAgbm9kZS52eSArPSB5ICogdztcbiAgICB9IHdoaWxlIChxdWFkID0gcXVhZC5uZXh0KTtcbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfbm9kZXMsIF9yYW5kb20pIHtcbiAgICBub2RlcyA9IF9ub2RlcztcbiAgICByYW5kb20gPSBfcmFuZG9tO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLmRpc3RhbmNlTWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlTWluMiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQoZGlzdGFuY2VNaW4yKTtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZU1heCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1heDIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWF4Mik7XG4gIH07XG5cbiAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhldGEyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydCh0aGV0YTIpO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBNYXRoLmFicyh4ID0gTWF0aC5yb3VuZCh4KSkgPj0gMWUyMVxuICAgICAgPyB4LnRvTG9jYWxlU3RyaW5nKFwiZW5cIikucmVwbGFjZSgvLC9nLCBcIlwiKVxuICAgICAgOiB4LnRvU3RyaW5nKDEwKTtcbn1cblxuLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aFxuLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuXG4vLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbFBhcnRzKDEuMjMpIHJldHVybnMgW1wiMTIzXCIsIDBdLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBwKSB7XG4gIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZihcImVcIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgXHUwMEIxSW5maW5pdHlcbiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTtcblxuICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcXGRcXC5cXGQrZVstK11cXGQrXG4gIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxcZGVbLStdXFxkKyAoZS5nLiwgMWUrMykuXG4gIHJldHVybiBbXG4gICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCxcbiAgICAreC5zbGljZShpICsgMSlcbiAgXTtcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbFBhcnRzKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZ3JvdXBpbmcsIHRob3VzYW5kcykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsXG4gICAgICAgIHQgPSBbXSxcbiAgICAgICAgaiA9IDAsXG4gICAgICAgIGcgPSBncm91cGluZ1swXSxcbiAgICAgICAgbGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7XG4gICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihudW1lcmFscykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkge1xuICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTtcbiAgICB9KTtcbiAgfTtcbn1cbiIsICIvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdXG52YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXFwtKCBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLlxcZCspPyh+KT8oW2EteiVdKT8kL2k7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHtcbiAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdDogXCIgKyBzcGVjaWZpZXIpO1xuICB2YXIgbWF0Y2g7XG4gIHJldHVybiBuZXcgRm9ybWF0U3BlY2lmaWVyKHtcbiAgICBmaWxsOiBtYXRjaFsxXSxcbiAgICBhbGlnbjogbWF0Y2hbMl0sXG4gICAgc2lnbjogbWF0Y2hbM10sXG4gICAgc3ltYm9sOiBtYXRjaFs0XSxcbiAgICB6ZXJvOiBtYXRjaFs1XSxcbiAgICB3aWR0aDogbWF0Y2hbNl0sXG4gICAgY29tbWE6IG1hdGNoWzddLFxuICAgIHByZWNpc2lvbjogbWF0Y2hbOF0gJiYgbWF0Y2hbOF0uc2xpY2UoMSksXG4gICAgdHJpbTogbWF0Y2hbOV0sXG4gICAgdHlwZTogbWF0Y2hbMTBdXG4gIH0pO1xufVxuXG5mb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZlxuXG5leHBvcnQgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICB0aGlzLmZpbGwgPSBzcGVjaWZpZXIuZmlsbCA9PT0gdW5kZWZpbmVkID8gXCIgXCIgOiBzcGVjaWZpZXIuZmlsbCArIFwiXCI7XG4gIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/IFwiPlwiIDogc3BlY2lmaWVyLmFsaWduICsgXCJcIjtcbiAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/IFwiLVwiIDogc3BlY2lmaWVyLnNpZ24gKyBcIlwiO1xuICB0aGlzLnN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBzcGVjaWZpZXIuc3ltYm9sICsgXCJcIjtcbiAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybztcbiAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDtcbiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hO1xuICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uO1xuICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltO1xuICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci50eXBlICsgXCJcIjtcbn1cblxuRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5maWxsXG4gICAgICArIHRoaXMuYWxpZ25cbiAgICAgICsgdGhpcy5zaWduXG4gICAgICArIHRoaXMuc3ltYm9sXG4gICAgICArICh0aGlzLnplcm8gPyBcIjBcIiA6IFwiXCIpXG4gICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyBcIlwiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKVxuICAgICAgKyAodGhpcy5jb21tYSA/IFwiLFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCIuXCIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKVxuICAgICAgKyAodGhpcy50cmltID8gXCJ+XCIgOiBcIlwiKVxuICAgICAgKyB0aGlzLnR5cGU7XG59O1xuIiwgIi8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocykge1xuICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7XG4gICAgc3dpdGNoIChzW2ldKSB7XG4gICAgICBjYXNlIFwiLlwiOiBpMCA9IGkxID0gaTsgYnJlYWs7XG4gICAgICBjYXNlIFwiMFwiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogcztcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgdmFyIHByZWZpeEV4cG9uZW50O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXSxcbiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSxcbiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7XG4gIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnRcbiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oXCIwXCIpXG4gICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyBcIi5cIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpXG4gICAgICA6IFwiMC5cIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbihcIjBcIikgKyBmb3JtYXREZWNpbWFsUGFydHMoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSFcbn1cbiIsICJpbXBvcnQge2Zvcm1hdERlY2ltYWxQYXJ0c30gZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCBwKSB7XG4gIHZhciBkID0gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApO1xuICBpZiAoIWQpIHJldHVybiB4ICsgXCJcIjtcbiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSxcbiAgICAgIGV4cG9uZW50ID0gZFsxXTtcbiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/IFwiMC5cIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oXCIwXCIpICsgY29lZmZpY2llbnRcbiAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKVxuICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oXCIwXCIpO1xufVxuIiwgImltcG9ydCBmb3JtYXREZWNpbWFsIGZyb20gXCIuL2Zvcm1hdERlY2ltYWwuanNcIjtcbmltcG9ydCBmb3JtYXRQcmVmaXhBdXRvIGZyb20gXCIuL2Zvcm1hdFByZWZpeEF1dG8uanNcIjtcbmltcG9ydCBmb3JtYXRSb3VuZGVkIGZyb20gXCIuL2Zvcm1hdFJvdW5kZWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBcIiVcIjogKHgsIHApID0+ICh4ICogMTAwKS50b0ZpeGVkKHApLFxuICBcImJcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMiksXG4gIFwiY1wiOiAoeCkgPT4geCArIFwiXCIsXG4gIFwiZFwiOiBmb3JtYXREZWNpbWFsLFxuICBcImVcIjogKHgsIHApID0+IHgudG9FeHBvbmVudGlhbChwKSxcbiAgXCJmXCI6ICh4LCBwKSA9PiB4LnRvRml4ZWQocCksXG4gIFwiZ1wiOiAoeCwgcCkgPT4geC50b1ByZWNpc2lvbihwKSxcbiAgXCJvXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpLFxuICBcInBcIjogKHgsIHApID0+IGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCksXG4gIFwiclwiOiBmb3JtYXRSb3VuZGVkLFxuICBcInNcIjogZm9ybWF0UHJlZml4QXV0byxcbiAgXCJYXCI6ICh4KSA9PiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLFxuICBcInhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpXG59O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5pbXBvcnQgZm9ybWF0R3JvdXAgZnJvbSBcIi4vZm9ybWF0R3JvdXAuanNcIjtcbmltcG9ydCBmb3JtYXROdW1lcmFscyBmcm9tIFwiLi9mb3JtYXROdW1lcmFscy5qc1wiO1xuaW1wb3J0IGZvcm1hdFNwZWNpZmllciBmcm9tIFwiLi9mb3JtYXRTcGVjaWZpZXIuanNcIjtcbmltcG9ydCBmb3JtYXRUcmltIGZyb20gXCIuL2Zvcm1hdFRyaW0uanNcIjtcbmltcG9ydCBmb3JtYXRUeXBlcyBmcm9tIFwiLi9mb3JtYXRUeXBlcy5qc1wiO1xuaW1wb3J0IHtwcmVmaXhFeHBvbmVudH0gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gXCIuL2lkZW50aXR5LmpzXCI7XG5cbnZhciBtYXAgPSBBcnJheS5wcm90b3R5cGUubWFwLFxuICAgIHByZWZpeGVzID0gW1wieVwiLFwielwiLFwiYVwiLFwiZlwiLFwicFwiLFwiblwiLFwiXHUwMEI1XCIsXCJtXCIsXCJcIixcImtcIixcIk1cIixcIkdcIixcIlRcIixcIlBcIixcIkVcIixcIlpcIixcIllcIl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxvY2FsZSkge1xuICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdEdyb3VwKG1hcC5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArIFwiXCIpLFxuICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyBcIlwiLFxuICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyBcIlwiLFxuICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyBcIi5cIiA6IGxvY2FsZS5kZWNpbWFsICsgXCJcIixcbiAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSA6IGZvcm1hdE51bWVyYWxzKG1hcC5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksXG4gICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/IFwiJVwiIDogbG9jYWxlLnBlcmNlbnQgKyBcIlwiLFxuICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/IFwiXHUyMjEyXCIgOiBsb2NhbGUubWludXMgKyBcIlwiLFxuICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gXCJOYU5cIiA6IGxvY2FsZS5uYW4gKyBcIlwiO1xuXG4gIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHtcbiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTtcblxuICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsXG4gICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLFxuICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sXG4gICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsXG4gICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybyxcbiAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsXG4gICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLFxuICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLFxuICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sXG4gICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTtcblxuICAgIC8vIFRoZSBcIm5cIiB0eXBlIGlzIGFuIGFsaWFzIGZvciBcIixnXCIuXG4gICAgaWYgKHR5cGUgPT09IFwiblwiKSBjb21tYSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIFRoZSBcIlwiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgXCIuMTJ+Z1wiLlxuICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSBcImdcIjtcblxuICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLlxuICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSBcIjBcIiAmJiBhbGlnbiA9PT0gXCI9XCIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9IFwiMFwiLCBhbGlnbiA9IFwiPVwiO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuXG4gICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gXCIkXCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gXCIjXCIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogXCJcIixcbiAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogXCJcIjtcblxuICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/XG4gICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/XG4gICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj9cbiAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLFxuICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpO1xuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBub3Qgc3BlY2lmaWVkLFxuICAgIC8vIG9yIGNsYW1wIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uIHRvIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4gICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMSwgMjFdLlxuICAgIC8vIEZvciBmaXhlZCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzAsIDIwXS5cbiAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IDZcbiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpXG4gICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuXG4gICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7XG4gICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsXG4gICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsXG4gICAgICAgICAgaSwgbiwgYztcblxuICAgICAgaWYgKHR5cGUgPT09IFwiY1wiKSB7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSArdmFsdWU7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhXG4gICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLlxuICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pO1xuXG4gICAgICAgIC8vIFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy5cbiAgICAgICAgaWYgKHRyaW0pIHZhbHVlID0gZm9ybWF0VHJpbSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uXG4gICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSBcIitcIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09IFwiKFwiID8gc2lnbiA6IG1pbnVzKSA6IHNpZ24gPT09IFwiLVwiIHx8IHNpZ24gPT09IFwiKFwiID8gXCJcIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7XG4gICAgICAgIHZhbHVlU3VmZml4ID0gKHR5cGUgPT09IFwic1wiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiBcIlwiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gXCIoXCIgPyBcIilcIiA6IFwiXCIpO1xuXG4gICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciBcdTIwMUN2YWx1ZVx1MjAxRCBwYXJ0IHRoYXQgY2FuIGJlXG4gICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIFx1MjAxQ3N1ZmZpeFx1MjAxRCBwYXJ0IHRoYXQgaXMgbm90LlxuICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHtcbiAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1Nykge1xuICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBub3QgXCIwXCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy5cbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG5cbiAgICAgIC8vIElmIHRoZSBmaWxsIGNoYXJhY3RlciBpcyBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLlxuICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gXCJcIjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICAgIGNhc2UgXCI8XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCI9XCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJeXCI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3BlY2lmaWVyICsgXCJcIjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7XG4gICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9IFwiZlwiLCBzcGVjaWZpZXIpKSxcbiAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzLFxuICAgICAgICBrID0gTWF0aC5wb3coMTAsIC1lKSxcbiAgICAgICAgcHJlZml4ID0gcHJlZml4ZXNbOCArIGUgLyAzXTtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmKGsgKiB2YWx1ZSkgKyBwcmVmaXg7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiBuZXdGb3JtYXQsXG4gICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXhcbiAgfTtcbn1cbiIsICJpbXBvcnQgZm9ybWF0TG9jYWxlIGZyb20gXCIuL2xvY2FsZS5qc1wiO1xuXG52YXIgbG9jYWxlO1xuZXhwb3J0IHZhciBmb3JtYXQ7XG5leHBvcnQgdmFyIGZvcm1hdFByZWZpeDtcblxuZGVmYXVsdExvY2FsZSh7XG4gIHRob3VzYW5kczogXCIsXCIsXG4gIGdyb3VwaW5nOiBbM10sXG4gIGN1cnJlbmN5OiBbXCIkXCIsIFwiXCJdXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7XG4gIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTtcbiAgZm9ybWF0ID0gbG9jYWxlLmZvcm1hdDtcbiAgZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDtcbiAgcmV0dXJuIGxvY2FsZTtcbn1cbiIsICJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7XG59XG4iLCAiaW1wb3J0IGV4cG9uZW50IGZyb20gXCIuL2V4cG9uZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0ZXAsIG1heCkge1xuICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQobWF4KSAtIGV4cG9uZW50KHN0ZXApKSArIDE7XG59XG4iLCAiZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24oYSwgYikge1xuICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDI7XG59XG5cbmZ1bmN0aW9uIG1lYW5YKGNoaWxkcmVuKSB7XG4gIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBtZWFuWFJlZHVjZSh4LCBjKSB7XG4gIHJldHVybiB4ICsgYy54O1xufVxuXG5mdW5jdGlvbiBtYXhZKGNoaWxkcmVuKSB7XG4gIHJldHVybiAxICsgY2hpbGRyZW4ucmVkdWNlKG1heFlSZWR1Y2UsIDApO1xufVxuXG5mdW5jdGlvbiBtYXhZUmVkdWNlKHksIGMpIHtcbiAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7XG59XG5cbmZ1bmN0aW9uIGxlYWZMZWZ0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuO1xuICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bMF07XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBsZWFmUmlnaHQobm9kZSkge1xuICB2YXIgY2hpbGRyZW47XG4gIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgbm9kZVNpemUgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBjbHVzdGVyKHJvb3QpIHtcbiAgICB2YXIgcHJldmlvdXNOb2RlLFxuICAgICAgICB4ID0gMDtcblxuICAgIC8vIEZpcnN0IHdhbGssIGNvbXB1dGluZyB0aGUgaW5pdGlhbCB4ICYgeSB2YWx1ZXMuXG4gICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7XG4gICAgICAgIG5vZGUueSA9IG1heFkoY2hpbGRyZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwO1xuICAgICAgICBub2RlLnkgPSAwO1xuICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxlZnQgPSBsZWFmTGVmdChyb290KSxcbiAgICAgICAgcmlnaHQgPSBsZWFmUmlnaHQocm9vdCksXG4gICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLFxuICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7XG5cbiAgICAvLyBTZWNvbmQgd2Fsaywgbm9ybWFsaXppbmcgeCAmIHkgdG8gdGhlIGRlc2lyZWQgc2l6ZS5cbiAgICByZXR1cm4gcm9vdC5lYWNoQWZ0ZXIobm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlLnggPSAobm9kZS54IC0gcm9vdC54KSAqIGR4O1xuICAgICAgbm9kZS55ID0gKHJvb3QueSAtIG5vZGUueSkgKiBkeTtcbiAgICB9IDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHgwKSAvICh4MSAtIHgwKSAqIGR4O1xuICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogZHk7XG4gICAgfSk7XG4gIH1cblxuICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIGNsdXN0ZXIpIDogc2VwYXJhdGlvbjtcbiAgfTtcblxuICBjbHVzdGVyLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pO1xuICB9O1xuXG4gIGNsdXN0ZXIubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIGNsdXN0ZXI7XG59XG4iLCAiZnVuY3Rpb24gY291bnQobm9kZSkge1xuICB2YXIgc3VtID0gMCxcbiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbixcbiAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7XG4gIGlmICghaSkgc3VtID0gMTtcbiAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTtcbiAgbm9kZS52YWx1ZSA9IHN1bTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2hBZnRlcihjb3VudCk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIHRoYXQpIHtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSB7XG4gICAgY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgdGhhdCkge1xuICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBjaGlsZHJlbiwgaSwgaW5kZXggPSAtMTtcbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGNhbGxiYWNrLmNhbGwodGhhdCwgbm9kZSwgKytpbmRleCwgdGhpcyk7XG4gICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGF0KSB7XG4gIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIG5leHQgPSBbXSwgY2hpbGRyZW4sIGksIG4sIGluZGV4ID0gLTE7XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBuZXh0LnB1c2gobm9kZSk7XG4gICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd2hpbGUgKG5vZGUgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgdGhhdCkge1xuICBsZXQgaW5kZXggPSAtMTtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpIHtcbiAgICBpZiAoY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgc3VtID0gK3ZhbHVlKG5vZGUuZGF0YSkgfHwgMCxcbiAgICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLFxuICAgICAgICBpID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHdoaWxlICgtLWkgPj0gMCkgc3VtICs9IGNoaWxkcmVuW2ldLnZhbHVlO1xuICAgIG5vZGUudmFsdWUgPSBzdW07XG4gIH0pO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4uc29ydChjb21wYXJlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGVuZCkge1xuICB2YXIgc3RhcnQgPSB0aGlzLFxuICAgICAgYW5jZXN0b3IgPSBsZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLFxuICAgICAgbm9kZXMgPSBbc3RhcnRdO1xuICB3aGlsZSAoc3RhcnQgIT09IGFuY2VzdG9yKSB7XG4gICAgc3RhcnQgPSBzdGFydC5wYXJlbnQ7XG4gICAgbm9kZXMucHVzaChzdGFydCk7XG4gIH1cbiAgdmFyIGsgPSBub2Rlcy5sZW5ndGg7XG4gIHdoaWxlIChlbmQgIT09IGFuY2VzdG9yKSB7XG4gICAgbm9kZXMuc3BsaWNlKGssIDAsIGVuZCk7XG4gICAgZW5kID0gZW5kLnBhcmVudDtcbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG5cbmZ1bmN0aW9uIGxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7XG4gIHZhciBhTm9kZXMgPSBhLmFuY2VzdG9ycygpLFxuICAgICAgYk5vZGVzID0gYi5hbmNlc3RvcnMoKSxcbiAgICAgIGMgPSBudWxsO1xuICBhID0gYU5vZGVzLnBvcCgpO1xuICBiID0gYk5vZGVzLnBvcCgpO1xuICB3aGlsZSAoYSA9PT0gYikge1xuICAgIGMgPSBhO1xuICAgIGEgPSBhTm9kZXMucG9wKCk7XG4gICAgYiA9IGJOb2Rlcy5wb3AoKTtcbiAgfVxuICByZXR1cm4gYztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXTtcbiAgd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudCkge1xuICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGxlYXZlcyA9IFtdO1xuICB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuICAgICAgbGVhdmVzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxlYXZlcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3QgPSB0aGlzLCBsaW5rcyA9IFtdO1xuICByb290LmVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgIGlmIChub2RlICE9PSByb290KSB7IC8vIERvblx1MjAxOXQgaW5jbHVkZSB0aGUgcm9vdFx1MjAxOXMgcGFyZW50LCBpZiBhbnkuXG4gICAgICBsaW5rcy5wdXNoKHtzb3VyY2U6IG5vZGUucGFyZW50LCB0YXJnZXQ6IG5vZGV9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGlua3M7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuO1xuICBkbyB7XG4gICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107XG4gICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7XG4gICAgICB5aWVsZCBub2RlO1xuICAgICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgbmV4dC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAobmV4dC5sZW5ndGgpO1xufVxuIiwgImltcG9ydCBub2RlX2NvdW50IGZyb20gXCIuL2NvdW50LmpzXCI7XG5pbXBvcnQgbm9kZV9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBub2RlX2VhY2hCZWZvcmUgZnJvbSBcIi4vZWFjaEJlZm9yZS5qc1wiO1xuaW1wb3J0IG5vZGVfZWFjaEFmdGVyIGZyb20gXCIuL2VhY2hBZnRlci5qc1wiO1xuaW1wb3J0IG5vZGVfZmluZCBmcm9tIFwiLi9maW5kLmpzXCI7XG5pbXBvcnQgbm9kZV9zdW0gZnJvbSBcIi4vc3VtLmpzXCI7XG5pbXBvcnQgbm9kZV9zb3J0IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBub2RlX3BhdGggZnJvbSBcIi4vcGF0aC5qc1wiO1xuaW1wb3J0IG5vZGVfYW5jZXN0b3JzIGZyb20gXCIuL2FuY2VzdG9ycy5qc1wiO1xuaW1wb3J0IG5vZGVfZGVzY2VuZGFudHMgZnJvbSBcIi4vZGVzY2VuZGFudHMuanNcIjtcbmltcG9ydCBub2RlX2xlYXZlcyBmcm9tIFwiLi9sZWF2ZXMuanNcIjtcbmltcG9ydCBub2RlX2xpbmtzIGZyb20gXCIuL2xpbmtzLmpzXCI7XG5pbXBvcnQgbm9kZV9pdGVyYXRvciBmcm9tIFwiLi9pdGVyYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoaWVyYXJjaHkoZGF0YSwgY2hpbGRyZW4pIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBkYXRhID0gW3VuZGVmaW5lZCwgZGF0YV07XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIGNoaWxkcmVuID0gbWFwQ2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIGNoaWxkcmVuID0gb2JqZWN0Q2hpbGRyZW47XG4gIH1cblxuICB2YXIgcm9vdCA9IG5ldyBOb2RlKGRhdGEpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVzID0gW3Jvb3RdLFxuICAgICAgY2hpbGQsXG4gICAgICBjaGlsZHMsXG4gICAgICBpLFxuICAgICAgbjtcblxuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgaWYgKChjaGlsZHMgPSBjaGlsZHJlbihub2RlLmRhdGEpKSAmJiAobiA9IChjaGlsZHMgPSBBcnJheS5mcm9tKGNoaWxkcykpLmxlbmd0aCkpIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHM7XG4gICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IGNoaWxkc1tpXSA9IG5ldyBOb2RlKGNoaWxkc1tpXSkpO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xuICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIG5vZGVfY29weSgpIHtcbiAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0Q2hpbGRyZW4oZCkge1xuICByZXR1cm4gZC5jaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oZCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShkKSA/IGRbMV0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb3B5RGF0YShub2RlKSB7XG4gIGlmIChub2RlLmRhdGEudmFsdWUgIT09IHVuZGVmaW5lZCkgbm9kZS52YWx1ZSA9IG5vZGUuZGF0YS52YWx1ZTtcbiAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLmRhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGVpZ2h0KG5vZGUpIHtcbiAgdmFyIGhlaWdodCA9IDA7XG4gIGRvIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICB3aGlsZSAoKG5vZGUgPSBub2RlLnBhcmVudCkgJiYgKG5vZGUuaGVpZ2h0IDwgKytoZWlnaHQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vZGUoZGF0YSkge1xuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLmRlcHRoID1cbiAgdGhpcy5oZWlnaHQgPSAwO1xuICB0aGlzLnBhcmVudCA9IG51bGw7XG59XG5cbk5vZGUucHJvdG90eXBlID0gaGllcmFyY2h5LnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IE5vZGUsXG4gIGNvdW50OiBub2RlX2NvdW50LFxuICBlYWNoOiBub2RlX2VhY2gsXG4gIGVhY2hBZnRlcjogbm9kZV9lYWNoQWZ0ZXIsXG4gIGVhY2hCZWZvcmU6IG5vZGVfZWFjaEJlZm9yZSxcbiAgZmluZDogbm9kZV9maW5kLFxuICBzdW06IG5vZGVfc3VtLFxuICBzb3J0OiBub2RlX3NvcnQsXG4gIHBhdGg6IG5vZGVfcGF0aCxcbiAgYW5jZXN0b3JzOiBub2RlX2FuY2VzdG9ycyxcbiAgZGVzY2VuZGFudHM6IG5vZGVfZGVzY2VuZGFudHMsXG4gIGxlYXZlczogbm9kZV9sZWF2ZXMsXG4gIGxpbmtzOiBub2RlX2xpbmtzLFxuICBjb3B5OiBub2RlX2NvcHksXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBub2RlX2l0ZXJhdG9yXG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbChmKSB7XG4gIHJldHVybiBmID09IG51bGwgPyBudWxsIDogcmVxdWlyZWQoZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChmKSB7XG4gIGlmICh0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBjb25zdGFudFplcm8oKSB7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIG5vZGUueDAgPSBNYXRoLnJvdW5kKG5vZGUueDApO1xuICBub2RlLnkwID0gTWF0aC5yb3VuZChub2RlLnkwKTtcbiAgbm9kZS54MSA9IE1hdGgucm91bmQobm9kZS54MSk7XG4gIG5vZGUueTEgPSBNYXRoLnJvdW5kKG5vZGUueTEpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgbm9kZSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBrID0gcGFyZW50LnZhbHVlICYmICh4MSAtIHgwKSAvIHBhcmVudC52YWx1ZTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS55MCA9IHkwLCBub2RlLnkxID0geTE7XG4gICAgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDAgKz0gbm9kZS52YWx1ZSAqIGs7XG4gIH1cbn1cbiIsICJpbXBvcnQgcm91bmROb2RlIGZyb20gXCIuL3RyZWVtYXAvcm91bmQuanNcIjtcbmltcG9ydCB0cmVlbWFwRGljZSBmcm9tIFwiLi90cmVlbWFwL2RpY2UuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBkeCA9IDEsXG4gICAgICBkeSA9IDEsXG4gICAgICBwYWRkaW5nID0gMCxcbiAgICAgIHJvdW5kID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHtcbiAgICB2YXIgbiA9IHJvb3QuaGVpZ2h0ICsgMTtcbiAgICByb290LngwID1cbiAgICByb290LnkwID0gcGFkZGluZztcbiAgICByb290LngxID0gZHg7XG4gICAgcm9vdC55MSA9IGR5IC8gbjtcbiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBuKSk7XG4gICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShkeSwgbikge1xuICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICB0cmVlbWFwRGljZShub2RlLCBub2RlLngwLCBkeSAqIChub2RlLmRlcHRoICsgMSkgLyBuLCBub2RlLngxLCBkeSAqIChub2RlLmRlcHRoICsgMikgLyBuKTtcbiAgICAgIH1cbiAgICAgIHZhciB4MCA9IG5vZGUueDAsXG4gICAgICAgICAgeTAgPSBub2RlLnkwLFxuICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRpbmcsXG4gICAgICAgICAgeTEgPSBub2RlLnkxIC0gcGFkZGluZztcbiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjtcbiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIG5vZGUueDAgPSB4MDtcbiAgICAgIG5vZGUueTAgPSB5MDtcbiAgICAgIG5vZGUueDEgPSB4MTtcbiAgICAgIG5vZGUueTEgPSB5MTtcbiAgICB9O1xuICB9XG5cbiAgcGFydGl0aW9uLnJvdW5kID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7XG4gIH07XG5cbiAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFydGl0aW9uKSA6IFtkeCwgZHldO1xuICB9O1xuXG4gIHBhcnRpdGlvbi5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmcgPSAreCwgcGFydGl0aW9uKSA6IHBhZGRpbmc7XG4gIH07XG5cbiAgcmV0dXJuIHBhcnRpdGlvbjtcbn1cbiIsICJpbXBvcnQge3JlcXVpcmVkfSBmcm9tIFwiLi9hY2Nlc3NvcnMuanNcIjtcbmltcG9ydCB7Tm9kZSwgY29tcHV0ZUhlaWdodH0gZnJvbSBcIi4vaGllcmFyY2h5L2luZGV4LmpzXCI7XG5cbnZhciBwcmVyb290ID0ge2RlcHRoOiAtMX0sXG4gICAgYW1iaWd1b3VzID0ge307XG5cbmZ1bmN0aW9uIGRlZmF1bHRJZChkKSB7XG4gIHJldHVybiBkLmlkO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UGFyZW50SWQoZCkge1xuICByZXR1cm4gZC5wYXJlbnRJZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBpZCA9IGRlZmF1bHRJZCxcbiAgICAgIHBhcmVudElkID0gZGVmYXVsdFBhcmVudElkO1xuXG4gIGZ1bmN0aW9uIHN0cmF0aWZ5KGRhdGEpIHtcbiAgICB2YXIgbm9kZXMgPSBBcnJheS5mcm9tKGRhdGEpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBkLFxuICAgICAgICBpLFxuICAgICAgICByb290LFxuICAgICAgICBwYXJlbnQsXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG5vZGVJZCxcbiAgICAgICAgbm9kZUtleSxcbiAgICAgICAgbm9kZUJ5S2V5ID0gbmV3IE1hcDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGQgPSBub2Rlc1tpXSwgbm9kZSA9IG5vZGVzW2ldID0gbmV3IE5vZGUoZCk7XG4gICAgICBpZiAoKG5vZGVJZCA9IGlkKGQsIGksIGRhdGEpKSAhPSBudWxsICYmIChub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgbm9kZUtleSA9IG5vZGUuaWQgPSBub2RlSWQ7XG4gICAgICAgIG5vZGVCeUtleS5zZXQobm9kZUtleSwgbm9kZUJ5S2V5Lmhhcyhub2RlS2V5KSA/IGFtYmlndW91cyA6IG5vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKChub2RlSWQgPSBwYXJlbnRJZChkLCBpLCBkYXRhKSkgIT0gbnVsbCAmJiAobm9kZUlkICs9IFwiXCIpKSB7XG4gICAgICAgIG5vZGUucGFyZW50ID0gbm9kZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIGlmIChub2RlSWQgPSBub2RlLnBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBub2RlQnlLZXkuZ2V0KG5vZGVJZCk7XG4gICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nOiBcIiArIG5vZGVJZCk7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IGFtYmlndW91cykgdGhyb3cgbmV3IEVycm9yKFwiYW1iaWd1b3VzOiBcIiArIG5vZGVJZCk7XG4gICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICBlbHNlIHBhcmVudC5jaGlsZHJlbiA9IFtub2RlXTtcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocm9vdCkgdGhyb3cgbmV3IEVycm9yKFwibXVsdGlwbGUgcm9vdHNcIik7XG4gICAgICAgIHJvb3QgPSBub2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwibm8gcm9vdFwiKTtcbiAgICByb290LnBhcmVudCA9IHByZXJvb3Q7XG4gICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5kZXB0aCA9IG5vZGUucGFyZW50LmRlcHRoICsgMTsgLS1uOyB9KS5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpO1xuICAgIHJvb3QucGFyZW50ID0gbnVsbDtcbiAgICBpZiAobiA+IDApIHRocm93IG5ldyBFcnJvcihcImN5Y2xlXCIpO1xuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDtcbiAgfTtcblxuICBzdHJhdGlmeS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYXJlbnRJZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDtcbiAgfTtcblxuICByZXR1cm4gc3RyYXRpZnk7XG59XG4iLCAiaW1wb3J0IHtOb2RlfSBmcm9tIFwiLi9oaWVyYXJjaHkvaW5kZXguanNcIjtcblxuZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24oYSwgYikge1xuICByZXR1cm4gYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDI7XG59XG5cbi8vIGZ1bmN0aW9uIHJhZGlhbFNlcGFyYXRpb24oYSwgYikge1xuLy8gICByZXR1cm4gKGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyKSAvIGEuZGVwdGg7XG4vLyB9XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmF2ZXJzZSB0aGUgbGVmdCBjb250b3VyIG9mIGEgc3VidHJlZSAob3Jcbi8vIHN1YmZvcmVzdCkuIEl0IHJldHVybnMgdGhlIHN1Y2Nlc3NvciBvZiB2IG9uIHRoaXMgY29udG91ci4gVGhpcyBzdWNjZXNzb3IgaXNcbi8vIGVpdGhlciBnaXZlbiBieSB0aGUgbGVmdG1vc3QgY2hpbGQgb2YgdiBvciBieSB0aGUgdGhyZWFkIG9mIHYuIFRoZSBmdW5jdGlvblxuLy8gcmV0dXJucyBudWxsIGlmIGFuZCBvbmx5IGlmIHYgaXMgb24gdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgaXRzIHN1YnRyZWUuXG5mdW5jdGlvbiBuZXh0TGVmdCh2KSB7XG4gIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47XG4gIHJldHVybiBjaGlsZHJlbiA/IGNoaWxkcmVuWzBdIDogdi50O1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFuYWxvZ291c2x5IHRvIG5leHRMZWZ0LlxuZnVuY3Rpb24gbmV4dFJpZ2h0KHYpIHtcbiAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0gOiB2LnQ7XG59XG5cbi8vIFNoaWZ0cyB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3RlZCBhdCB3Ky4gVGhpcyBpcyBkb25lIGJ5IGluY3JlYXNpbmdcbi8vIHByZWxpbSh3KykgYW5kIG1vZCh3KykgYnkgc2hpZnQuXG5mdW5jdGlvbiBtb3ZlU3VidHJlZSh3bSwgd3AsIHNoaWZ0KSB7XG4gIHZhciBjaGFuZ2UgPSBzaGlmdCAvICh3cC5pIC0gd20uaSk7XG4gIHdwLmMgLT0gY2hhbmdlO1xuICB3cC5zICs9IHNoaWZ0O1xuICB3bS5jICs9IGNoYW5nZTtcbiAgd3AueiArPSBzaGlmdDtcbiAgd3AubSArPSBzaGlmdDtcbn1cblxuLy8gQWxsIG90aGVyIHNoaWZ0cywgYXBwbGllZCB0byB0aGUgc21hbGxlciBzdWJ0cmVlcyBiZXR3ZWVuIHctIGFuZCB3KywgYXJlXG4vLyBwZXJmb3JtZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gcHJlcGFyZSB0aGUgc2hpZnRzLCB3ZSBoYXZlIHRvIGFkanVzdFxuLy8gY2hhbmdlKHcrKSwgc2hpZnQodyspLCBhbmQgY2hhbmdlKHctKS5cbmZ1bmN0aW9uIGV4ZWN1dGVTaGlmdHModikge1xuICB2YXIgc2hpZnQgPSAwLFxuICAgICAgY2hhbmdlID0gMCxcbiAgICAgIGNoaWxkcmVuID0gdi5jaGlsZHJlbixcbiAgICAgIGkgPSBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICB3O1xuICB3aGlsZSAoLS1pID49IDApIHtcbiAgICB3ID0gY2hpbGRyZW5baV07XG4gICAgdy56ICs9IHNoaWZ0O1xuICAgIHcubSArPSBzaGlmdDtcbiAgICBzaGlmdCArPSB3LnMgKyAoY2hhbmdlICs9IHcuYyk7XG4gIH1cbn1cblxuLy8gSWYgdmktXHUyMDE5cyBhbmNlc3RvciBpcyBhIHNpYmxpbmcgb2YgdiwgcmV0dXJucyB2aS1cdTIwMTlzIGFuY2VzdG9yLiBPdGhlcndpc2UsXG4vLyByZXR1cm5zIHRoZSBzcGVjaWZpZWQgKGRlZmF1bHQpIGFuY2VzdG9yLlxuZnVuY3Rpb24gbmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpIHtcbiAgcmV0dXJuIHZpbS5hLnBhcmVudCA9PT0gdi5wYXJlbnQgPyB2aW0uYSA6IGFuY2VzdG9yO1xufVxuXG5mdW5jdGlvbiBUcmVlTm9kZShub2RlLCBpKSB7XG4gIHRoaXMuXyA9IG5vZGU7XG4gIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgdGhpcy5jaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuQSA9IG51bGw7IC8vIGRlZmF1bHQgYW5jZXN0b3JcbiAgdGhpcy5hID0gdGhpczsgLy8gYW5jZXN0b3JcbiAgdGhpcy56ID0gMDsgLy8gcHJlbGltXG4gIHRoaXMubSA9IDA7IC8vIG1vZFxuICB0aGlzLmMgPSAwOyAvLyBjaGFuZ2VcbiAgdGhpcy5zID0gMDsgLy8gc2hpZnRcbiAgdGhpcy50ID0gbnVsbDsgLy8gdGhyZWFkXG4gIHRoaXMuaSA9IGk7IC8vIG51bWJlclxufVxuXG5UcmVlTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5vZGUucHJvdG90eXBlKTtcblxuZnVuY3Rpb24gdHJlZVJvb3Qocm9vdCkge1xuICB2YXIgdHJlZSA9IG5ldyBUcmVlTm9kZShyb290LCAwKSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlcyA9IFt0cmVlXSxcbiAgICAgIGNoaWxkLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBpLFxuICAgICAgbjtcblxuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgaWYgKGNoaWxkcmVuID0gbm9kZS5fLmNoaWxkcmVuKSB7XG4gICAgICBub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KG4gPSBjaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldID0gbmV3IFRyZWVOb2RlKGNoaWxkcmVuW2ldLCBpKSk7XG4gICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKHRyZWUucGFyZW50ID0gbmV3IFRyZWVOb2RlKG51bGwsIDApKS5jaGlsZHJlbiA9IFt0cmVlXTtcbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8vIE5vZGUtbGluayB0cmVlIGRpYWdyYW0gdXNpbmcgdGhlIFJlaW5nb2xkLVRpbGZvcmQgXCJ0aWR5XCIgYWxnb3JpdGhtXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbixcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIG5vZGVTaXplID0gbnVsbDtcblxuICBmdW5jdGlvbiB0cmVlKHJvb3QpIHtcbiAgICB2YXIgdCA9IHRyZWVSb290KHJvb3QpO1xuXG4gICAgLy8gQ29tcHV0ZSB0aGUgbGF5b3V0IHVzaW5nIEJ1Y2hoZWltIGV0IGFsLlx1MjAxOXMgYWxnb3JpdGhtLlxuICAgIHQuZWFjaEFmdGVyKGZpcnN0V2FsayksIHQucGFyZW50Lm0gPSAtdC56O1xuICAgIHQuZWFjaEJlZm9yZShzZWNvbmRXYWxrKTtcblxuICAgIC8vIElmIGEgZml4ZWQgbm9kZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeS5cbiAgICBpZiAobm9kZVNpemUpIHJvb3QuZWFjaEJlZm9yZShzaXplTm9kZSk7XG5cbiAgICAvLyBJZiBhIGZpeGVkIHRyZWUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkgYmFzZWQgb24gdGhlIGV4dGVudC5cbiAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGxlZnQgPSByb290LFxuICAgICAgICAgIHJpZ2h0ID0gcm9vdCxcbiAgICAgICAgICBib3R0b20gPSByb290O1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7XG4gICAgICAgIGlmIChub2RlLnggPiByaWdodC54KSByaWdodCA9IG5vZGU7XG4gICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlO1xuICAgICAgfSk7XG4gICAgICB2YXIgcyA9IGxlZnQgPT09IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMixcbiAgICAgICAgICB0eCA9IHMgLSBsZWZ0LngsXG4gICAgICAgICAga3ggPSBkeCAvIChyaWdodC54ICsgcyArIHR4KSxcbiAgICAgICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTtcbiAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDtcbiAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvLyBDb21wdXRlcyBhIHByZWxpbWluYXJ5IHgtY29vcmRpbmF0ZSBmb3Igdi4gQmVmb3JlIHRoYXQsIEZJUlNUIFdBTEsgaXNcbiAgLy8gYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY2hpbGRyZW4gb2YgdiwgYXMgd2VsbCBhcyB0aGUgZnVuY3Rpb25cbiAgLy8gQVBQT1JUSU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNISUZUUywgdGhlXG4gIC8vIG5vZGUgdiBpcyBwbGFjZWQgdG8gdGhlIG1pZHBvaW50IG9mIGl0cyBvdXRlcm1vc3QgY2hpbGRyZW4uXG4gIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbixcbiAgICAgICAgc2libGluZ3MgPSB2LnBhcmVudC5jaGlsZHJlbixcbiAgICAgICAgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGV4ZWN1dGVTaGlmdHModik7XG4gICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjtcbiAgICAgIGlmICh3KSB7XG4gICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pO1xuICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHYueiA9IG1pZHBvaW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodykge1xuICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XG4gICAgfVxuICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5wYXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7XG4gIH1cblxuICAvLyBDb21wdXRlcyBhbGwgcmVhbCB4LWNvb3JkaW5hdGVzIGJ5IHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyByZWN1cnNpdmVseS5cbiAgZnVuY3Rpb24gc2Vjb25kV2Fsayh2KSB7XG4gICAgdi5fLnggPSB2LnogKyB2LnBhcmVudC5tO1xuICAgIHYubSArPSB2LnBhcmVudC5tO1xuICB9XG5cbiAgLy8gVGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gSGVyZSwgYSBuZXcgc3VidHJlZSBpcyBjb21iaW5lZCB3aXRoIHRoZVxuICAvLyBwcmV2aW91cyBzdWJ0cmVlcy4gVGhyZWFkcyBhcmUgdXNlZCB0byB0cmF2ZXJzZSB0aGUgaW5zaWRlIGFuZCBvdXRzaWRlXG4gIC8vIGNvbnRvdXJzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlIHVwIHRvIHRoZSBoaWdoZXN0IGNvbW1vbiBsZXZlbC4gVGhlXG4gIC8vIHZlcnRpY2VzIHVzZWQgZm9yIHRoZSB0cmF2ZXJzYWxzIGFyZSB2aSssIHZpLSwgdm8tLCBhbmQgdm8rLCB3aGVyZSB0aGVcbiAgLy8gc3VwZXJzY3JpcHQgbyBtZWFucyBvdXRzaWRlIGFuZCBpIG1lYW5zIGluc2lkZSwgdGhlIHN1YnNjcmlwdCAtIG1lYW5zIGxlZnRcbiAgLy8gc3VidHJlZSBhbmQgKyBtZWFucyByaWdodCBzdWJ0cmVlLiBGb3Igc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIGFsb25nIHRoZVxuICAvLyBjb250b3VyLCB3ZSB1c2UgcmVzcGVjdGl2ZSB2YXJpYWJsZXMgc2krLCBzaS0sIHNvLSwgYW5kIHNvKy4gV2hlbmV2ZXIgdHdvXG4gIC8vIG5vZGVzIG9mIHRoZSBpbnNpZGUgY29udG91cnMgY29uZmxpY3QsIHdlIGNvbXB1dGUgdGhlIGxlZnQgb25lIG9mIHRoZVxuICAvLyBncmVhdGVzdCB1bmNvbW1vbiBhbmNlc3RvcnMgdXNpbmcgdGhlIGZ1bmN0aW9uIEFOQ0VTVE9SIGFuZCBjYWxsIE1PVkVcbiAgLy8gU1VCVFJFRSB0byBzaGlmdCB0aGUgc3VidHJlZSBhbmQgcHJlcGFyZSB0aGUgc2hpZnRzIG9mIHNtYWxsZXIgc3VidHJlZXMuXG4gIC8vIEZpbmFsbHksIHdlIGFkZCBhIG5ldyB0aHJlYWQgKGlmIG5lY2Vzc2FyeSkuXG4gIGZ1bmN0aW9uIGFwcG9ydGlvbih2LCB3LCBhbmNlc3Rvcikge1xuICAgIGlmICh3KSB7XG4gICAgICB2YXIgdmlwID0gdixcbiAgICAgICAgICB2b3AgPSB2LFxuICAgICAgICAgIHZpbSA9IHcsXG4gICAgICAgICAgdm9tID0gdmlwLnBhcmVudC5jaGlsZHJlblswXSxcbiAgICAgICAgICBzaXAgPSB2aXAubSxcbiAgICAgICAgICBzb3AgPSB2b3AubSxcbiAgICAgICAgICBzaW0gPSB2aW0ubSxcbiAgICAgICAgICBzb20gPSB2b20ubSxcbiAgICAgICAgICBzaGlmdDtcbiAgICAgIHdoaWxlICh2aW0gPSBuZXh0UmlnaHQodmltKSwgdmlwID0gbmV4dExlZnQodmlwKSwgdmltICYmIHZpcCkge1xuICAgICAgICB2b20gPSBuZXh0TGVmdCh2b20pO1xuICAgICAgICB2b3AgPSBuZXh0UmlnaHQodm9wKTtcbiAgICAgICAgdm9wLmEgPSB2O1xuICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7XG4gICAgICAgIGlmIChzaGlmdCA+IDApIHtcbiAgICAgICAgICBtb3ZlU3VidHJlZShuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3RvciksIHYsIHNoaWZ0KTtcbiAgICAgICAgICBzaXAgKz0gc2hpZnQ7XG4gICAgICAgICAgc29wICs9IHNoaWZ0O1xuICAgICAgICB9XG4gICAgICAgIHNpbSArPSB2aW0ubTtcbiAgICAgICAgc2lwICs9IHZpcC5tO1xuICAgICAgICBzb20gKz0gdm9tLm07XG4gICAgICAgIHNvcCArPSB2b3AubTtcbiAgICAgIH1cbiAgICAgIGlmICh2aW0gJiYgIW5leHRSaWdodCh2b3ApKSB7XG4gICAgICAgIHZvcC50ID0gdmltO1xuICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7XG4gICAgICB9XG4gICAgICBpZiAodmlwICYmICFuZXh0TGVmdCh2b20pKSB7XG4gICAgICAgIHZvbS50ID0gdmlwO1xuICAgICAgICB2b20ubSArPSBzaXAgLSBzb207XG4gICAgICAgIGFuY2VzdG9yID0gdjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG5cbiAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkge1xuICAgIG5vZGUueCAqPSBkeDtcbiAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7XG4gIH1cblxuICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIHRyZWUpIDogc2VwYXJhdGlvbjtcbiAgfTtcblxuICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pO1xuICB9O1xuXG4gIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIHRyZWU7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICBub2RlLFxuICAgICAgaSA9IC0xLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLngwID0geDAsIG5vZGUueDEgPSB4MTtcbiAgICBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MCArPSBub2RlLnZhbHVlICogaztcbiAgfVxufVxuIiwgImltcG9ydCB0cmVlbWFwRGljZSBmcm9tIFwiLi9kaWNlLmpzXCI7XG5pbXBvcnQgdHJlZW1hcFNsaWNlIGZyb20gXCIuL3NsaWNlLmpzXCI7XG5cbmV4cG9ydCB2YXIgcGhpID0gKDEgKyBNYXRoLnNxcnQoNSkpIC8gMjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgdmFyIHJvd3MgPSBbXSxcbiAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLFxuICAgICAgcm93LFxuICAgICAgbm9kZVZhbHVlLFxuICAgICAgaTAgPSAwLFxuICAgICAgaTEgPSAwLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGR4LCBkeSxcbiAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlLFxuICAgICAgc3VtVmFsdWUsXG4gICAgICBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbmV3UmF0aW8sXG4gICAgICBtaW5SYXRpbyxcbiAgICAgIGFscGhhLFxuICAgICAgYmV0YTtcblxuICB3aGlsZSAoaTAgPCBuKSB7XG4gICAgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7XG5cbiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLlxuICAgIGRvIHN1bVZhbHVlID0gbm9kZXNbaTErK10udmFsdWU7IHdoaWxlICghc3VtVmFsdWUgJiYgaTEgPCBuKTtcbiAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWU7XG4gICAgYWxwaGEgPSBNYXRoLm1heChkeSAvIGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTtcbiAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhO1xuICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpO1xuXG4gICAgLy8gS2VlcCBhZGRpbmcgbm9kZXMgd2hpbGUgdGhlIGFzcGVjdCByYXRpbyBtYWludGFpbnMgb3IgaW1wcm92ZXMuXG4gICAgZm9yICg7IGkxIDwgbjsgKytpMSkge1xuICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlO1xuICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICAgIGlmIChub2RlVmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSBub2RlVmFsdWU7XG4gICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhO1xuICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7XG4gICAgICBpZiAobmV3UmF0aW8gPiBtaW5SYXRpbykgeyBzdW1WYWx1ZSAtPSBub2RlVmFsdWU7IGJyZWFrOyB9XG4gICAgICBtaW5SYXRpbyA9IG5ld1JhdGlvO1xuICAgIH1cblxuICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmllbnRhdGlvbi5cbiAgICByb3dzLnB1c2gocm93ID0ge3ZhbHVlOiBzdW1WYWx1ZSwgZGljZTogZHggPCBkeSwgY2hpbGRyZW46IG5vZGVzLnNsaWNlKGkwLCBpMSl9KTtcbiAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgdmFsdWUgPyB5MCArPSBkeSAqIHN1bVZhbHVlIC8gdmFsdWUgOiB5MSk7XG4gICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8geDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTtcbiAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTtcbiAgfVxuXG4gIHJldHVybiByb3dzO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7XG5cbiAgZnVuY3Rpb24gc3F1YXJpZnkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICAgIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpO1xuICB9XG5cbiAgc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7XG4gIH07XG5cbiAgcmV0dXJuIHNxdWFyaWZ5O1xufSkocGhpKTtcbiIsICJpbXBvcnQgcm91bmROb2RlIGZyb20gXCIuL3JvdW5kLmpzXCI7XG5pbXBvcnQgc3F1YXJpZnkgZnJvbSBcIi4vc3F1YXJpZnkuanNcIjtcbmltcG9ydCB7cmVxdWlyZWR9IGZyb20gXCIuLi9hY2Nlc3NvcnMuanNcIjtcbmltcG9ydCBjb25zdGFudCwge2NvbnN0YW50WmVyb30gZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgdGlsZSA9IHNxdWFyaWZ5LFxuICAgICAgcm91bmQgPSBmYWxzZSxcbiAgICAgIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmdTdGFjayA9IFswXSxcbiAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdUb3AgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ0xlZnQgPSBjb25zdGFudFplcm87XG5cbiAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7XG4gICAgcm9vdC54MCA9XG4gICAgcm9vdC55MCA9IDA7XG4gICAgcm9vdC54MSA9IGR4O1xuICAgIHJvb3QueTEgPSBkeTtcbiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTtcbiAgICBwYWRkaW5nU3RhY2sgPSBbMF07XG4gICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7XG4gICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sXG4gICAgICAgIHgwID0gbm9kZS54MCArIHAsXG4gICAgICAgIHkwID0gbm9kZS55MCArIHAsXG4gICAgICAgIHgxID0gbm9kZS54MSAtIHAsXG4gICAgICAgIHkxID0gbm9kZS55MSAtIHA7XG4gICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjtcbiAgICBub2RlLngwID0geDA7XG4gICAgbm9kZS55MCA9IHkwO1xuICAgIG5vZGUueDEgPSB4MTtcbiAgICBub2RlLnkxID0geTE7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjtcbiAgICAgIHgwICs9IHBhZGRpbmdMZWZ0KG5vZGUpIC0gcDtcbiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwO1xuICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDtcbiAgICAgIHkxIC09IHBhZGRpbmdCb3R0b20obm9kZSkgLSBwO1xuICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgdGlsZShub2RlLCB4MCwgeTAsIHgxLCB5MSk7XG4gICAgfVxuICB9XG5cbiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDtcbiAgfTtcblxuICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZW1hcCkgOiBbZHgsIGR5XTtcbiAgfTtcblxuICB0cmVlbWFwLnRpbGUgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nSW5uZXIoeCkucGFkZGluZ091dGVyKHgpIDogdHJlZW1hcC5wYWRkaW5nSW5uZXIoKTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRpbmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdUb3AgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1RvcCA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdUb3A7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nUmlnaHQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ1JpZ2h0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1JpZ2h0O1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0JvdHRvbTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdMZWZ0ID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdMZWZ0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0xlZnQ7XG4gIH07XG5cbiAgcmV0dXJuIHRyZWVtYXA7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICBpLCBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgc3VtLCBzdW1zID0gbmV3IEFycmF5KG4gKyAxKTtcblxuICBmb3IgKHN1bXNbMF0gPSBzdW0gPSBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIHN1bXNbaSArIDFdID0gc3VtICs9IG5vZGVzW2ldLnZhbHVlO1xuICB9XG5cbiAgcGFydGl0aW9uKDAsIG4sIHBhcmVudC52YWx1ZSwgeDAsIHkwLCB4MSwgeTEpO1xuXG4gIGZ1bmN0aW9uIHBhcnRpdGlvbihpLCBqLCB2YWx1ZSwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBpZiAoaSA+PSBqIC0gMSkge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIG5vZGUueDAgPSB4MCwgbm9kZS55MCA9IHkwO1xuICAgICAgbm9kZS54MSA9IHgxLCBub2RlLnkxID0geTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlT2Zmc2V0ID0gc3Vtc1tpXSxcbiAgICAgICAgdmFsdWVUYXJnZXQgPSAodmFsdWUgLyAyKSArIHZhbHVlT2Zmc2V0LFxuICAgICAgICBrID0gaSArIDEsXG4gICAgICAgIGhpID0gaiAtIDE7XG5cbiAgICB3aGlsZSAoayA8IGhpKSB7XG4gICAgICB2YXIgbWlkID0gayArIGhpID4+PiAxO1xuICAgICAgaWYgKHN1bXNbbWlkXSA8IHZhbHVlVGFyZ2V0KSBrID0gbWlkICsgMTtcbiAgICAgIGVsc2UgaGkgPSBtaWQ7XG4gICAgfVxuXG4gICAgaWYgKCh2YWx1ZVRhcmdldCAtIHN1bXNbayAtIDFdKSA8IChzdW1zW2tdIC0gdmFsdWVUYXJnZXQpICYmIGkgKyAxIDwgaykgLS1rO1xuXG4gICAgdmFyIHZhbHVlTGVmdCA9IHN1bXNba10gLSB2YWx1ZU9mZnNldCxcbiAgICAgICAgdmFsdWVSaWdodCA9IHZhbHVlIC0gdmFsdWVMZWZ0O1xuXG4gICAgaWYgKCh4MSAtIHgwKSA+ICh5MSAtIHkwKSkge1xuICAgICAgdmFyIHhrID0gdmFsdWUgPyAoeDAgKiB2YWx1ZVJpZ2h0ICsgeDEgKiB2YWx1ZUxlZnQpIC8gdmFsdWUgOiB4MTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeGssIHkxKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4aywgeTAsIHgxLCB5MSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB5ayA9IHZhbHVlID8gKHkwICogdmFsdWVSaWdodCArIHkxICogdmFsdWVMZWZ0KSAvIHZhbHVlIDogeTE7XG4gICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7XG4gICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeDAsIHlrLCB4MSwgeTEpO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkge1xuICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IGJyZWFrO1xuICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0SW50ZXJwb2xhdG9yKGRvbWFpbiwgaW50ZXJwb2xhdG9yKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB7XG4gICAgICBpZiAodHlwZW9mIGRvbWFpbiA9PT0gXCJmdW5jdGlvblwiKSB0aGlzLmludGVycG9sYXRvcihkb21haW4pO1xuICAgICAgZWxzZSB0aGlzLnJhbmdlKGRvbWFpbik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhpcy5kb21haW4oZG9tYWluKTtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJwb2xhdG9yID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuXG5leHBvcnQgY29uc3QgaW1wbGljaXQgPSBTeW1ib2woXCJpbXBsaWNpdFwiKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkaW5hbCgpIHtcbiAgdmFyIGluZGV4ID0gbmV3IE1hcCgpLFxuICAgICAgZG9tYWluID0gW10sXG4gICAgICByYW5nZSA9IFtdLFxuICAgICAgdW5rbm93biA9IGltcGxpY2l0O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKGQpIHtcbiAgICB2YXIga2V5ID0gZCArIFwiXCIsIGkgPSBpbmRleC5nZXQoa2V5KTtcbiAgICBpZiAoIWkpIHtcbiAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247XG4gICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VbKGkgLSAxKSAlIHJhbmdlLmxlbmd0aF07XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7XG4gICAgZG9tYWluID0gW10sIGluZGV4ID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgXykge1xuICAgICAgY29uc3Qga2V5ID0gdmFsdWUgKyBcIlwiO1xuICAgICAgaWYgKGluZGV4LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IEFycmF5LmZyb20oXyksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9yZGluYWwoZG9tYWluLCByYW5nZSkudW5rbm93bih1bmtub3duKTtcbiAgfTtcblxuICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuIiwgImltcG9ydCB7cmFuZ2UgYXMgc2VxdWVuY2V9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCBvcmRpbmFsIGZyb20gXCIuL29yZGluYWwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmFuZCgpIHtcbiAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSxcbiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbixcbiAgICAgIG9yZGluYWxSYW5nZSA9IHNjYWxlLnJhbmdlLFxuICAgICAgcjAgPSAwLFxuICAgICAgcjEgPSAxLFxuICAgICAgc3RlcCxcbiAgICAgIGJhbmR3aWR0aCxcbiAgICAgIHJvdW5kID0gZmFsc2UsXG4gICAgICBwYWRkaW5nSW5uZXIgPSAwLFxuICAgICAgcGFkZGluZ091dGVyID0gMCxcbiAgICAgIGFsaWduID0gMC41O1xuXG4gIGRlbGV0ZSBzY2FsZS51bmtub3duO1xuXG4gIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsXG4gICAgICAgIHJldmVyc2UgPSByMSA8IHIwLFxuICAgICAgICBzdGFydCA9IHJldmVyc2UgPyByMSA6IHIwLFxuICAgICAgICBzdG9wID0gcmV2ZXJzZSA/IHIwIDogcjE7XG4gICAgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMSwgbiAtIHBhZGRpbmdJbm5lciArIHBhZGRpbmdPdXRlciAqIDIpO1xuICAgIGlmIChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7XG4gICAgc3RhcnQgKz0gKHN0b3AgLSBzdGFydCAtIHN0ZXAgKiAobiAtIHBhZGRpbmdJbm5lcikpICogYWxpZ247XG4gICAgYmFuZHdpZHRoID0gc3RlcCAqICgxIC0gcGFkZGluZ0lubmVyKTtcbiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5yb3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTtcbiAgICB2YXIgdmFsdWVzID0gc2VxdWVuY2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pO1xuICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpO1xuICB9XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKFtyMCwgcjFdID0gXywgcjAgPSArcjAsIHIxID0gK3IxLCByZXNjYWxlKCkpIDogW3IwLCByMV07XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gW3IwLCByMV0gPSBfLCByMCA9ICtyMCwgcjEgPSArcjEsIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiYW5kd2lkdGg7XG4gIH07XG5cbiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzdGVwO1xuICB9O1xuXG4gIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1pbigxLCBwYWRkaW5nT3V0ZXIgPSArXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIF8pLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyO1xuICB9O1xuXG4gIHNjYWxlLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSArXywgcmVzY2FsZSgpKSA6IHBhZGRpbmdPdXRlcjtcbiAgfTtcblxuICBzY2FsZS5hbGlnbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbGlnbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IGFsaWduO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYmFuZChkb21haW4oKSwgW3IwLCByMV0pXG4gICAgICAgIC5yb3VuZChyb3VuZClcbiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpXG4gICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKVxuICAgICAgICAuYWxpZ24oYWxpZ24pO1xuICB9O1xuXG4gIHJldHVybiBpbml0UmFuZ2UuYXBwbHkocmVzY2FsZSgpLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBwb2ludGlzaChzY2FsZSkge1xuICB2YXIgY29weSA9IHNjYWxlLmNvcHk7XG5cbiAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjtcbiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjtcbiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHBvaW50aXNoKGNvcHkoKSk7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHJldHVybiBwb2ludGlzaChiYW5kLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFkZGluZ0lubmVyKDEpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25zdGFudHMoeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuICt4O1xufVxuIiwgImltcG9ydCB7YmlzZWN0fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGUgYXMgaW50ZXJwb2xhdGVWYWx1ZSwgaW50ZXJwb2xhdGVOdW1iZXIsIGludGVycG9sYXRlUm91bmR9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgbnVtYmVyIGZyb20gXCIuL251bWJlci5qc1wiO1xuXG52YXIgdW5pdCA9IFswLCAxXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhLCBiKSB7XG4gIHJldHVybiAoYiAtPSAoYSA9ICthKSlcbiAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSBhKSAvIGI7IH1cbiAgICAgIDogY29uc3RhbnQoaXNOYU4oYikgPyBOYU4gOiAwLjUpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGVyKGEsIGIpIHtcbiAgdmFyIHQ7XG4gIGlmIChhID4gYikgdCA9IGEsIGEgPSBiLCBiID0gdDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHgpKTsgfTtcbn1cblxuLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uXG4vLyBpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlIHZhbHVlIHggaW4gW2EsYl0uXG5mdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdO1xuICBpZiAoZDEgPCBkMCkgZDAgPSBub3JtYWxpemUoZDEsIGQwKSwgcjAgPSBpbnRlcnBvbGF0ZShyMSwgcjApO1xuICBlbHNlIGQwID0gbm9ybWFsaXplKGQwLCBkMSksIHIwID0gaW50ZXJwb2xhdGUocjAsIHIxKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTtcbn1cblxuZnVuY3Rpb24gcG9seW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxLFxuICAgICAgZCA9IG5ldyBBcnJheShqKSxcbiAgICAgIHIgPSBuZXcgQXJyYXkoaiksXG4gICAgICBpID0gLTE7XG5cbiAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuXG4gIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHtcbiAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgfVxuXG4gIHdoaWxlICgrK2kgPCBqKSB7XG4gICAgZFtpXSA9IG5vcm1hbGl6ZShkb21haW5baV0sIGRvbWFpbltpICsgMV0pO1xuICAgIHJbaV0gPSBpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGkgPSBiaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7XG4gICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXRcbiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKVxuICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKVxuICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKVxuICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKVxuICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1lcigpIHtcbiAgdmFyIGRvbWFpbiA9IHVuaXQsXG4gICAgICByYW5nZSA9IHVuaXQsXG4gICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB1bnRyYW5zZm9ybSxcbiAgICAgIHVua25vd24sXG4gICAgICBjbGFtcCA9IGlkZW50aXR5LFxuICAgICAgcGllY2V3aXNlLFxuICAgICAgb3V0cHV0LFxuICAgICAgaW5wdXQ7XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCk7XG4gICAgaWYgKGNsYW1wICE9PSBpZGVudGl0eSkgY2xhbXAgPSBjbGFtcGVyKGRvbWFpblswXSwgZG9tYWluW24gLSAxXSk7XG4gICAgcGllY2V3aXNlID0gbiA+IDIgPyBwb2x5bWFwIDogYmltYXA7XG4gICAgb3V0cHV0ID0gaW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICByZXR1cm4geCA9PSBudWxsIHx8IGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogKG91dHB1dCB8fCAob3V0cHV0ID0gcGllY2V3aXNlKGRvbWFpbi5tYXAodHJhbnNmb3JtKSwgcmFuZ2UsIGludGVycG9sYXRlKSkpKHRyYW5zZm9ybShjbGFtcCh4KSkpO1xuICB9XG5cbiAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiBjbGFtcCh1bnRyYW5zZm9ybSgoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4ubWFwKHRyYW5zZm9ybSksIGludGVycG9sYXRlTnVtYmVyKSkpKHkpKSk7XG4gIH07XG5cbiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IEFycmF5LmZyb20oXywgbnVtYmVyKSwgcmVzY2FsZSgpKSA6IGRvbWFpbi5zbGljZSgpO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gcmFuZ2UgPSBBcnJheS5mcm9tKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTtcbiAgfTtcblxuICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9IF8gPyB0cnVlIDogaWRlbnRpdHksIHJlc2NhbGUoKSkgOiBjbGFtcCAhPT0gaWRlbnRpdHk7XG4gIH07XG5cbiAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCByZXNjYWxlKCkpIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24odCwgdSkge1xuICAgIHRyYW5zZm9ybSA9IHQsIHVudHJhbnNmb3JtID0gdTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250aW51b3VzKCkge1xuICByZXR1cm4gdHJhbnNmb3JtZXIoKShpZGVudGl0eSwgaWRlbnRpdHkpO1xufVxuIiwgImltcG9ydCB7dGlja1N0ZXB9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtmb3JtYXQsIGZvcm1hdFByZWZpeCwgZm9ybWF0U3BlY2lmaWVyLCBwcmVjaXNpb25GaXhlZCwgcHJlY2lzaW9uUHJlZml4LCBwcmVjaXNpb25Sb3VuZH0gZnJvbSBcImQzLWZvcm1hdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aWNrRm9ybWF0KHN0YXJ0LCBzdG9wLCBjb3VudCwgc3BlY2lmaWVyKSB7XG4gIHZhciBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSxcbiAgICAgIHByZWNpc2lvbjtcbiAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gXCIsZlwiIDogc3BlY2lmaWVyKTtcbiAgc3dpdGNoIChzcGVjaWZpZXIudHlwZSkge1xuICAgIGNhc2UgXCJzXCI6IHtcbiAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpO1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247XG4gICAgICByZXR1cm4gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpO1xuICAgIH1cbiAgICBjYXNlIFwiXCI6XG4gICAgY2FzZSBcImVcIjpcbiAgICBjYXNlIFwiZ1wiOlxuICAgIGNhc2UgXCJwXCI6XG4gICAgY2FzZSBcInJcIjoge1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUm91bmQoc3RlcCwgTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gXCJlXCIpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmXCI6XG4gICAgY2FzZSBcIiVcIjoge1xuICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uRml4ZWQoc3RlcCkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSBcIiVcIikgKiAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3BlY2lmaWVyKTtcbn1cbiIsICJpbXBvcnQge3RpY2tzLCB0aWNrSW5jcmVtZW50fSBmcm9tIFwiZDMtYXJyYXlcIjtcbmltcG9ydCBjb250aW51b3VzLCB7Y29weX0gZnJvbSBcIi4vY29udGludW91cy5qc1wiO1xuaW1wb3J0IHtpbml0UmFuZ2V9IGZyb20gXCIuL2luaXQuanNcIjtcbmltcG9ydCB0aWNrRm9ybWF0IGZyb20gXCIuL3RpY2tGb3JtYXQuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkge1xuICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluO1xuXG4gIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB2YXIgZCA9IGRvbWFpbigpO1xuICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTtcbiAgfTtcblxuICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikge1xuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgcmV0dXJuIHRpY2tGb3JtYXQoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCwgc3BlY2lmaWVyKTtcbiAgfTtcblxuICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDtcblxuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgdmFyIGkwID0gMDtcbiAgICB2YXIgaTEgPSBkLmxlbmd0aCAtIDE7XG4gICAgdmFyIHN0YXJ0ID0gZFtpMF07XG4gICAgdmFyIHN0b3AgPSBkW2kxXTtcbiAgICB2YXIgcHJlc3RlcDtcbiAgICB2YXIgc3RlcDtcbiAgICB2YXIgbWF4SXRlciA9IDEwO1xuXG4gICAgaWYgKHN0b3AgPCBzdGFydCkge1xuICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwO1xuICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7XG4gICAgfVxuICAgIFxuICAgIHdoaWxlIChtYXhJdGVyLS0gPiAwKSB7XG4gICAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpO1xuICAgICAgaWYgKHN0ZXAgPT09IHByZXN0ZXApIHtcbiAgICAgICAgZFtpMF0gPSBzdGFydFxuICAgICAgICBkW2kxXSA9IHN0b3BcbiAgICAgICAgcmV0dXJuIGRvbWFpbihkKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwO1xuICAgICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwO1xuICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVzdGVwID0gc3RlcDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH07XG5cbiAgcmV0dXJuIHNjYWxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5lYXIoKSB7XG4gIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoKTtcblxuICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTtcbiAgfTtcblxuICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7XG5cbiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3BlY2lmaWVyKSB7XG4gIHZhciBuID0gc3BlY2lmaWVyLmxlbmd0aCAvIDYgfCAwLCBjb2xvcnMgPSBuZXcgQXJyYXkobiksIGkgPSAwO1xuICB3aGlsZSAoaSA8IG4pIGNvbG9yc1tpXSA9IFwiI1wiICsgc3BlY2lmaWVyLnNsaWNlKGkgKiA2LCArK2kgKiA2KTtcbiAgcmV0dXJuIGNvbG9ycztcbn1cbiIsICJpbXBvcnQgY29sb3JzIGZyb20gXCIuLi9jb2xvcnMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY29sb3JzKFwiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmXCIpO1xuIiwgImltcG9ydCB7Y3ViZWhlbGl4fSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IHZhciB3YXJtID0gaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgtMTAwLCAwLjc1LCAwLjM1KSwgY3ViZWhlbGl4KDgwLCAxLjUwLCAwLjgpKTtcblxuZXhwb3J0IHZhciBjb29sID0gaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpO1xuXG52YXIgYyA9IGN1YmVoZWxpeCgpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0KSB7XG4gIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBNYXRoLmZsb29yKHQpO1xuICB2YXIgdHMgPSBNYXRoLmFicyh0IC0gMC41KTtcbiAgYy5oID0gMzYwICogdCAtIDEwMDtcbiAgYy5zID0gMS41IC0gMS41ICogdHM7XG4gIGMubCA9IDAuOCAtIDAuOSAqIHRzO1xuICByZXR1cm4gYyArIFwiXCI7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiZXhwb3J0IHZhciBhYnMgPSBNYXRoLmFicztcbmV4cG9ydCB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yO1xuZXhwb3J0IHZhciBjb3MgPSBNYXRoLmNvcztcbmV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciBzaW4gPSBNYXRoLnNpbjtcbmV4cG9ydCB2YXIgc3FydCA9IE1hdGguc3FydDtcblxuZXhwb3J0IHZhciBlcHNpbG9uID0gMWUtMTI7XG5leHBvcnQgdmFyIHBpID0gTWF0aC5QSTtcbmV4cG9ydCB2YXIgaGFsZlBpID0gcGkgLyAyO1xuZXhwb3J0IHZhciB0YXUgPSAyICogcGk7XG5cbmV4cG9ydCBmdW5jdGlvbiBhY29zKHgpIHtcbiAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpIDogTWF0aC5hY29zKHgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNpbih4KSB7XG4gIHJldHVybiB4ID49IDEgPyBoYWxmUGkgOiB4IDw9IC0xID8gLWhhbGZQaSA6IE1hdGguYXNpbih4KTtcbn1cbiIsICJpbXBvcnQge3BhdGh9IGZyb20gXCJkMy1wYXRoXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCB7YWJzLCBhY29zLCBhc2luLCBhdGFuMiwgY29zLCBlcHNpbG9uLCBoYWxmUGksIG1heCwgbWluLCBwaSwgc2luLCBzcXJ0LCB0YXV9IGZyb20gXCIuL21hdGguanNcIjtcblxuZnVuY3Rpb24gYXJjSW5uZXJSYWRpdXMoZCkge1xuICByZXR1cm4gZC5pbm5lclJhZGl1cztcbn1cblxuZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMoZCkge1xuICByZXR1cm4gZC5vdXRlclJhZGl1cztcbn1cblxuZnVuY3Rpb24gYXJjU3RhcnRBbmdsZShkKSB7XG4gIHJldHVybiBkLnN0YXJ0QW5nbGU7XG59XG5cbmZ1bmN0aW9uIGFyY0VuZEFuZ2xlKGQpIHtcbiAgcmV0dXJuIGQuZW5kQW5nbGU7XG59XG5cbmZ1bmN0aW9uIGFyY1BhZEFuZ2xlKGQpIHtcbiAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTsgLy8gTm90ZTogb3B0aW9uYWwhXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgdmFyIHgxMCA9IHgxIC0geDAsIHkxMCA9IHkxIC0geTAsXG4gICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLFxuICAgICAgdCA9IHkzMiAqIHgxMCAtIHgzMiAqIHkxMDtcbiAgaWYgKHQgKiB0IDwgZXBzaWxvbikgcmV0dXJuO1xuICB0ID0gKHgzMiAqICh5MCAtIHkyKSAtIHkzMiAqICh4MCAtIHgyKSkgLyB0O1xuICByZXR1cm4gW3gwICsgdCAqIHgxMCwgeTAgKyB0ICogeTEwXTtcbn1cblxuLy8gQ29tcHV0ZSBwZXJwZW5kaWN1bGFyIG9mZnNldCBsaW5lIG9mIGxlbmd0aCByYy5cbi8vIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vQ2lyY2xlLUxpbmVJbnRlcnNlY3Rpb24uaHRtbFxuZnVuY3Rpb24gY29ybmVyVGFuZ2VudHMoeDAsIHkwLCB4MSwgeTEsIHIxLCByYywgY3cpIHtcbiAgdmFyIHgwMSA9IHgwIC0geDEsXG4gICAgICB5MDEgPSB5MCAtIHkxLFxuICAgICAgbG8gPSAoY3cgPyByYyA6IC1yYykgLyBzcXJ0KHgwMSAqIHgwMSArIHkwMSAqIHkwMSksXG4gICAgICBveCA9IGxvICogeTAxLFxuICAgICAgb3kgPSAtbG8gKiB4MDEsXG4gICAgICB4MTEgPSB4MCArIG94LFxuICAgICAgeTExID0geTAgKyBveSxcbiAgICAgIHgxMCA9IHgxICsgb3gsXG4gICAgICB5MTAgPSB5MSArIG95LFxuICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAyLFxuICAgICAgeTAwID0gKHkxMSArIHkxMCkgLyAyLFxuICAgICAgZHggPSB4MTAgLSB4MTEsXG4gICAgICBkeSA9IHkxMCAtIHkxMSxcbiAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICByID0gcjEgLSByYyxcbiAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsXG4gICAgICBkID0gKGR5IDwgMCA/IC0xIDogMSkgKiBzcXJ0KG1heCgwLCByICogciAqIGQyIC0gRCAqIEQpKSxcbiAgICAgIGN4MCA9IChEICogZHkgLSBkeCAqIGQpIC8gZDIsXG4gICAgICBjeTAgPSAoLUQgKiBkeCAtIGR5ICogZCkgLyBkMixcbiAgICAgIGN4MSA9IChEICogZHkgKyBkeCAqIGQpIC8gZDIsXG4gICAgICBjeTEgPSAoLUQgKiBkeCArIGR5ICogZCkgLyBkMixcbiAgICAgIGR4MCA9IGN4MCAtIHgwMCxcbiAgICAgIGR5MCA9IGN5MCAtIHkwMCxcbiAgICAgIGR4MSA9IGN4MSAtIHgwMCxcbiAgICAgIGR5MSA9IGN5MSAtIHkwMDtcblxuICAvLyBQaWNrIHRoZSBjbG9zZXIgb2YgdGhlIHR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLlxuICAvLyBUT0RPIElzIHRoZXJlIGEgZmFzdGVyIHdheSB0byBkZXRlcm1pbmUgd2hpY2ggaW50ZXJzZWN0aW9uIHRvIHVzZT9cbiAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7XG5cbiAgcmV0dXJuIHtcbiAgICBjeDogY3gwLFxuICAgIGN5OiBjeTAsXG4gICAgeDAxOiAtb3gsXG4gICAgeTAxOiAtb3ksXG4gICAgeDExOiBjeDAgKiAocjEgLyByIC0gMSksXG4gICAgeTExOiBjeTAgKiAocjEgLyByIC0gMSlcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLFxuICAgICAgb3V0ZXJSYWRpdXMgPSBhcmNPdXRlclJhZGl1cyxcbiAgICAgIGNvcm5lclJhZGl1cyA9IGNvbnN0YW50KDApLFxuICAgICAgcGFkUmFkaXVzID0gbnVsbCxcbiAgICAgIHN0YXJ0QW5nbGUgPSBhcmNTdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSxcbiAgICAgIHBhZEFuZ2xlID0gYXJjUGFkQW5nbGUsXG4gICAgICBjb250ZXh0ID0gbnVsbDtcblxuICBmdW5jdGlvbiBhcmMoKSB7XG4gICAgdmFyIGJ1ZmZlcixcbiAgICAgICAgcixcbiAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksXG4gICAgICAgIGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGZQaSxcbiAgICAgICAgZGEgPSBhYnMoYTEgLSBhMCksXG4gICAgICAgIGN3ID0gYTEgPiBhMDtcblxuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvdXRlciByYWRpdXMgaXMgYWx3YXlzIGxhcmdlciB0aGFuIHRoZSBpbm5lciByYWRpdXMuXG4gICAgaWYgKHIxIDwgcjApIHIgPSByMSwgcjEgPSByMCwgcjAgPSByO1xuXG4gICAgLy8gSXMgaXQgYSBwb2ludD9cbiAgICBpZiAoIShyMSA+IGVwc2lsb24pKSBjb250ZXh0Lm1vdmVUbygwLCAwKTtcblxuICAgIC8vIE9yIGlzIGl0IGEgY2lyY2xlIG9yIGFubnVsdXM/XG4gICAgZWxzZSBpZiAoZGEgPiB0YXUgLSBlcHNpbG9uKSB7XG4gICAgICBjb250ZXh0Lm1vdmVUbyhyMSAqIGNvcyhhMCksIHIxICogc2luKGEwKSk7XG4gICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAsIGExLCAhY3cpO1xuICAgICAgaWYgKHIwID4gZXBzaWxvbikge1xuICAgICAgICBjb250ZXh0Lm1vdmVUbyhyMCAqIGNvcyhhMSksIHIwICogc2luKGExKSk7XG4gICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPciBpcyBpdCBhIGNpcmN1bGFyIG9yIGFubnVsYXIgc2VjdG9yP1xuICAgIGVsc2Uge1xuICAgICAgdmFyIGEwMSA9IGEwLFxuICAgICAgICAgIGExMSA9IGExLFxuICAgICAgICAgIGEwMCA9IGEwLFxuICAgICAgICAgIGExMCA9IGExLFxuICAgICAgICAgIGRhMCA9IGRhLFxuICAgICAgICAgIGRhMSA9IGRhLFxuICAgICAgICAgIGFwID0gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAvIDIsXG4gICAgICAgICAgcnAgPSAoYXAgPiBlcHNpbG9uKSAmJiAocGFkUmFkaXVzID8gK3BhZFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc3FydChyMCAqIHIwICsgcjEgKiByMSkpLFxuICAgICAgICAgIHJjID0gbWluKGFicyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksXG4gICAgICAgICAgcmMwID0gcmMsXG4gICAgICAgICAgcmMxID0gcmMsXG4gICAgICAgICAgdDAsXG4gICAgICAgICAgdDE7XG5cbiAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBzaW5jZSByMSBcdTIyNjUgcjAsIGRhMSBcdTIyNjUgZGEwLlxuICAgICAgaWYgKHJwID4gZXBzaWxvbikge1xuICAgICAgICB2YXIgcDAgPSBhc2luKHJwIC8gcjAgKiBzaW4oYXApKSxcbiAgICAgICAgICAgIHAxID0gYXNpbihycCAvIHIxICogc2luKGFwKSk7XG4gICAgICAgIGlmICgoZGEwIC09IHAwICogMikgPiBlcHNpbG9uKSBwMCAqPSAoY3cgPyAxIDogLTEpLCBhMDAgKz0gcDAsIGExMCAtPSBwMDtcbiAgICAgICAgZWxzZSBkYTAgPSAwLCBhMDAgPSBhMTAgPSAoYTAgKyBhMSkgLyAyO1xuICAgICAgICBpZiAoKGRhMSAtPSBwMSAqIDIpID4gZXBzaWxvbikgcDEgKj0gKGN3ID8gMSA6IC0xKSwgYTAxICs9IHAxLCBhMTEgLT0gcDE7XG4gICAgICAgIGVsc2UgZGExID0gMCwgYTAxID0gYTExID0gKGEwICsgYTEpIC8gMjtcbiAgICAgIH1cblxuICAgICAgdmFyIHgwMSA9IHIxICogY29zKGEwMSksXG4gICAgICAgICAgeTAxID0gcjEgKiBzaW4oYTAxKSxcbiAgICAgICAgICB4MTAgPSByMCAqIGNvcyhhMTApLFxuICAgICAgICAgIHkxMCA9IHIwICogc2luKGExMCk7XG5cbiAgICAgIC8vIEFwcGx5IHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGlmIChyYyA+IGVwc2lsb24pIHtcbiAgICAgICAgdmFyIHgxMSA9IHIxICogY29zKGExMSksXG4gICAgICAgICAgICB5MTEgPSByMSAqIHNpbihhMTEpLFxuICAgICAgICAgICAgeDAwID0gcjAgKiBjb3MoYTAwKSxcbiAgICAgICAgICAgIHkwMCA9IHIwICogc2luKGEwMCksXG4gICAgICAgICAgICBvYztcblxuICAgICAgICAvLyBSZXN0cmljdCB0aGUgY29ybmVyIHJhZGl1cyBhY2NvcmRpbmcgdG8gdGhlIHNlY3RvciBhbmdsZS5cbiAgICAgICAgaWYgKGRhIDwgcGkgJiYgKG9jID0gaW50ZXJzZWN0KHgwMSwgeTAxLCB4MDAsIHkwMCwgeDExLCB5MTEsIHgxMCwgeTEwKSkpIHtcbiAgICAgICAgICB2YXIgYXggPSB4MDEgLSBvY1swXSxcbiAgICAgICAgICAgICAgYXkgPSB5MDEgLSBvY1sxXSxcbiAgICAgICAgICAgICAgYnggPSB4MTEgLSBvY1swXSxcbiAgICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSxcbiAgICAgICAgICAgICAga2MgPSAxIC8gc2luKGFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChzcXJ0KGF4ICogYXggKyBheSAqIGF5KSAqIHNxcnQoYnggKiBieCArIGJ5ICogYnkpKSkgLyAyKSxcbiAgICAgICAgICAgICAgbGMgPSBzcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTtcbiAgICAgICAgICByYzAgPSBtaW4ocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTtcbiAgICAgICAgICByYzEgPSBtaW4ocmMsIChyMSAtIGxjKSAvIChrYyArIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJcyB0aGUgc2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/XG4gICAgICBpZiAoIShkYTEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpO1xuXG4gICAgICAvLyBEb2VzIHRoZSBzZWN0b3JcdTIwMTlzIG91dGVyIHJpbmcgaGF2ZSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBlbHNlIGlmIChyYzEgPiBlcHNpbG9uKSB7XG4gICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDAwLCB5MDAsIHgwMSwgeTAxLCByMSwgcmMxLCBjdyk7XG4gICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMoeDExLCB5MTEsIHgxMCwgeTEwLCByMSwgcmMxLCBjdyk7XG5cbiAgICAgICAgY29udGV4dC5tb3ZlVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTtcblxuICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD9cbiAgICAgICAgaWYgKHJjMSA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMSwgYXRhbjIodDEueTExLCB0MS54MTEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT3IgaXMgdGhlIG91dGVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz9cbiAgICAgIGVsc2UgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpLCBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAxLCBhMTEsICFjdyk7XG5cbiAgICAgIC8vIElzIHRoZXJlIG5vIGlubmVyIHJpbmcsIGFuZCBpdFx1MjAxOXMgYSBjaXJjdWxhciBzZWN0b3I/XG4gICAgICAvLyBPciBwZXJoYXBzIGl0XHUyMDE5cyBhbiBhbm51bGFyIHNlY3RvciBjb2xsYXBzZWQgZHVlIHRvIHBhZGRpbmc/XG4gICAgICBpZiAoIShyMCA+IGVwc2lsb24pIHx8ICEoZGEwID4gZXBzaWxvbikpIGNvbnRleHQubGluZVRvKHgxMCwgeTEwKTtcblxuICAgICAgLy8gRG9lcyB0aGUgc2VjdG9yXHUyMDE5cyBpbm5lciByaW5nIChvciBwb2ludCkgaGF2ZSByb3VuZGVkIGNvcm5lcnM/XG4gICAgICBlbHNlIGlmIChyYzAgPiBlcHNpbG9uKSB7XG4gICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDEwLCB5MTAsIHgxMSwgeTExLCByMCwgLXJjMCwgY3cpO1xuICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgwMSwgeTAxLCB4MDAsIHkwMCwgcjAsIC1yYzAsIGN3KTtcblxuICAgICAgICBjb250ZXh0LmxpbmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpO1xuXG4gICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkP1xuICAgICAgICBpZiAocmMwIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGRyYXcgdGhlIHR3byBjb3JuZXJzIGFuZCB0aGUgcmluZy5cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhdGFuMih0MC5jeSArIHQwLnkxMSwgdDAuY3ggKyB0MC54MTEpLCBhdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzAsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGlzIHRoZSBpbm5lciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/XG4gICAgICBlbHNlIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMTAsIGEwMCwgY3cpO1xuICAgIH1cblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByID0gKCtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMixcbiAgICAgICAgYSA9ICgrc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK2VuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiAtIHBpIC8gMjtcbiAgICByZXR1cm4gW2NvcyhhKSAqIHIsIHNpbihhKSAqIHJdO1xuICB9O1xuXG4gIGFyYy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogaW5uZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG91dGVyUmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBvdXRlclJhZGl1cztcbiAgfTtcblxuICBhcmMuY29ybmVyUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogY29ybmVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5wYWRSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkUmFkaXVzID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogcGFkUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHN0YXJ0QW5nbGU7XG4gIH07XG5cbiAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBlbmRBbmdsZTtcbiAgfTtcblxuICBhcmMucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHBhZEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCBhcmMpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gYXJjO1xufVxuIiwgImV4cG9ydCB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4geFxuICAgID8geCAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oeCk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCAiZnVuY3Rpb24gTGluZWFyKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkxpbmVhci5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fcG9pbnQgPSAwO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IExpbmVhcihjb250ZXh0KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24geChwKSB7XG4gIHJldHVybiBwWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShwKSB7XG4gIHJldHVybiBwWzFdO1xufVxuIiwgImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vY3VydmUvbGluZWFyLmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4vcG9pbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLFxuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLFxuICAgICAgb3V0cHV0ID0gbnVsbDtcblxuICB4ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiAoeCA9PT0gdW5kZWZpbmVkKSA/IHBvaW50WCA6IGNvbnN0YW50KHgpO1xuICB5ID0gdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IHkgOiAoeSA9PT0gdW5kZWZpbmVkKSA/IHBvaW50WSA6IGNvbnN0YW50KHkpO1xuXG4gIGZ1bmN0aW9uIGxpbmUoZGF0YSkge1xuICAgIHZhciBpLFxuICAgICAgICBuID0gKGRhdGEgPSBhcnJheShkYXRhKSkubGVuZ3RoLFxuICAgICAgICBkLFxuICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLFxuICAgICAgICBidWZmZXI7XG5cbiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8PSBuOyArK2kpIHtcbiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHtcbiAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSBvdXRwdXQubGluZVN0YXJ0KCk7XG4gICAgICAgIGVsc2Ugb3V0cHV0LmxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZpbmVkMCkgb3V0cHV0LnBvaW50KCt4KGQsIGksIGRhdGEpLCAreShkLCBpLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmUpIDogeDtcbiAgfTtcblxuICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5lKSA6IHk7XG4gIH07XG5cbiAgbGluZS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGxpbmUpIDogZGVmaW5lZDtcbiAgfTtcblxuICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGxpbmUpIDogY3VydmU7XG4gIH07XG5cbiAgbGluZS5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKF8gPT0gbnVsbCA/IGNvbnRleHQgPSBvdXRwdXQgPSBudWxsIDogb3V0cHV0ID0gY3VydmUoY29udGV4dCA9IF8pLCBsaW5lKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGxpbmU7XG59XG4iLCAiaW1wb3J0IGN1cnZlTGluZWFyIGZyb20gXCIuL2xpbmVhci5qc1wiO1xuXG5leHBvcnQgdmFyIGN1cnZlUmFkaWFsTGluZWFyID0gY3VydmVSYWRpYWwoY3VydmVMaW5lYXIpO1xuXG5mdW5jdGlvbiBSYWRpYWwoY3VydmUpIHtcbiAgdGhpcy5fY3VydmUgPSBjdXJ2ZTtcbn1cblxuUmFkaWFsLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKTtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUuYXJlYUVuZCgpO1xuICB9LFxuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5saW5lRW5kKCk7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbihhLCByKSB7XG4gICAgdGhpcy5fY3VydmUucG9pbnQociAqIE1hdGguc2luKGEpLCByICogLU1hdGguY29zKGEpKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VydmVSYWRpYWwoY3VydmUpIHtcblxuICBmdW5jdGlvbiByYWRpYWwoY29udGV4dCkge1xuICAgIHJldHVybiBuZXcgUmFkaWFsKGN1cnZlKGNvbnRleHQpKTtcbiAgfVxuXG4gIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTtcblxuICByZXR1cm4gcmFkaWFsO1xufVxuIiwgImltcG9ydCBjdXJ2ZVJhZGlhbCwge2N1cnZlUmFkaWFsTGluZWFyfSBmcm9tIFwiLi9jdXJ2ZS9yYWRpYWwuanNcIjtcbmltcG9ydCBsaW5lIGZyb20gXCIuL2xpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVSYWRpYWwobCkge1xuICB2YXIgYyA9IGwuY3VydmU7XG5cbiAgbC5hbmdsZSA9IGwueCwgZGVsZXRlIGwueDtcbiAgbC5yYWRpdXMgPSBsLnksIGRlbGV0ZSBsLnk7XG5cbiAgbC5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGMoY3VydmVSYWRpYWwoXykpIDogYygpLl9jdXJ2ZTtcbiAgfTtcblxuICByZXR1cm4gbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBsaW5lUmFkaWFsKGxpbmUoKS5jdXJ2ZShjdXJ2ZVJhZGlhbExpbmVhcikpO1xufVxuIiwgImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCB7c2xpY2V9IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IHt4IGFzIHBvaW50WCwgeSBhcyBwb2ludFl9IGZyb20gXCIuLi9wb2ludC5qc1wiO1xuaW1wb3J0IHBvaW50UmFkaWFsIGZyb20gXCIuLi9wb2ludFJhZGlhbC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5rU291cmNlKGQpIHtcbiAgcmV0dXJuIGQuc291cmNlO1xufVxuXG5mdW5jdGlvbiBsaW5rVGFyZ2V0KGQpIHtcbiAgcmV0dXJuIGQudGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBsaW5rKGN1cnZlKSB7XG4gIHZhciBzb3VyY2UgPSBsaW5rU291cmNlLFxuICAgICAgdGFyZ2V0ID0gbGlua1RhcmdldCxcbiAgICAgIHggPSBwb2ludFgsXG4gICAgICB5ID0gcG9pbnRZLFxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gbGluaygpIHtcbiAgICB2YXIgYnVmZmVyLCBhcmd2ID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLCB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpO1xuICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTtcbiAgICBjdXJ2ZShjb250ZXh0LCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHMsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndiksICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gdCwgYXJndikpLCAreS5hcHBseSh0aGlzLCBhcmd2KSk7XG4gICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyBcIlwiIHx8IG51bGw7XG4gIH1cblxuICBsaW5rLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3VyY2UgPSBfLCBsaW5rKSA6IHNvdXJjZTtcbiAgfTtcblxuICBsaW5rLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCBsaW5rKSA6IHRhcmdldDtcbiAgfTtcblxuICBsaW5rLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5rKSA6IHg7XG4gIH07XG5cbiAgbGluay55ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluaykgOiB5O1xuICB9O1xuXG4gIGxpbmsuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgbGluaykgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZUhvcml6b250YWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwID0gKHgwICsgeDEpIC8gMiwgeTAsIHgwLCB5MSwgeDEsIHkxKTtcbn1cblxuZnVuY3Rpb24gY3VydmVWZXJ0aWNhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICBjb250ZXh0LmJlemllckN1cnZlVG8oeDAsIHkwID0gKHkwICsgeTEpIC8gMiwgeDEsIHkwLCB4MSwgeTEpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZVJhZGlhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLFxuICAgICAgcDEgPSBwb2ludFJhZGlhbCh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyKSxcbiAgICAgIHAyID0gcG9pbnRSYWRpYWwoeDEsIHkwKSxcbiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTtcbiAgY29udGV4dC5tb3ZlVG8ocDBbMF0sIHAwWzFdKTtcbiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHAxWzBdLCBwMVsxXSwgcDJbMF0sIHAyWzFdLCBwM1swXSwgcDNbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua0hvcml6b250YWwoKSB7XG4gIHJldHVybiBsaW5rKGN1cnZlSG9yaXpvbnRhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVmVydGljYWwoKSB7XG4gIHJldHVybiBsaW5rKGN1cnZlVmVydGljYWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlua1JhZGlhbCgpIHtcbiAgdmFyIGwgPSBsaW5rKGN1cnZlUmFkaWFsKTtcbiAgbC5hbmdsZSA9IGwueCwgZGVsZXRlIGwueDtcbiAgbC5yYWRpdXMgPSBsLnksIGRlbGV0ZSBsLnk7XG4gIHJldHVybiBsO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBwb2ludCh0aGF0LCB4LCB5KSB7XG4gIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhcbiAgICAoMiAqIHRoYXQuX3gwICsgdGhhdC5feDEpIC8gMyxcbiAgICAoMiAqIHRoYXQuX3kwICsgdGhhdC5feTEpIC8gMyxcbiAgICAodGhhdC5feDAgKyAyICogdGhhdC5feDEpIC8gMyxcbiAgICAodGhhdC5feTAgKyAyICogdGhhdC5feTEpIC8gMyxcbiAgICAodGhhdC5feDAgKyA0ICogdGhhdC5feDEgKyB4KSAvIDYsXG4gICAgKHRoYXQuX3kwICsgNCAqIHRoYXQuX3kxICsgeSkgLyA2XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBCYXNpcyhjb250ZXh0KSB7XG4gIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xufVxuXG5CYXNpcy5wcm90b3R5cGUgPSB7XG4gIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IDA7XG4gIH0sXG4gIGFyZWFFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2xpbmUgPSBOYU47XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSA9XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMzogcG9pbnQodGhpcywgdGhpcy5feDEsIHRoaXMuX3kxKTsgLy8gcHJvY2VlZFxuICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB4ID0gK3gsIHkgPSAreTtcbiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7XG4gICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrO1xuICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrO1xuICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2NvbnRleHQubGluZVRvKCg1ICogdGhpcy5feDAgKyB0aGlzLl94MSkgLyA2LCAoNSAqIHRoaXMuX3kwICsgdGhpcy5feTEpIC8gNik7IC8vIHByb2NlZWRcbiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhaztcbiAgICB9XG4gICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4O1xuICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICByZXR1cm4gbmV3IEJhc2lzKGNvbnRleHQpO1xufVxuIiwgImltcG9ydCB7QmFzaXN9IGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5cbmZ1bmN0aW9uIEJ1bmRsZShjb250ZXh0LCBiZXRhKSB7XG4gIHRoaXMuX2Jhc2lzID0gbmV3IEJhc2lzKGNvbnRleHQpO1xuICB0aGlzLl9iZXRhID0gYmV0YTtcbn1cblxuQnVuZGxlLnByb3RvdHlwZSA9IHtcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94ID0gW107XG4gICAgdGhpcy5feSA9IFtdO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpO1xuICB9LFxuICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgeCA9IHRoaXMuX3gsXG4gICAgICAgIHkgPSB0aGlzLl95LFxuICAgICAgICBqID0geC5sZW5ndGggLSAxO1xuXG4gICAgaWYgKGogPiAwKSB7XG4gICAgICB2YXIgeDAgPSB4WzBdLFxuICAgICAgICAgIHkwID0geVswXSxcbiAgICAgICAgICBkeCA9IHhbal0gLSB4MCxcbiAgICAgICAgICBkeSA9IHlbal0gLSB5MCxcbiAgICAgICAgICBpID0gLTEsXG4gICAgICAgICAgdDtcblxuICAgICAgd2hpbGUgKCsraSA8PSBqKSB7XG4gICAgICAgIHQgPSBpIC8gajtcbiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoXG4gICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSxcbiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsO1xuICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl94LnB1c2goK3gpO1xuICAgIHRoaXMuX3kucHVzaCgreSk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20oYmV0YSkge1xuXG4gIGZ1bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGJldGEgPT09IDEgPyBuZXcgQmFzaXMoY29udGV4dCkgOiBuZXcgQnVuZGxlKGNvbnRleHQsIGJldGEpO1xuICB9XG5cbiAgYnVuZGxlLmJldGEgPSBmdW5jdGlvbihiZXRhKSB7XG4gICAgcmV0dXJuIGN1c3RvbSgrYmV0YSk7XG4gIH07XG5cbiAgcmV0dXJuIGJ1bmRsZTtcbn0pKDAuODUpO1xuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQpXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b25cdTIwMTl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncywgdHJ1ZSkuZXZlbnQoZXZlbnQpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgTW9kYWwsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgVmlzQ29tcCBmcm9tIFwiLi4vQ29tcG9uZW50cy9WaXNDb21wLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgdHlwZSB7IEFkakxpc3RJdGVtLCBkM0dyYXBoIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBnZXRJbk5laWdoYm91cnMsXHJcbiAgZ2V0T3V0TmVpZ2hib3VycyxcclxuICBnZXRTaW5rcyxcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdyYXBobGliVG9EMyhnOiBHcmFwaCk6IGQzR3JhcGgge1xyXG4gIGNvbnN0IGQzR3JhcGg6IGQzR3JhcGggPSB7IG5vZGVzOiBbXSwgbGlua3M6IFtdIH07XHJcbiAgY29uc3Qgbm9kZUlEcyA9IHt9O1xyXG5cclxuICBnLm5vZGVzKCkuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xyXG4gICAgZDNHcmFwaC5ub2Rlcy5wdXNoKHsgaWQ6IGksIG5hbWU6IG5vZGUgfSk7XHJcbiAgICBub2RlSURzW25vZGVdID0gaTtcclxuICB9KTtcclxuICBnLmZvckVhY2hFZGdlKChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBkM0dyYXBoLmxpbmtzLnB1c2goe1xyXG4gICAgICBzb3VyY2U6IG5vZGVJRHNbc10sXHJcbiAgICAgIHRhcmdldDogbm9kZUlEc1t0XSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gZDNHcmFwaDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0Zyb21BbGxTaW5rcyhnOiBHcmFwaCkge1xyXG4gIGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IGdldFNpbmtzKGcpO1xyXG4gIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBbXTtcclxuXHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuXHJcbiAgICBjb25zdCBjdXJyTm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBjb25zdCBuZXdOb2RlcyA9IGdldEluTmVpZ2hib3VycyhnLCBjdXJyTm9kZSk7XHJcblxyXG4gICAgaWYgKG5ld05vZGVzLmxlbmd0aCkge1xyXG4gICAgICBuZXdOb2Rlcy5mb3JFYWNoKChwcmUpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0OiBBZGpMaXN0SXRlbSA9IHtcclxuICAgICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgICAgcGFyZW50SWQ6IHByZSxcclxuICAgICAgICAgIGRlcHRoOiBpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcXVldWUucHVzaChwcmUpO1xyXG4gICAgICAgIGFkakxpc3QucHVzaChuZXh0KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgIHBhcmVudElkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbWF4RGVwdGggPSBhZGpMaXN0LnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKS5sYXN0KCkuZGVwdGg7XHJcbiAgYWRqTGlzdC5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5oZWlnaHQgPSBtYXhEZXB0aCAtIGl0ZW0uZGVwdGgpKTtcclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRmc0Fkakxpc3QoZzogR3JhcGgsIHN0YXJ0Tm9kZTogc3RyaW5nKTogQWRqTGlzdEl0ZW1bXSB7XHJcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gW3N0YXJ0Tm9kZV07XHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG5cclxuICAgIGNvbnN0IGN1cnJOb2RlID0gcXVldWUuc2hpZnQoKTtcclxuICAgIGNvbnN0IG5ld05vZGVzID0gZ2V0T3V0TmVpZ2hib3VycyhnLCBjdXJyTm9kZSk7XHJcblxyXG4gICAgaWYgKG5ld05vZGVzLmxlbmd0aCkge1xyXG4gICAgICBuZXdOb2Rlcy5mb3JFYWNoKChzdWNjKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV4dDogQWRqTGlzdEl0ZW0gPSB7XHJcbiAgICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICAgIHBhcmVudElkOiBzdWNjLFxyXG4gICAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBxdWV1ZS5wdXNoKHN1Y2MpO1xyXG4gICAgICAgIGFkakxpc3QucHVzaChuZXh0KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgIHBhcmVudElkOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdCBtYXhEZXB0aCA9IGFkakxpc3Quc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpLmxhc3QoKS5kZXB0aDtcclxuICBhZGpMaXN0LmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmhlaWdodCA9IG1heERlcHRoIC0gaXRlbS5kZXB0aCkpO1xyXG5cclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0Fkakxpc3QoZzogR3JhcGgsIHN0YXJ0Tm9kZTogc3RyaW5nKTogQWRqTGlzdEl0ZW1bXSB7XHJcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gW3N0YXJ0Tm9kZV07XHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG5cclxuICAgIGNvbnN0IGN1cnJOb2RlID0gcXVldWUuc2hpZnQoKTtcclxuICAgIGNvbnN0IG5laWdoYm91cnMgPSB7XHJcbiAgICAgIHN1Y2NzOiBnZXRPdXROZWlnaGJvdXJzKGcsIGN1cnJOb2RlKSxcclxuICAgICAgcHJlczogZ2V0SW5OZWlnaGJvdXJzKGcsIGN1cnJOb2RlKSxcclxuICAgIH07XHJcbiAgICBjb25zb2xlLmxvZyh7IGN1cnJOb2RlLCBuZWlnaGJvdXJzIH0pO1xyXG5cclxuICAgIGNvbnN0IG5leHQ6IEFkakxpc3RJdGVtID0ge1xyXG4gICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgcHJlczogdW5kZWZpbmVkLFxyXG4gICAgICBzdWNjczogdW5kZWZpbmVkLFxyXG4gICAgICBwYXJlbnRJZDogaSxcclxuICAgICAgZGVwdGg6IGksXHJcbiAgICB9O1xyXG4gICAgaWYgKG5laWdoYm91cnMuc3VjY3MubGVuZ3RoKSB7XHJcbiAgICAgIG5leHQuc3VjY3MgPSBuZWlnaGJvdXJzLnN1Y2NzO1xyXG4gICAgICBxdWV1ZS5wdXNoKC4uLm5laWdoYm91cnMuc3VjY3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKG5laWdoYm91cnMucHJlcy5sZW5ndGgpIHtcclxuICAgICAgbmV4dC5wcmVzID0gbmVpZ2hib3Vycy5wcmVzO1xyXG4gICAgfVxyXG4gICAgYWRqTGlzdC5wdXNoKG5leHQpO1xyXG4gIH1cclxuICBjb25zdCBtYXhEZXB0aCA9IGFkakxpc3Quc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpLmxhc3QoKS5kZXB0aDtcclxuICBhZGpMaXN0LmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmhlaWdodCA9IG1heERlcHRoIC0gaXRlbS5kZXB0aCkpO1xyXG5cclxuICByZXR1cm4gYWRqTGlzdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRmc0ZsYXRBZGpMaXN0KGc6IEdyYXBoLCBzdGFydE5vZGU6IHN0cmluZykge1xyXG4gIGNvbnN0IG5vZGVzID0gZy5ub2RlcygpO1xyXG4gIGNvbnN0IG5vZGVDb3VudCA9IG5vZGVzLmxlbmd0aDtcclxuICBjb25zdCB2aXNpdHMgPSB7fTtcclxuICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XHJcbiAgICB2aXNpdHNbbm9kZV0gPSBub2RlQ291bnQgKiBpO1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBxdWV1ZTogc3RyaW5nW10gPSBbc3RhcnROb2RlXTtcclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gW107XHJcblxyXG4gIGxldCBkZXB0aCA9IDE7XHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuXHJcbiAgICBjb25zdCBjdXJyTm9kZSA9IHF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBjb25zdCBuZXh0ID0gZ2V0T3V0TmVpZ2hib3VycyhnLCBjdXJyTm9kZSk7XHJcblxyXG4gICAgaWYgKG5leHQubGVuZ3RoKSB7XHJcbiAgICAgIHF1ZXVlLnVuc2hpZnQoLi4ubmV4dCk7XHJcbiAgICAgIG5leHQuZm9yRWFjaCgoc3VjYykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gbm9kZUNvdW50ICogbm9kZXMuaW5kZXhPZihzdWNjKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhYWRqTGlzdC5zb21lKFxyXG4gICAgICAgICAgICAoYWRqSXRlbSkgPT5cclxuICAgICAgICAgICAgICBhZGpJdGVtLm5hbWUgPT09IGN1cnJOb2RlICYmIGFkakl0ZW0ucGFyZW50SWQgPT09IHBhcmVudElkXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICBpZDogdmlzaXRzW2N1cnJOb2RlXSBhcyBudW1iZXIsXHJcbiAgICAgICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgICAgICBwYXJlbnRJZCxcclxuICAgICAgICAgICAgZGVwdGgsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHZpc2l0c1tjdXJyTm9kZV0rKztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBkZXB0aCsrO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWRqTGlzdC5wdXNoKHtcclxuICAgICAgICBpZDogdmlzaXRzW2N1cnJOb2RlXSBhcyBudW1iZXIsXHJcbiAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgcGFyZW50SWQ6IDk5OTk5OTk5OSxcclxuICAgICAgICBkZXB0aCxcclxuICAgICAgfSk7XHJcbiAgICAgIGRlcHRoID0gMTtcclxuICAgICAgdmlzaXRzW2N1cnJOb2RlXSsrO1xyXG4gICAgfVxyXG4gIH1cclxuICBhZGpMaXN0LnB1c2goe1xyXG4gICAgaWQ6IDk5OTk5OTk5OSxcclxuICAgIG5hbWU6IFwiQ09OVEFJTkVSXCIsXHJcbiAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgZGVwdGg6IDAsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG1heERlcHRoID0gYWRqTGlzdC5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCkubGFzdCgpLmRlcHRoO1xyXG4gIGFkakxpc3QuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaGVpZ2h0ID0gbWF4RGVwdGggLSBpdGVtLmRlcHRoKSk7XHJcblxyXG4gIGNvbnNvbGUubG9nKHsgdmlzaXRzIH0pO1xyXG4gIHJldHVybiBhZGpMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc3RyYXRpZnkgPSBkM1xyXG4gIC5zdHJhdGlmeSgpXHJcbiAgLmlkKGZ1bmN0aW9uIChkOiBBZGpMaXN0SXRlbSkge1xyXG4gICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gICAgcmV0dXJuIGQubmFtZTtcclxuICB9KVxyXG4gIC5wYXJlbnRJZChmdW5jdGlvbiAoZDogQWRqTGlzdEl0ZW0pIHtcclxuICAgIHJldHVybiBkLnBhcmVudElkO1xyXG4gIH0pO1xyXG5leHBvcnQgY2xhc3MgVmlzTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBtb2RhbDogVmlzTW9kYWw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGFwcCk7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMubW9kYWwgPSB0aGlzO1xyXG4gIH1cclxuXHJcbiAgb25PcGVuKCkge1xyXG4gICAgbmV3IE5vdGljZShcclxuICAgICAgXCJBbG90IG9mIHRoZXNlIGZlYXR1cmVzIG1heSBub3Qgd29yaywgaXQgaXMgc3RpbGwgdmVyeSBleHBlcmltZW50YWwuXCJcclxuICAgICk7XHJcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIG5ldyBWaXNDb21wKHtcclxuICAgICAgdGFyZ2V0OiBjb250ZW50RWwsXHJcbiAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgbW9kYWw6IHRoaXMsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2UoKSB7XHJcbiAgICB0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG4gIH1cclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbiAgaW1wb3J0IHsgQUxMVU5MSU5LRUQsIFJFQWxDTE9TRUQsIFJFTEFUSU9OUywgVklTVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBWaXNHcmFwaHMsIFZpc1R5cGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB7XHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyxcclxuICAgIGdldFN1YkluRGlycyxcclxuICAgIHJlbW92ZVVubGlua2VkTm9kZXMsXHJcbiAgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG4gIGltcG9ydCB7IGFyY0RpYWdyYW0gfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvQXJjRGlhZ3JhbVwiO1xyXG4gIGltcG9ydCB7IGNpcmNsZVBhY2tpbmcgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvQ2lyY2xlUGFja2luZ1wiO1xyXG4gIGltcG9ydCB7IGVkZ2VCdW5kbGluZyB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9FZGdlQnVuZGxpbmdcIjtcclxuICBpbXBvcnQgeyBmb3JjZURpcmVjdGVkRyB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9Gb3JjZURpcmVjdGVkR1wiO1xyXG4gIGltcG9ydCB7IGljaWNsZSB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9JY2ljbGVcIjtcclxuICBpbXBvcnQgeyByYWRpYWxUcmVlIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1JhZGlhbFRyZWVcIjtcclxuICBpbXBvcnQgeyBzdW5idXJzdCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9TdW5idXJzdFwiO1xyXG4gIGltcG9ydCB7IHRpZHlUcmVlIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1RpZHlUcmVlXCI7XHJcbiAgaW1wb3J0IHsgdHJlZU1hcCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9UcmVlTWFwXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBWaXNNb2RhbCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9WaXNNb2RhbFwiO1xyXG4gIGltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBtb2RhbDogVmlzTW9kYWw7XHJcblxyXG4gIGNvbnN0IHsgcGx1Z2luIH0gPSBtb2RhbDtcclxuICBjb25zdCB7IG1haW5HLCBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdmlzR3JhcGgsIHZpc1JlbGF0aW9uLCB2aXNDbG9zZWQsIHZpc0FsbCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuXHJcbiAgY29uc3Qgc2VsZWN0b3JzID0gW1xyXG4gICAge1xyXG4gICAgICB0ZXh0OiBcIlR5cGVcIixcclxuICAgICAgb3B0aW9uczogVklTVFlQRVMsXHJcbiAgICAgIHZhbDogdmlzR3JhcGgsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0ZXh0OiBcIlJlbGF0aW9uXCIsXHJcbiAgICAgIG9wdGlvbnM6IFJFTEFUSU9OUyxcclxuICAgICAgdmFsOiB2aXNSZWxhdGlvbixcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6IFwiQ2xvc2UgSW1wbGllZFwiLFxyXG4gICAgICBvcHRpb25zOiBSRUFsQ0xPU0VELFxyXG4gICAgICB2YWw6IHZpc0Nsb3NlZCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6IFwiTm8gVW5saW5rZWRcIixcclxuICAgICAgb3B0aW9uczogQUxMVU5MSU5LRUQsXHJcbiAgICAgIHZhbDogdmlzQWxsLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBbXHJcbiAgICBNYXRoLnJvdW5kKHdpbmRvdy5pbm5lcldpZHRoIC8gMS4zKSxcclxuICAgIE1hdGgucm91bmQod2luZG93LmlubmVySGVpZ2h0IC8gMS4zKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBbdXAsIHNhbWUsIGRvd25dID0gW1xyXG4gICAgZ2V0U3ViSW5EaXJzKG1haW5HLCBcInVwXCIpLFxyXG4gICAgZ2V0U3ViSW5EaXJzKG1haW5HLCBcInNhbWVcIiksXHJcbiAgICBnZXRTdWJJbkRpcnMobWFpbkcsIFwiZG93blwiKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBbY2xvc2VkUGFyZW50Tm9TaW5nbGUsIGNsb3NlZFNpYmxpbmdOb1NpbmdsZSwgY2xvc2VkQ2hpbGROb1NpbmdsZV0gPSBbXHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyh1cCwgZG93biksXHJcbiAgICBjbG9zZUltcGxpZWRMaW5rcyhzYW1lLCBzYW1lKSxcclxuICAgIGNsb3NlSW1wbGllZExpbmtzKGRvd24sIHVwKSxcclxuICBdO1xyXG5cclxuICBjb25zdCBncmFwaHM6IFZpc0dyYXBocyA9IHtcclxuICAgIFBhcmVudDoge1xyXG4gICAgICBSZWFsOiB7XHJcbiAgICAgICAgQWxsOiB1cCxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXModXApLFxyXG4gICAgICB9LFxyXG4gICAgICBDbG9zZWQ6IHtcclxuICAgICAgICBBbGw6IGNsb3NlZFBhcmVudE5vU2luZ2xlLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2RlcyhjbG9zZWRQYXJlbnROb1NpbmdsZSksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgU2libGluZzoge1xyXG4gICAgICBSZWFsOiB7XHJcbiAgICAgICAgQWxsOiBzYW1lLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2RlcyhzYW1lKSxcclxuICAgICAgfSxcclxuICAgICAgQ2xvc2VkOiB7XHJcbiAgICAgICAgQWxsOiBjbG9zZWRTaWJsaW5nTm9TaW5nbGUsXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKGNsb3NlZFNpYmxpbmdOb1NpbmdsZSksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgQ2hpbGQ6IHtcclxuICAgICAgUmVhbDoge1xyXG4gICAgICAgIEFsbDogZG93bixcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoZG93biksXHJcbiAgICAgIH0sXHJcbiAgICAgIENsb3NlZDoge1xyXG4gICAgICAgIEFsbDogY2xvc2VkQ2hpbGROb1NpbmdsZSxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoY2xvc2VkQ2hpbGROb1NpbmdsZSksXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gICQ6IGFyZ0FyciA9IFtcclxuICAgIGdyYXBoc1tzZWxlY3RvcnNbMV0udmFsXVtzZWxlY3RvcnNbMl0udmFsXVtzZWxlY3RvcnNbM10udmFsXSxcclxuICAgIGFwcCxcclxuICAgIGN1cnJGaWxlLFxyXG4gICAgbW9kYWwsXHJcbiAgICB3aWR0aCxcclxuICAgIGhlaWdodCxcclxuICBdO1xyXG5cclxuICBjb25zdCB0eXBlczoge1xyXG4gICAgW3ZpcyBpbiBWaXNUeXBlXTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xyXG4gIH0gPSB7XHJcbiAgICBcIkZvcmNlIERpcmVjdGVkIEdyYXBoXCI6IGZvcmNlRGlyZWN0ZWRHLFxyXG4gICAgXCJUaWR5IFRyZWVcIjogdGlkeVRyZWUsXHJcbiAgICBcIkNpcmNsZSBQYWNraW5nXCI6IGNpcmNsZVBhY2tpbmcsXHJcbiAgICBcIkVkZ2UgQnVuZGxpbmdcIjogZWRnZUJ1bmRsaW5nLFxyXG4gICAgXCJBcmMgRGlhZ3JhbVwiOiBhcmNEaWFncmFtLFxyXG4gICAgU3VuYnVyc3Q6IHN1bmJ1cnN0LFxyXG4gICAgXCJUcmVlIE1hcFwiOiB0cmVlTWFwLFxyXG4gICAgSWNpY2xlOiBpY2ljbGUsXHJcbiAgICBcIlJhZGlhbCBUcmVlXCI6IHJhZGlhbFRyZWUsXHJcbiAgfTtcclxuXHJcbiAgZnVuY3Rpb24gZHJhdyh0eXBlOiBWaXNUeXBlKSB7XHJcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZDMtZ3JhcGhcIikpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5kMy1ncmFwaFwiKT8uZW1wdHkoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdHlwZXNbdHlwZV0oLi4uYXJnQXJyKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgd2FybihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAxMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmQzLWdyYXBoXCIpLmVtcHR5KCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdHlwZXNbdHlwZV0oLi4uYXJnQXJyKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICB3YXJuKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJDogZHJhdyhzZWxlY3RvcnNbMF0udmFsIGFzIFZpc1R5cGUpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXY+XHJcbiAgeyNlYWNoIHNlbGVjdG9ycyBhcyB7IHRleHQsIG9wdGlvbnMsIHZhbCB9fVxyXG4gICAgPHNwYW4+XHJcbiAgICAgIHt0ZXh0fTpcclxuICAgICAgPHNlbGVjdCBiaW5kOnZhbHVlPXt2YWx9PlxyXG4gICAgICAgIHsjZWFjaCBvcHRpb25zIGFzIG9wfVxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT17b3B9PntvcH08L29wdGlvbj5cclxuICAgICAgICB7L2VhY2h9XHJcbiAgICAgIDwvc2VsZWN0PlxyXG4gICAgPC9zcGFuPlxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiZDMtZ3JhcGhcIiAvPlxyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBkM05vZGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBncmFwaGxpYlRvRDMsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBhcmNEaWFncmFtID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZGF0YSA9IGdyYXBobGliVG9EMyhncmFwaCk7XHJcblxyXG4gIGNvbnN0IG1hcmdpbiA9IHsgdG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAxNTAgfTtcclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IG5vZGVzID0gZGF0YS5ub2Rlcy5tYXAoKHsgaWQsIG5hbWUgfSkgPT4gKHtcclxuICAgIGlkLFxyXG4gICAgbmFtZSxcclxuICAgIHNvdXJjZUxpbmtzOiBbXSxcclxuICAgIHRhcmdldExpbmtzOiBbXSxcclxuICB9KSk7XHJcblxyXG4gIGNvbnN0IG5vZGVCeUlkID0gbmV3IE1hcChub2Rlcy5tYXAoKGQpID0+IFtkLmlkLCBkXSkpO1xyXG5cclxuICBjb25zdCBsaW5rcyA9IGRhdGEubGlua3MubWFwKCh7IHNvdXJjZSwgdGFyZ2V0IH0pID0+ICh7XHJcbiAgICBzb3VyY2U6IG5vZGVCeUlkLmdldChzb3VyY2UgYXMgbnVtYmVyKSxcclxuICAgIHRhcmdldDogbm9kZUJ5SWQuZ2V0KHRhcmdldCBhcyBudW1iZXIpLFxyXG4gIH0pKTtcclxuXHJcbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XHJcbiAgICBjb25zdCB7IHNvdXJjZSwgdGFyZ2V0IH0gPSBsaW5rO1xyXG4gICAgc291cmNlLnNvdXJjZUxpbmtzLnB1c2gobGluayk7XHJcbiAgICB0YXJnZXQudGFyZ2V0TGlua3MucHVzaChsaW5rKTtcclxuICB9XHJcblxyXG4gIHN2Zy5hcHBlbmQoXCJzdHlsZVwiKS50ZXh0KGBcclxuXHJcbnBhdGgge1xyXG4gIHN0cm9rZTogIzgwODA4MDtcclxuICBvcGFjaXR5OiAwLjg7XHJcbn1cclxuXHJcbnRleHQge1xyXG4gIHN0cm9rZTogdmFyKC0tdGV4dC1hKTtcclxuICBvcGFjaXR5OiAwLjg7XHJcbn1cclxuXHJcblxyXG4uaG92ZXIgZy5wcmltYXJ5IHRleHQge1xyXG4gIGZpbGw6IGJsYWNrO1xyXG59XHJcblxyXG4uaG92ZXIgZy5zZWNvbmRhcnkgdGV4dCB7XHJcbiAgZmlsbDogIzMzMztcclxufVxyXG5cclxuLmhvdmVyIC5zZWNvbmRhcnkge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLmhvdmVyIHBhdGgucHJpbWFyeSB7XHJcbiAgc3Ryb2tlOiAjMzMzO1xyXG4gIHN0cm9rZS1vcGFjaXR5OiAxO1xyXG59XHJcblxyXG4uaG92ZXIgcmVjdCB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG5gKTtcclxuXHJcbiAgY29uc3QgeSA9IGQzLnNjYWxlUG9pbnQobm9kZXMubWFwKChkKSA9PiBkLm5hbWUpLnNvcnQoZDMuYXNjZW5kaW5nKSwgW1xyXG4gICAgbWFyZ2luLnRvcCxcclxuICAgIGhlaWdodCAtIG1hcmdpbi5ib3R0b20sXHJcbiAgXSk7XHJcblxyXG4gIGNvbnN0IGxhYmVsID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmb250LWZhbWlseVwiLCBcInNhbnMtc2VyaWZcIilcclxuICAgIC5hdHRyKFwiZm9udC1zaXplXCIsIDEwKVxyXG4gICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcImVuZFwiKVxyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKG5vZGVzKVxyXG4gICAgLmpvaW4oXCJnXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0fSwkeyhkLnkgPSB5KGQubmFtZSkpfSlgKVxyXG4gICAgLmNhbGwoKGcpID0+XHJcbiAgICAgIGdcclxuICAgICAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgICAgIC5hdHRyKFwieFwiLCAtNilcclxuICAgICAgICAuYXR0cihcImR5XCIsIFwiMC4zNWVtXCIpXHJcbiAgICAgICAgLy8gLmF0dHIoXCJmaWxsXCIsIChkKSA9PiBkMy5sYWIoY29sb3IoZC5ncm91cCkpLmRhcmtlcigyKSlcclxuICAgICAgICAudGV4dCgoZCkgPT4gZC5uYW1lKVxyXG4gICAgKVxyXG4gICAgLmNhbGwoXHJcbiAgICAgIChnKSA9PiBnLmFwcGVuZChcImNpcmNsZVwiKS5hdHRyKFwiclwiLCAzKVxyXG4gICAgICAvLyAuYXR0cihcImZpbGxcIiwgKGQpID0+IGNvbG9yKGQuZ3JvdXApKVxyXG4gICAgKTtcclxuXHJcbiAgY29uc3QgcGF0aCA9IHN2Z1xyXG4gICAgLmluc2VydChcImdcIiwgXCIqXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDEuNSlcclxuICAgIC5zZWxlY3RBbGwoXCJwYXRoXCIpXHJcbiAgICAuZGF0YShsaW5rcylcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLy8gLmF0dHIoXCJzdHJva2VcIiwgKGQpID0+XHJcbiAgICAvLyAgIGQuc291cmNlLmdyb3VwID09PSBkLnRhcmdldC5ncm91cCA/IGNvbG9yKGQuc291cmNlLmdyb3VwKSA6IFwiI2FhYVwiXHJcbiAgICAvLyApXHJcbiAgICAuYXR0cihcImRcIiwgYXJjKTtcclxuXHJcbiAgY29uc3Qgc3RlcCA9IDEwNDtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG92ZXJsYXkgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwicmVjdFwiKVxyXG4gICAgLmRhdGEobm9kZXMpXHJcbiAgICAuam9pbihcInJlY3RcIilcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgbWFyZ2luLmxlZnQgKyA0MClcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHN0ZXApXHJcbiAgICAuYXR0cihcInlcIiwgKGQpID0+IHkoZC5uYW1lKSAtIHN0ZXAgLyAyKVxyXG4gICAgLm9uKFwibW91c2VvdmVyXCIsIChkKSA9PiB7XHJcbiAgICAgIHN2Zy5jbGFzc2VkKFwiaG92ZXJcIiwgdHJ1ZSk7XHJcbiAgICAgIGxhYmVsLmNsYXNzZWQoXCJwcmltYXJ5XCIsIChuKSA9PiBuID09PSBkKTtcclxuICAgICAgbGFiZWwuY2xhc3NlZChcclxuICAgICAgICBcInNlY29uZGFyeVwiLFxyXG4gICAgICAgIChuKSA9PlxyXG4gICAgICAgICAgbi5zb3VyY2VMaW5rcy5zb21lKChsKSA9PiBsLnRhcmdldCA9PT0gZCkgfHxcclxuICAgICAgICAgIG4udGFyZ2V0TGlua3Muc29tZSgobCkgPT4gbC5zb3VyY2UgPT09IGQpXHJcbiAgICAgICk7XHJcbiAgICAgIHBhdGhcclxuICAgICAgICAuY2xhc3NlZChcInByaW1hcnlcIiwgKGwpID0+IGwuc291cmNlID09PSBkIHx8IGwudGFyZ2V0ID09PSBkKVxyXG4gICAgICAgIC5maWx0ZXIoXCIucHJpbWFyeVwiKVxyXG4gICAgICAgIC5yYWlzZSgpO1xyXG4gICAgfSlcclxuICAgIC5vbihcIm1vdXNlb3V0XCIsIChkKSA9PiB7XHJcbiAgICAgIHN2Zy5jbGFzc2VkKFwiaG92ZXJcIiwgZmFsc2UpO1xyXG4gICAgICBsYWJlbC5jbGFzc2VkKFwicHJpbWFyeVwiLCBmYWxzZSk7XHJcbiAgICAgIGxhYmVsLmNsYXNzZWQoXCJzZWNvbmRhcnlcIiwgZmFsc2UpO1xyXG4gICAgICBwYXRoLmNsYXNzZWQoXCJwcmltYXJ5XCIsIGZhbHNlKS5vcmRlcigpO1xyXG4gICAgfSlcclxuICAgIC5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZDogZDNOb2RlKSA9PiB7XHJcbiAgICAgIG5vZGVDbGljayhldmVudCwgZC5uYW1lKTtcclxuICAgIH0pO1xyXG5cclxuICAvLyAgIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcclxuICAvLyAgICAgeS5kb21haW4obm9kZXMuc29ydCh2aWV3b2Ygb3JkZXIudmFsdWUpLm1hcChkID0+IGQuaWQpKTtcclxuXHJcbiAgLy8gICAgIGNvbnN0IHQgPSBzdmcudHJhbnNpdGlvbigpXHJcbiAgLy8gICAgICAgICAuZHVyYXRpb24oNzUwKTtcclxuXHJcbiAgLy8gICAgIGxhYmVsLnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAgIC5kZWxheSgoZCwgaSkgPT4gaSAqIDIwKVxyXG4gIC8vICAgICAgICAgLmF0dHJUd2VlbihcInRyYW5zZm9ybVwiLCBkID0+IHtcclxuICAvLyAgICAgICAgICAgY29uc3QgaSA9IGQzLmludGVycG9sYXRlTnVtYmVyKGQueSwgeShkLmlkKSk7XHJcbiAgLy8gICAgICAgICAgIHJldHVybiB0ID0+IGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdH0sJHtkLnkgPSBpKHQpfSlgO1xyXG4gIC8vICAgICAgICAgfSk7XHJcblxyXG4gIC8vICAgICBwYXRoLnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAgIC5kdXJhdGlvbig3NTAgKyBub2Rlcy5sZW5ndGggKiAyMClcclxuICAvLyAgICAgICAgIC5hdHRyVHdlZW4oXCJkXCIsIGQgPT4gKCkgPT4gYXJjKGQpKTtcclxuXHJcbiAgLy8gICAgIG92ZXJsYXkudHJhbnNpdGlvbih0KVxyXG4gIC8vICAgICAgICAgLmRlbGF5KChkLCBpKSA9PiBpICogMjApXHJcbiAgLy8gICAgICAgICAuYXR0cihcInlcIiwgZCA9PiB5KGQuaWQpIC0gc3RlcCAvIDIpO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHZpZXdvZiBvcmRlci5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdXBkYXRlKTtcclxuICAvLyAgIGludmFsaWRhdGlvbi50aGVuKCgpID0+IHZpZXdvZiBvcmRlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdXBkYXRlKSk7XHJcblxyXG4gIGZ1bmN0aW9uIGFyYyhkOiB7IHNvdXJjZTogeyB5OiBudW1iZXIgfTsgdGFyZ2V0OiB7IHk6IG51bWJlciB9IH0pIHtcclxuICAgIGNvbnN0IHkxID0gZC5zb3VyY2UueTtcclxuICAgIGNvbnN0IHkyID0gZC50YXJnZXQueTtcclxuICAgIGNvbnN0IHIgPSBNYXRoLmFicyh5MiAtIHkxKSAvIDI7XHJcbiAgICByZXR1cm4gYE0ke21hcmdpbi5sZWZ0fSwke3kxfUEke3J9LCR7cn0gMCwwLCR7eTEgPCB5MiA/IDEgOiAwfSAke21hcmdpbi5sZWZ0XHJcbiAgICAgIH0sJHt5Mn1gO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIHN2Zy5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IEFkakxpc3RJdGVtLCBkM0xpbmssIGQzTm9kZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJmc0Fkakxpc3QsIGRmc0ZsYXRBZGpMaXN0LCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB7IG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbmltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBjaXJjbGVQYWNraW5nID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gYmZzQWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgYWRqTGlzdCB9KTtcclxuXHJcbiAgY29uc3Qgbm9Eb3VibGVzID0gWy4uLmFkakxpc3RdO1xyXG4gIG5vRG91Ymxlcy5mb3JFYWNoKChhLCBpKSA9PiB7XHJcbiAgICBpZiAobm9Eb3VibGVzLnNvbWUoKGIsIGopID0+IGkgIT09IGogJiYgYS5uYW1lID09PSBiLm5hbWUpKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gbm9Eb3VibGVzLmZpbmRJbmRleCgoYiwgaikgPT4gaSAhPT0gaiAmJiBhLm5hbWUgPT09IGIubmFtZSk7XHJcbiAgICAgIG5vRG91Ymxlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvLyBjb25zdCBub0RvdWJsZXMgPSBhZGpMaXN0LmZpbHRlcigoYSkgPT4ge1xyXG4gIC8vICAgIWFkakxpc3Quc29tZSgoYikgPT4ge1xyXG4gIC8vICAgICBjb25zb2xlLmxvZyh7IGEsIGIgfSk7XHJcbiAgLy8gICAgIHJldHVybiBhLm5hbWUgIT09IGIubmFtZSAmJiBhLnBhcmVudElkID09PSBiLnBhcmVudElkO1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gfSk7XHJcbiAgY29uc29sZS5sb2coeyBub0RvdWJsZXMgfSk7XHJcblxyXG4gIC8vIGNvbnN0IHJvb3QgPSBzdHJhdGlmeShub0RvdWJsZXMpO1xyXG4gIC8vIGNvbnNvbGUubG9nKHJvb3QpO1xyXG5cclxuICAvLyBjb25zdCBoaWVyYXJjaHk6IGQzVHJlZSA9IGNyZWF0ZVRyZWVIaWVyYXJjaHkobm9Eb3VibGVzLCB7XHJcbiAgLy8gICBpZDogXCJuYW1lXCIsXHJcbiAgLy8gICBleGNsdWRlUGFyZW50OiB0cnVlLFxyXG4gIC8vIH0pO1xyXG5cclxuICAvLyBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgY29uc3QgbGlua0FycjogZDNMaW5rW10gPSBub0RvdWJsZXMubWFwKChkKSA9PiB7XHJcbiAgICByZXR1cm4geyBzb3VyY2U6IGQubmFtZSwgdGFyZ2V0OiBkLnBhcmVudElkIH07XHJcbiAgfSk7XHJcbiAgY29uc3QgbGlua3MgPSBsaW5rQXJyLm1hcCgoZCkgPT4gT2JqZWN0LmNyZWF0ZShkKSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKTtcclxuXHJcbiAgY29uc3Qgbm9kZUNvbG91ciA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgIFwiLS10ZXh0LWFjY2VudFwiXHJcbiAgKTtcclxuXHJcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgY2lyY2xlOiBhbGwgbG9jYXRlZCBhdCB0aGUgY2VudGVyIG9mIHRoZSBzdmcgYXJlYVxyXG4gIGNvbnN0IG5vZGUgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwiY2lyY2xlXCIpXHJcbiAgICAuZGF0YShub0RvdWJsZXMpXHJcbiAgICAuam9pbihcImNpcmNsZVwiKVxyXG4gICAgLmF0dHIoXCJyXCIsIChkKSA9PiBNYXRoLnJvdW5kKGQuaGVpZ2h0IC8gMTApICsgMTApXHJcbiAgICAuYXR0cihcImN4XCIsIHdpZHRoIC8gMilcclxuICAgIC5hdHRyKFwiY3lcIiwgaGVpZ2h0IC8gMilcclxuICAgIC5zdHlsZShcImZpbGxcIiwgbm9kZUNvbG91cilcclxuICAgIC5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBub2RlQ29sb3VyKVxyXG4gICAgLnN0eWxlKFwic3Ryb2tlLXdpZHRoXCIsIDQpO1xyXG5cclxuICBub2RlLmF0dHIoXCJhcmlhLWxhYmVsXCIsIChkOiBBZGpMaXN0SXRlbSkgPT4gZC5uYW1lKTtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcbiAgbm9kZS5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZDogZDNOb2RlKSA9PiB7XHJcbiAgICBub2RlQ2xpY2soZXZlbnQsIGQubmFtZSk7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGxpbmsgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiM4NjgyODJcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLnNlbGVjdEFsbChcImxpbmVcIilcclxuICAgIC5kYXRhKGxpbmtzKVxyXG4gICAgLmpvaW4oXCJsaW5lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwLjgpO1xyXG5cclxuICAvLyBGZWF0dXJlcyBvZiB0aGUgZm9yY2VzIGFwcGxpZWQgdG8gdGhlIG5vZGVzOlxyXG4gIGNvbnN0IHNpbXVsYXRpb24gPSBkM1xyXG4gICAgLmZvcmNlU2ltdWxhdGlvbigpXHJcbiAgICAuZm9yY2UoXHJcbiAgICAgIFwiY2VudGVyXCIsXHJcbiAgICAgIGQzXHJcbiAgICAgICAgLmZvcmNlQ2VudGVyKClcclxuICAgICAgICAueCh3aWR0aCAvIDIpXHJcbiAgICAgICAgLnkoaGVpZ2h0IC8gMilcclxuICAgICkgLy8gQXR0cmFjdGlvbiB0byB0aGUgY2VudGVyIG9mIHRoZSBzdmcgYXJlYVxyXG4gICAgLmZvcmNlKFwiY2hhcmdlXCIsIGQzLmZvcmNlTWFueUJvZHkoKS5zdHJlbmd0aCgwLjUpKSAvLyBOb2RlcyBhcmUgYXR0cmFjdGVkIG9uZSBlYWNoIG90aGVyIG9mIHZhbHVlIGlzID4gMFxyXG4gICAgLmZvcmNlKFxyXG4gICAgICBcImNvbGxpZGVcIixcclxuICAgICAgZDMuZm9yY2VDb2xsaWRlKCkuc3RyZW5ndGgoMC4wMjUpLnJhZGl1cygzMCkuaXRlcmF0aW9ucygxKVxyXG4gICAgKTsgLy8gRm9yY2UgdGhhdCBhdm9pZHMgY2lyY2xlIG92ZXJsYXBwaW5nXHJcblxyXG4gIC8vIEFwcGx5IHRoZXNlIGZvcmNlcyB0byB0aGUgbm9kZXMgYW5kIHVwZGF0ZSB0aGVpciBwb3NpdGlvbnMuXHJcbiAgLy8gT25jZSB0aGUgZm9yY2UgYWxnb3JpdGhtIGlzIGhhcHB5IHdpdGggcG9zaXRpb25zICgnYWxwaGEnIHZhbHVlIGlzIGxvdyBlbm91Z2gpLCBzaW11bGF0aW9ucyB3aWxsIHN0b3AuXHJcbiAgc2ltdWxhdGlvbi5ub2Rlcyhub0RvdWJsZXMpLm9uKFwidGlja1wiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgbm9kZS5hdHRyKFwiY3hcIiwgKGQpID0+IGQueCkuYXR0cihcImN5XCIsIChkKSA9PiBkLnkpO1xyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgbm9kZS5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGRyYWcgPSAoXHJcbiAgICBzaW11bGF0aW9uOiBkMy5TaW11bGF0aW9uPGQzLlNpbXVsYXRpb25Ob2RlRGF0dW0sIHVuZGVmaW5lZD5cclxuICApID0+IHtcclxuICAgIGZ1bmN0aW9uIGRyYWdzdGFydGVkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xyXG4gICAgICBkLmZ4ID0gZC54O1xyXG4gICAgICBkLmZ5ID0gZC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdnZWQoZXZlbnQsIGQpIHtcclxuICAgICAgZC5meCA9IGV2ZW50Lng7XHJcbiAgICAgIGQuZnkgPSBldmVudC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdlbmRlZChldmVudCwgZCkge1xyXG4gICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwKTtcclxuICAgICAgZC5meCA9IG51bGw7XHJcbiAgICAgIGQuZnkgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkM1xyXG4gICAgICAuZHJhZygpXHJcbiAgICAgIC5vbihcInN0YXJ0XCIsIGRyYWdzdGFydGVkKVxyXG4gICAgICAub24oXCJkcmFnXCIsIGRyYWdnZWQpXHJcbiAgICAgIC5vbihcImVuZFwiLCBkcmFnZW5kZWQpO1xyXG4gIH07XHJcblxyXG4gIG5vZGUuY2FsbChkcmFnKHNpbXVsYXRpb24pKTtcclxuXHJcbiAgLy8gICBjb25zdCBwYWNrID0gKGRhdGEpID0+XHJcbiAgLy8gICAgIGQzLnBhY2soKS5zaXplKFt3aWR0aCwgaGVpZ2h0XSkucGFkZGluZygzKShcclxuICAvLyAgICAgICBkM1xyXG4gIC8vICAgICAgICAgLmhpZXJhcmNoeShkYXRhKVxyXG4gIC8vICAgICAgICAgLnN1bSgoZCkgPT4gZC52YWx1ZSlcclxuICAvLyAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnZhbHVlIC0gYS52YWx1ZSlcclxuICAvLyAgICAgKTtcclxuXHJcbiAgLy8gICBjb25zdCByb290ID0gcGFjayhoaWVyYXJjaHkpO1xyXG5cclxuICAvLyAgIGNvbnN0IHN2ZyA9IGQzXHJcbiAgLy8gICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAvLyAgICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gIC8vICAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgLy8gICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgLy8gICAgIC5zdHlsZShcImZvbnRcIiwgXCIxMHB4IHNhbnMtc2VyaWZcIilcclxuICAvLyAgICAgLnN0eWxlKFwib3ZlcmZsb3dcIiwgXCJ2aXNpYmxlXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIik7XHJcblxyXG4gIC8vICAgY29uc3Qgbm9kZSA9IHN2Z1xyXG4gIC8vICAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gIC8vICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXHJcbiAgLy8gICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgLy8gICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKSlcclxuICAvLyAgICAgLmpvaW4oXCJnXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54fSwke2QueX0pYCk7XHJcblxyXG4gIC8vICAgbm9kZVxyXG4gIC8vICAgICAuYXBwZW5kKFwiY2lyY2xlXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwiclwiLCAoZCkgPT4gZC5yKVxyXG4gIC8vICAgICAuYXR0cihcInN0cm9rZVwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyBcIiNiYmJcIiA6IFwibm9uZVwiKSlcclxuICAvLyAgICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiAoZC5jaGlsZHJlbiA/IFwibm9uZVwiIDogXCIjZGRkXCIpKTtcclxuXHJcbiAgLy8gICBjb25zdCBsZWFmID0gbm9kZS5maWx0ZXIoKGQpID0+ICFkLmNoaWxkcmVuKTtcclxuXHJcbiAgLy8gICBsZWFmLnNlbGVjdChcImNpcmNsZVwiKTtcclxuXHJcbiAgLy8gICAvLyBsZWFmXHJcbiAgLy8gICAvLyAgIC5hcHBlbmQoXCJjbGlwUGF0aFwiKVxyXG4gIC8vICAgLy8gICAuYXR0cihcImlkXCIsIChkKSA9PiAoZC5jbGlwVWlkID0gRE9NLnVpZChcImNsaXBcIikpLmlkKVxyXG4gIC8vICAgLy8gICAuYXBwZW5kKFwidXNlXCIpXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwieGxpbms6aHJlZlwiLCAoZCkgPT4gZC5sZWFmVWlkLmhyZWYpO1xyXG5cclxuICAvLyAgIC8vIGxlYWZcclxuICAvLyAgIC8vICAgLmFwcGVuZChcInRleHRcIilcclxuICAvLyAgIC8vICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgKGQpID0+IGQuY2xpcFVpZClcclxuICAvLyAgIC8vICAgLnNlbGVjdEFsbChcInRzcGFuXCIpXHJcbiAgLy8gICAvLyAgIC5kYXRhKChkKSA9PiBkLmRhdGEubmFtZS5zcGxpdCgvKD89W0EtWl1bXkEtWl0pL2cpKVxyXG4gIC8vICAgLy8gICAuam9pbihcInRzcGFuXCIpXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwieFwiLCAwKVxyXG4gIC8vICAgLy8gICAuYXR0cihcInlcIiwgKGQsIGksIG5vZGVzKSA9PiBgJHtpIC0gbm9kZXMubGVuZ3RoIC8gMiArIDAuOH1lbWApXHJcbiAgLy8gICAvLyAgIC50ZXh0KChkKSA9PiBkKTtcclxuXHJcbiAgLy8gICBub2RlLmFwcGVuZChcInRpdGxlXCIpLnRleHQoXHJcbiAgLy8gICAgIChkKSA9PiBgJHtkXHJcbiAgLy8gICAgICAgLmFuY2VzdG9ycygpXHJcbiAgLy8gICAgICAgLm1hcCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAvLyAgICAgICAucmV2ZXJzZSgpXHJcbiAgLy8gICAgICAgLmpvaW4oXCIvXCIpfVxyXG4gIC8vICR7ZC52YWx1ZS50b0xvY2FsZVN0cmluZygpfWBcclxuICAvLyAgICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGVkZ2VCdW5kbGluZyA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllciA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyIH0pO1xyXG5cclxuICBjb25zdCBQQURESU5HX0JVQkJMRSA9IDE1OyAvLyBkaXN0YW5jZSBiZXR3ZWVuIGVkZ2UgZW5kIGFuZCBidWJibGVcclxuICBjb25zdCBQQURESU5HX0xBQkVMID0gMzA7IC8vIGRpc3RhbmNlIGJldHdlZW4gZWRnZSBlbmQgYW5kIGVuZ2luZWVyIG5hbWVcclxuICBjb25zdCBCVUJCTEVfU0laRV9NSU4gPSA0O1xyXG4gIGNvbnN0IEJVQkJMRV9TSVpFX01BWCA9IDIwO1xyXG5cclxuICB2YXIgZGlhbWV0ZXIgPSA1NjAsXHJcbiAgICByYWRpdXMgPSBkaWFtZXRlciAvIDIsXHJcbiAgICBpbm5lclJhZGl1cyA9IHJhZGl1cyAtIDE3MDsgLy8gYmV0d2VlbiBjZW50ZXIgYW5kIGVkZ2UgZW5kXHJcblxyXG4gIC8vIFRoZSAnY2x1c3RlcicgZnVuY3Rpb24gdGFrZXMgMSBhcmd1bWVudCBhcyBpbnB1dC4gSXQgYWxzbyBoYXMgbWV0aG9kcyAoPz8pIGxpa2UgY2x1c3Rlci5zZXBhcmF0aW9uKCksIGNsdXN0ZXIuc2l6ZSgpIGFuZCBjbHVzdGVyLm5vZGVTaXplKClcclxuICB2YXIgY2x1c3RlciA9IGQzLmNsdXN0ZXIoKS5zaXplKFszNjAsIGlubmVyUmFkaXVzXSk7XHJcblxyXG4gIHZhciBsaW5lID0gZDNcclxuICAgIC5saW5lUmFkaWFsKClcclxuICAgIC5jdXJ2ZShkMy5jdXJ2ZUJ1bmRsZS5iZXRhKDAuODUpKVxyXG4gICAgLnJhZGl1cyhmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZFsxXTtcclxuICAgIH0pXHJcbiAgICAuYW5nbGUoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIChkWzBdIC8gMTgwKSAqIE1hdGguUEk7XHJcbiAgICB9KTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyByYWRpdXMgKyBcIixcIiArIHJhZGl1cyArIFwiKVwiKTtcclxuXHJcbiAgdmFyIGxpbmsgPSBzdmcuYXBwZW5kKFwiZ1wiKS5zZWxlY3RBbGwoXCIubGlua1wiKSxcclxuICAgIGxhYmVsID0gc3ZnLmFwcGVuZChcImdcIikuc2VsZWN0QWxsKFwiLmxhYmVsXCIpLFxyXG4gICAgYnViYmxlID0gc3ZnLmFwcGVuZChcImdcIikuc2VsZWN0QWxsKFwiLmJ1YmJsZVwiKTtcclxuXHJcbiAgLy8gQWRkIGEgc2NhbGUgZm9yIGJ1YmJsZSBzaXplXHJcbiAgdmFyIGJ1YmJsZVNpemVTY2FsZSA9IGQzXHJcbiAgICAuc2NhbGVMaW5lYXIoKVxyXG4gICAgLmRvbWFpbihbMCwgMTAwXSlcclxuICAgIC5yYW5nZShbQlVCQkxFX1NJWkVfTUlOLCBCVUJCTEVfU0laRV9NQVhdKTtcclxuXHJcbiAgLy8gU2NhbGUgZm9yIHRoZSBidWJibGUgc2l6ZVxyXG5cclxuICAvLyBJZiB3YW5uYSBzZWUgeW91ciBkYXRhXHJcbiAgLy8gY29uc29sZS5sb2coaGllcmFyY2hpY2FsRGF0YSlcclxuXHJcbiAgLy8gUmVmb3JtYXQgdGhlIGRhdGFcclxuICB2YXIgcm9vdCA9IHBhY2thZ2VIaWVyYXJjaHkoaGllcilcclxuICAgIC8vZGVidWdnZXI7XHJcbiAgICAuc3VtKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGQpO1xyXG4gICAgICByZXR1cm4gZC5oZWlnaHQ7XHJcbiAgICB9KTtcclxuXHJcbiAgLy8gY29uc29sZS5sb2cocm9vdClcclxuXHJcbiAgLy8gQnVpbGQgYW4gb2JqZWN0IHRoYXQgZ2l2ZXMgZmVhdHVyZSBvZiBlYWNoIGxlYXZlc1xyXG4gIGNsdXN0ZXIocm9vdCk7XHJcbiAgY29uc3QgbGVhdmVzID0gcm9vdC5sZWF2ZXMoKTtcclxuXHJcbiAgLy8gTGVhdmVzIGlzIGFuIGFycmF5IG9mIE9iamVjdHMuIDEgaXRlbSA9IG9uZSBsZWFmLiBQcm92aWRlcyB4IGFuZCB5IGZvciBsZWFmIHBvc2l0aW9uIGluIHRoZSBzdmcuIEFsc28gZ2l2ZXMgZGV0YWlscyBhYm91dCBpdHMgcGFyZW50LlxyXG4gIGNvbnN0IF9saW5rID0gbGlua1xyXG4gICAgLmRhdGEocGFja2FnZUltcG9ydHMobGVhdmVzKSlcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwicGF0aFwiKVxyXG4gICAgLmVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgKGQuc291cmNlID0gZFswXSksIChkLnRhcmdldCA9IGRbZC5sZW5ndGggLSAxXSk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImxpbmtcIilcclxuICAgIC5hdHRyKFwiZFwiLCBsaW5lKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCJibGFja1wiKTtcclxuXHJcbiAgY29uc3QgX2xhYmVsID0gbGFiZWxcclxuICAgIC5kYXRhKGxlYXZlcylcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImxhYmVsXCIpXHJcbiAgICAuYXR0cihcImR5XCIsIFwiMC4zMWVtXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIFwicm90YXRlKFwiICtcclxuICAgICAgICAoZC54IC0gOTApICtcclxuICAgICAgICBcIil0cmFuc2xhdGUoXCIgK1xyXG4gICAgICAgIChkLnkgKyBQQURESU5HX0xBQkVMKSArXHJcbiAgICAgICAgXCIsMClcIiArXHJcbiAgICAgICAgKGQueCA8IDE4MCA/IFwiXCIgOiBcInJvdGF0ZSgxODApXCIpXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC54IDwgMTgwID8gXCJzdGFydFwiIDogXCJlbmRcIjtcclxuICAgIH0pXHJcbiAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC5kYXRhLmtleTtcclxuICAgIH0pO1xyXG5cclxuICBjb25zdCBfYnViYmxlID0gYnViYmxlXHJcbiAgICAuZGF0YShsZWF2ZXMpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcImNpcmNsZVwiKVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImJ1YmJsZVwiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBcInJvdGF0ZShcIiArIChkLnggLSA5MCkgKyBcIil0cmFuc2xhdGUoXCIgKyAoZC55ICsgUEFERElOR19CVUJCTEUpICsgXCIsMClcIlxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiclwiLCAoZCkgPT4gYnViYmxlU2l6ZVNjYWxlKGQudmFsdWUpKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCJibGFja1wiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwiIzY5YTNiMlwiKVxyXG4gICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwLjIpO1xyXG5cclxuICAvLyBMYXppbHkgY29uc3RydWN0IHRoZSBwYWNrYWdlIGhpZXJhcmNoeSBmcm9tIGNsYXNzIG5hbWVzLlxyXG4gIGZ1bmN0aW9uIHBhY2thZ2VIaWVyYXJjaHkoY2xhc3Nlcykge1xyXG4gICAgdmFyIG1hcCA9IHt9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGZpbmQobmFtZSwgZGF0YSkge1xyXG4gICAgICB2YXIgbm9kZSA9IG1hcFtuYW1lXSxcclxuICAgICAgICBpO1xyXG4gICAgICBpZiAoIW5vZGUpIHtcclxuICAgICAgICBub2RlID0gbWFwW25hbWVdID0gZGF0YSB8fCB7IG5hbWU6IG5hbWUsIGNoaWxkcmVuOiBbXSB9O1xyXG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCkge1xyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgbm9kZS5wYXJlbnQgPSBmaW5kKG5hbWUuc3Vic3RyaW5nKDAsIChpID0gbmFtZS5sYXN0SW5kZXhPZihcIi5cIikpKSk7XHJcbiAgICAgICAgICBub2RlLnBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgbm9kZS5rZXkgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBmaW5kKGQubmFtZSwgZCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZDMuaGllcmFyY2h5KG1hcFtcIlwiXSk7XHJcbiAgfVxyXG5cclxuICAvLyBSZXR1cm4gYSBsaXN0IG9mIGltcG9ydHMgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBub2Rlcy5cclxuICBmdW5jdGlvbiBwYWNrYWdlSW1wb3J0cyhub2Rlcykge1xyXG4gICAgdmFyIG1hcCA9IHt9LFxyXG4gICAgICBpbXBvcnRzID0gW107XHJcblxyXG4gICAgLy8gQ29tcHV0ZSBhIG1hcCBmcm9tIG5hbWUgdG8gbm9kZS5cclxuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgbWFwW2QuZGF0YS5uYW1lXSA9IGQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBGb3IgZWFjaCBpbXBvcnQsIGNvbnN0cnVjdCBhIGxpbmsgZnJvbSB0aGUgc291cmNlIHRvIHRhcmdldCBub2RlLlxyXG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBpZiAoZC5kYXRhLmltcG9ydHMpXHJcbiAgICAgICAgZC5kYXRhLmltcG9ydHMuZm9yRWFjaChmdW5jdGlvbiAoaSkge1xyXG4gICAgICAgICAgaW1wb3J0cy5wdXNoKG1hcFtkLmRhdGEubmFtZV0ucGF0aChtYXBbaV0pKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBpbXBvcnRzO1xyXG4gIH1cclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgdHlwZSB7IGQzTm9kZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGdyYXBobGliVG9EMywgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZm9yY2VEaXJlY3RlZEcgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBtb2RhbC5wbHVnaW47XHJcbiAgbGV0IG5vZGVUb0dldFRvID0gY3VyckZpbGUuYmFzZW5hbWU7XHJcbiAgY29uc29sZS5sb2coeyBub2RlVG9HZXRUbyB9KTtcclxuXHJcbiAgY29uc29sZS50aW1lKFwiRmluZCBhbGwgcGF0aHNcIik7XHJcbiAgLy8gbGV0IHBhdGhzRnJvbU5vZGVUb0dldFRvID0gZ3JhcGhsaWIuYWxnLmRpamtzdHJhKGdyYXBoLCBub2RlVG9HZXRUbyk7XHJcbiAgY29uc29sZS50aW1lRW5kKFwiRmluZCBhbGwgcGF0aHNcIik7XHJcblxyXG4gIGNvbnN0IGRlZmF1bHROb2RlQ29sb3VyID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgXCItLXRleHQtYWNjZW50XCJcclxuICApO1xyXG4gIGxldCBjdXJyTm9kZUNvbG91ciA9IGRlZmF1bHROb2RlQ29sb3VyO1xyXG5cclxuICBjb25zdCBjb2xvdXJDaGFuZ2VJbnB1dCA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwiaW5wdXRcIilcclxuICAgIC5hdHRyKFwidHlwZVwiLCBcImNvbG9yXCIpO1xyXG5cclxuICBjb2xvdXJDaGFuZ2VJbnB1dC5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiBjaGFuZ2VDb2xvcihlbCkge1xyXG4gICAgY3Vyck5vZGVDb2xvdXIgPSBlbC50YXJnZXQudmFsdWU7XHJcbiAgICBub2RlXHJcbiAgICAgIC50cmFuc2l0aW9uKClcclxuICAgICAgLmR1cmF0aW9uKDMwMClcclxuICAgICAgLnN0eWxlKFwiZmlsbFwiLCAoZCkgPT4ge1xyXG4gICAgICAgIGlmIChkLmluZGV4ID09PSBjdXJyTm9kZUluZGV4KSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIGN1cnJOb2RlQ29sb3VyO1xyXG4gICAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgLy8gY29uc3Qgc2F2ZUxheW91dEJ1dHRvbiA9IG1vZGFsLmNvbnRlbnRFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyB0ZXh0OiAnU2F2ZSBMYXlvdXQnIH0pXHJcbiAgLy8gICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlR3JhcGgpXHJcblxyXG4gIGNvbnN0IGRhdGEgPSBncmFwaGxpYlRvRDMoZ3JhcGgpO1xyXG5cclxuICBjb25zdCBsaW5rczoge1xyXG4gICAgaW5kZXg6IG51bWJlcjtcclxuICAgIHNvdXJjZTogeyBpbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xyXG4gICAgdGFyZ2V0OiB7IGluZGV4OiBudW1iZXI7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgfVtdID0gZGF0YS5saW5rcy5tYXAoKGQpID0+IE9iamVjdC5jcmVhdGUoZCkpO1xyXG5cclxuICBjb25zdCBjdXJyTm9kZSA9IGRhdGEubm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5uYW1lID09PSBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgbGV0IGN1cnJOb2RlSW5kZXg6IG51bWJlcjtcclxuICBpZiAoIWN1cnJOb2RlKSB7XHJcbiAgICBjb25zdCBpZCA9IGRhdGEubm9kZXMubGVuZ3RoO1xyXG4gICAgZGF0YS5ub2Rlcy5wdXNoKHsgaWQsIG5hbWU6IGN1cnJGaWxlLmJhc2VuYW1lIH0pO1xyXG4gICAgY3Vyck5vZGVJbmRleCA9IGlkO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjdXJyTm9kZUluZGV4ID0gY3Vyck5vZGUuaWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdCBub2RlcyA9IGRhdGEubm9kZXMubWFwKChkKSA9PiBPYmplY3QuY3JlYXRlKGQpKTtcclxuXHJcbiAgY29uc3Qgc2ltdWxhdGlvbiA9IGQzXHJcbiAgICAuZm9yY2VTaW11bGF0aW9uKG5vZGVzKVxyXG4gICAgLmZvcmNlKFxyXG4gICAgICBcImxpbmtcIixcclxuICAgICAgZDMuZm9yY2VMaW5rKGxpbmtzKS5pZCgoZCkgPT4gZC5pZClcclxuICAgIClcclxuICAgIC5mb3JjZShcImNoYXJnZVwiLCBkMy5mb3JjZU1hbnlCb2R5KCkuc3RyZW5ndGgoLTgpKVxyXG4gICAgLmZvcmNlKFwiY2VudGVyXCIsIGQzLmZvcmNlQ2VudGVyKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMikuc3RyZW5ndGgoMC41KSk7XHJcblxyXG4gIGNvbnN0IGRyYWcgPSAoc2ltdWxhdGlvbjogZDMuU2ltdWxhdGlvbjxhbnksIHVuZGVmaW5lZD4pID0+IHtcclxuICAgIGZ1bmN0aW9uIGRyYWdzdGFydGVkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDAuMykucmVzdGFydCgpO1xyXG4gICAgICBkLmZ4ID0gZC54O1xyXG4gICAgICBkLmZ5ID0gZC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdnZWQoZXZlbnQsIGQpIHtcclxuICAgICAgZC5meCA9IGV2ZW50Lng7XHJcbiAgICAgIGQuZnkgPSBldmVudC55O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYWdlbmRlZChldmVudCwgZCkge1xyXG4gICAgICBpZiAoIWV2ZW50LmFjdGl2ZSkgc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgwKTtcclxuICAgICAgZC5meCA9IG51bGw7XHJcbiAgICAgIGQuZnkgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkM1xyXG4gICAgICAuZHJhZygpXHJcbiAgICAgIC5vbihcInN0YXJ0XCIsIGRyYWdzdGFydGVkKVxyXG4gICAgICAub24oXCJkcmFnXCIsIGRyYWdnZWQpXHJcbiAgICAgIC5vbihcImVuZFwiLCBkcmFnZW5kZWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImZvcmNlRGlyZWN0ZWRHXCIpO1xyXG5cclxuICBjb25zdCBsaW5rID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjODY4MjgyXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5zZWxlY3RBbGwoXCJsaW5lXCIpXHJcbiAgICAuZGF0YShsaW5rcylcclxuICAgIC5qb2luKFwibGluZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMC44KVxyXG4gICAgLmF0dHIoXCJtYXJrZXItZW5kXCIsIFwidXJsKCNlbmQpXCIpO1xyXG5cclxuICB2YXIgcGF0aCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcInN2ZzpnXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwicGF0aFwiKVxyXG4gICAgLmRhdGEobGlua3MpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcInN2ZzpwYXRoXCIpXHJcbiAgICAvLyAgICAuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwibGluayBcIiArIGQudHlwZTsgfSlcclxuICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJsaW5rXCIpXHJcbiAgICAuYXR0cihcIm1hcmtlci1lbmRcIiwgXCJ1cmwoI2VuZClcIik7XHJcblxyXG4gIGNvbnN0IGFycm93SGVhZCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcInN2ZzpkZWZzXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwibWFya2VyXCIpXHJcbiAgICAuZGF0YShbXCJlbmRcIl0pIC8vIERpZmZlcmVudCBsaW5rL3BhdGggdHlwZXMgY2FuIGJlIGRlZmluZWQgaGVyZVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoXCJzdmc6bWFya2VyXCIpIC8vIFRoaXMgc2VjdGlvbiBhZGRzIGluIHRoZSBhcnJvd3NcclxuICAgIC5hdHRyKFwiaWRcIiwgU3RyaW5nKVxyXG4gICAgLmF0dHIoXCJ2aWV3Qm94XCIsIFwiMCAtNSAxMCAxMFwiKVxyXG4gICAgLmF0dHIoXCJyZWZYXCIsIDIwKVxyXG4gICAgLmF0dHIoXCJyZWZZXCIsIDAuMSlcclxuICAgIC5hdHRyKFwibWFya2VyV2lkdGhcIiwgNilcclxuICAgIC5hdHRyKFwibWFya2VySGVpZ2h0XCIsIDYpXHJcbiAgICAuYXR0cihcIm9yaWVudFwiLCBcImF1dG9cIilcclxuICAgIC8vIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzg2ODI4MlwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMTApXHJcbiAgICAuYXBwZW5kKFwic3ZnOnBhdGhcIilcclxuICAgIC5hdHRyKFwiZFwiLCBcIk0wLC01TDEwLDBMMCw1XCIpO1xyXG5cclxuICBjb25zdCBuYW1lRnJvbUluZGV4ID0gKGQ6IHsgaW5kZXg6IG51bWJlciB9KSA9PlxyXG4gICAgZGF0YS5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmlkID09PSBkLmluZGV4KS5uYW1lO1xyXG5cclxuICBjb25zdCBpbmRleEZyb21OYW1lID0gKG5hbWU6IHN0cmluZyk6IG51bWJlciA9PlxyXG4gICAgZGF0YS5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLm5hbWUgPT09IG5hbWUpLmlkO1xyXG5cclxuICBjb25zdCBub2RlOiBkMy5TZWxlY3Rpb248XHJcbiAgICBkMy5CYXNlVHlwZSB8IFNWR0NpcmNsZUVsZW1lbnQsXHJcbiAgICBhbnksXHJcbiAgICBTVkdHRWxlbWVudCxcclxuICAgIHVua25vd25cclxuICA+ID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLnNlbGVjdEFsbChcImNpcmNsZVwiKVxyXG4gICAgLmRhdGEobm9kZXMpXHJcbiAgICAuam9pbihcImNpcmNsZVwiKVxyXG5cclxuICAgIC5hdHRyKFwiclwiLCA1KVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiB7XHJcbiAgICAgIGlmIChuYW1lRnJvbUluZGV4KGQpID09PSBjdXJyRmlsZS5iYXNlbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBcIiNmZmZmZmZcIjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY3Vyck5vZGVDb2xvdXI7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuY2FsbChkcmFnKHNpbXVsYXRpb24pKTtcclxuXHJcbiAgbm9kZS5hdHRyKFwiYXJpYS1sYWJlbFwiLCAoZDogZDNOb2RlKSA9PiBkLm5hbWUpO1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuICBub2RlLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBkM05vZGUpID0+IHtcclxuICAgIG5vZGVDbGljayhldmVudCwgZC5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgbm9kZS5vbihcIm1vdXNlZG93blwiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQpID0+IHtcclxuICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcclxuICAgICAgbm9kZVRvR2V0VG8gPSBkLm5hbWU7XHJcblxyXG4gICAgICBub2RlLnN0eWxlKFwiZmlsbFwiLCAobikgPT4ge1xyXG4gICAgICAgIGlmIChuLm5hbWUgPT09IG5vZGVUb0dldFRvKSB7XHJcbiAgICAgICAgICByZXR1cm4gXCIjZmYwMDAwXCI7XHJcbiAgICAgICAgfSBlbHNlIHJldHVybiBjdXJyTm9kZUNvbG91cjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBwYXRoc0Zyb21Ob2RlVG9HZXRUbyA9IGdyYXBobGliLmFsZy5kaWprc3RyYShncmFwaCwgbm9kZVRvR2V0VG8pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiBsaW5rZWQoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcclxuICAgIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IGxpbmtlZEFyciA9IGxpbmtzLmZpbmQoXHJcbiAgICAgIChsaW5rKSA9PlxyXG4gICAgICAgIChsaW5rLnNvdXJjZS5pbmRleCA9PT0gYSAmJiBsaW5rLnRhcmdldC5pbmRleCA9PT0gYikgfHxcclxuICAgICAgICAobGluay50YXJnZXQuaW5kZXggPT09IGEgJiYgbGluay5zb3VyY2UuaW5kZXggPT09IGIpXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiAhIWxpbmtlZEFycjtcclxuICB9XHJcblxyXG4gIC8vIGZ1bmN0aW9uIHdhbGtEaWprc3RyYVBhdGhzKFxyXG4gIC8vICAgcGF0aHM6IHsgW25vZGU6IHN0cmluZ106IGdyYXBobGliLlBhdGggfSxcclxuICAvLyAgIHN0YXJ0Tm9kZTogc3RyaW5nXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAoc3RhcnROb2RlID09PSBub2RlVG9HZXRUbyB8fCBwYXRoc1tzdGFydE5vZGVdLmRpc3RhbmNlID09PSBJbmZpbml0eSlcclxuICAvLyAgICAgcmV0dXJuIFtdO1xyXG4gIC8vICAgbGV0IHN0ZXAgPSBzdGFydE5vZGU7XHJcblxyXG4gIC8vICAgY29uc3QgcGF0aDogc3RyaW5nW10gPSBbc3RhcnROb2RlXTtcclxuICAvLyAgIGxldCBpID0gMDtcclxuICAvLyAgIGNvbnN0IE1BWCA9IDMwMDtcclxuICAvLyAgIHdoaWxlIChwYXRoc1tzdGVwXS5wcmVkZWNlc3NvciAhPT0gbm9kZVRvR2V0VG8gJiYgaSA8IE1BWCkge1xyXG4gIC8vICAgICBpKys7XHJcbiAgLy8gICAgIHN0ZXAgPSBwYXRoc1tzdGVwXS5wcmVkZWNlc3NvcjtcclxuICAvLyAgICAgcGF0aC5wdXNoKHN0ZXApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgaWYgKGkgPj0gTUFYKSByZXR1cm4gW107XHJcbiAgLy8gICBwYXRoLnB1c2gobm9kZVRvR2V0VG8pO1xyXG4gIC8vICAgcmV0dXJuIHBhdGg7XHJcbiAgLy8gfVxyXG5cclxuICBub2RlXHJcbiAgICAub24oXCJtb3VzZW92ZXJcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiB7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xyXG4gICAgICBub2RlXHJcbiAgICAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAgIC5kdXJhdGlvbigxNTApXHJcbiAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAobykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGxpbmtlZChkLmluZGV4LCBvLmluZGV4KSA/IDEgOiAwLjI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIGxpbmtcclxuICAgICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgICAgLmR1cmF0aW9uKDE1MClcclxuICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgICByZXR1cm4gby5zb3VyY2UuaW5kZXggPT09IGQuaW5kZXggfHwgby50YXJnZXQuaW5kZXggPT09IGQuaW5kZXhcclxuICAgICAgICAgICAgPyAxXHJcbiAgICAgICAgICAgIDogMC4yO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gSGlnaGxpZ2h0IHBhdGggZnJvbSBob3ZlcmVkIG5vZGUgdG8gY3Vyck5vZGVcclxuICAgICAgY29uc3QgaG92ZXJlZE5vZGUgPSBuYW1lRnJvbUluZGV4KGQpO1xyXG4gICAgICAvLyBjb25zdCBwYXRoID0gd2Fsa0RpamtzdHJhUGF0aHMocGF0aHNGcm9tTm9kZVRvR2V0VG8sIGhvdmVyZWROb2RlKTtcclxuICAgICAgLy8gaWYgKHBhdGgubGVuZ3RoKSB7XHJcbiAgICAgIC8vICAgbGlua1xyXG4gICAgICAvLyAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAvLyAgICAgLmR1cmF0aW9uKDE1MClcclxuICAgICAgLy8gICAgIC5zdHlsZShcInN0cm9rZVwiLCBmdW5jdGlvbiAobGluaykge1xyXG4gICAgICAvLyAgICAgICBpZiAoXHJcbiAgICAgIC8vICAgICAgICAgcGF0aC5pbmNsdWRlcyhuYW1lRnJvbUluZGV4KGxpbmsuc291cmNlKSkgJiZcclxuICAgICAgLy8gICAgICAgICBwYXRoLmluY2x1ZGVzKG5hbWVGcm9tSW5kZXgobGluay50YXJnZXQpKVxyXG4gICAgICAvLyAgICAgICApXHJcbiAgICAgIC8vICAgICAgICAgcmV0dXJuIGN1cnJOb2RlQ29sb3VyO1xyXG4gICAgICAvLyAgICAgfSlcclxuICAgICAgLy8gICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgZnVuY3Rpb24gKGxpbmspIHtcclxuICAgICAgLy8gICAgICAgaWYgKFxyXG4gICAgICAvLyAgICAgICAgIHBhdGguaW5jbHVkZXMobmFtZUZyb21JbmRleChsaW5rLnNvdXJjZSkpICYmXHJcbiAgICAgIC8vICAgICAgICAgcGF0aC5pbmNsdWRlcyhuYW1lRnJvbUluZGV4KGxpbmsudGFyZ2V0KSlcclxuICAgICAgLy8gICAgICAgKVxyXG4gICAgICAvLyAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAvLyAgICAgfSk7XHJcbiAgICAgIC8vIH1cclxuICAgIH0pXHJcbiAgICAub24oXCJtb3VzZW91dFwiLCB1bmZvY3VzKTtcclxuXHJcbiAgZnVuY3Rpb24gZm9jdXNOZWlnaGJvdXJzKGQsIGV2ZW50OiBNb3VzZUV2ZW50KSB7IH1cclxuXHJcbiAgZnVuY3Rpb24gdW5mb2N1cygpIHtcclxuICAgIC8vIGxhYmVsTm9kZS5hdHRyKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xyXG4gICAgbm9kZS5zdHlsZShcIm9wYWNpdHlcIiwgMSk7XHJcbiAgICBsaW5rLnN0eWxlKFwib3BhY2l0eVwiLCAxKS5zdHlsZShcInN0cm9rZVwiLCBcIiM4NjgyODJcIik7XHJcbiAgfVxyXG5cclxuICBzaW11bGF0aW9uLm9uKFwidGlja1wiLCAoKSA9PiB7XHJcbiAgICBsaW5rXHJcbiAgICAgIC5hdHRyKFwieDFcIiwgKGQpID0+IGQuc291cmNlLngpXHJcbiAgICAgIC5hdHRyKFwieTFcIiwgKGQpID0+IGQuc291cmNlLnkpXHJcbiAgICAgIC5hdHRyKFwieDJcIiwgKGQpID0+IGQudGFyZ2V0LngpXHJcbiAgICAgIC5hdHRyKFwieTJcIiwgKGQpID0+IGQudGFyZ2V0LnkpO1xyXG5cclxuICAgIG5vZGUuYXR0cihcImN4XCIsIChkKSA9PiBkLngpLmF0dHIoXCJjeVwiLCAoZCkgPT4gZC55KTtcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIG5vZGUuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gICAgbGluay5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgMTBdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG5cclxuICBmdW5jdGlvbiBzYXZlR3JhcGgoKSB7XHJcbiAgICBjb25zdCBjbG9uZSA9IHN2Zy5jbG9uZSh0cnVlKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiRkRHXCIsIEpTT04uc3RyaW5naWZ5KGNsb25lKSk7XHJcbiAgfVxyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBpY2ljbGUgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICB2aWV3SGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXIgfSk7XHJcblxyXG4gIGNvbnN0IGZvcm1hdCA9IGQzLmZvcm1hdChcIixkXCIpO1xyXG5cclxuICBjb25zdCBjb2xvciA9IGQzLnNjYWxlT3JkaW5hbChcclxuICAgIGQzLnF1YW50aXplKGQzLmludGVycG9sYXRlUmFpbmJvdywgaGllci5jaGlsZHJlbi5sZW5ndGggKyAxKVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IHBhcnRpdGlvbiA9IChkYXRhKSA9PiB7XHJcbiAgICBjb25zdCByb290ID0gZDNcclxuICAgICAgLmhpZXJhcmNoeShkYXRhKVxyXG4gICAgICAuc3VtKChkKSA9PiBkLnZhbHVlKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5oZWlnaHQgLSBhLmhlaWdodCB8fCBiLnZhbHVlIC0gYS52YWx1ZSk7XHJcbiAgICByZXR1cm4gZDMucGFydGl0aW9uKCkuc2l6ZShbdmlld0hlaWdodCwgKChyb290LmhlaWdodCArIDEpICogd2lkdGgpIC8gM10pKFxyXG4gICAgICByb290XHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHJvb3QgPSBwYXJ0aXRpb24oaGllcik7XHJcbiAgbGV0IGZvY3VzID0gcm9vdDtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHZpZXdIZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLnN0eWxlKFwiZm9udFwiLCBcIjEwcHggc2Fucy1zZXJpZlwiKTtcclxuXHJcbiAgY29uc3QgY2VsbCA9IHN2Z1xyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKSlcclxuICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHtkLnkwfSwke2QueDB9KWApO1xyXG5cclxuICBjb25zdCByZWN0ID0gY2VsbFxyXG4gICAgLmFwcGVuZChcInJlY3RcIilcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgKGQpID0+IGQueTEgLSBkLnkwIC0gMSlcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIChkKSA9PiByZWN0SGVpZ2h0KGQpKVxyXG4gICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiB7XHJcbiAgICAgIGlmICghZC5kZXB0aCkgcmV0dXJuIFwiI2NjY1wiO1xyXG4gICAgICB3aGlsZSAoZC5kZXB0aCA+IDEpIGQgPSBkLnBhcmVudDtcclxuICAgICAgcmV0dXJuIGNvbG9yKGQuZGF0YS5kYXRhLm5hbWUpO1xyXG4gICAgfSlcclxuICAgIC5zdHlsZShcImN1cnNvclwiLCBcInBvaW50ZXJcIilcclxuICAgIC5vbihcImNsaWNrXCIsIGNsaWNrZWQpO1xyXG5cclxuICBjb25zdCB0ZXh0ID0gY2VsbFxyXG4gICAgLmFwcGVuZChcInRleHRcIilcclxuICAgIC5zdHlsZShcInVzZXItc2VsZWN0XCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwieFwiLCA0KVxyXG4gICAgLmF0dHIoXCJ5XCIsIDEzKTtcclxuICAvLyAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gK2xhYmVsVmlzaWJsZShkKSk7XHJcblxyXG4gIHRleHQuYXBwZW5kKFwidHNwYW5cIikudGV4dCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSk7XHJcblxyXG4gIGNvbnN0IHRzcGFuID0gdGV4dFxyXG4gICAgLmFwcGVuZChcInRzcGFuXCIpXHJcbiAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gKGxhYmVsVmlzaWJsZShkKSA/IDEgOiAwKSAqIDAuNylcclxuICAgIC50ZXh0KChkKSA9PiBgICR7Zm9ybWF0KGQudmFsdWUpfWApO1xyXG5cclxuICBjZWxsLmFwcGVuZChcInRpdGxlXCIpLnRleHQoXHJcbiAgICAoZCkgPT5cclxuICAgICAgYCR7ZC5hbmNlc3RvcnMoKS5tYXAoKGQpID0+IGQuZGF0YS5kYXRhLm5hbWUpXHJcbiAgICAgIC8vIC5yZXZlcnNlKClcclxuICAgICAgLy8gLmpvaW4oXCIvXCIpfVxcbiR7Zm9ybWF0KGQudmFsdWUpXHJcbiAgICAgIH1gXHJcbiAgKTtcclxuXHJcbiAgZnVuY3Rpb24gY2xpY2tlZChldmVudCwgcCkge1xyXG4gICAgY29uc29sZS5sb2coeyBwIH0pO1xyXG4gICAgZm9jdXMgPSBmb2N1cyA9PT0gcCA/IChwID0gcC5wYXJlbnQpIDogcDtcclxuXHJcbiAgICByb290LmVhY2goKGQpID0+IHtcclxuICAgICAgZC50YXJnZXQgPSB7XHJcbiAgICAgICAgeDA6ICgoZC54MCAtIHAueDApIC8gKHAueDEgLSBwLngwKSkgKiB2aWV3SGVpZ2h0LFxyXG4gICAgICAgIHgxOiAoKGQueDEgLSBwLngwKSAvIChwLngxIC0gcC54MCkpICogdmlld0hlaWdodCxcclxuICAgICAgICB5MDogZC55MCAtIHAueTAsXHJcbiAgICAgICAgeTE6IGQueTEgLSBwLnkwLFxyXG4gICAgICB9O1xyXG4gICAgICBjb25zb2xlLmxvZyhkLnRhcmdldC54MCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0ID0gY2VsbFxyXG4gICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgIC5kdXJhdGlvbig3NTApXHJcbiAgICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC50YXJnZXQueTB9LCR7ZC50YXJnZXQueDB9KWApO1xyXG5cclxuICAgIHJlY3QudHJhbnNpdGlvbih0KS5hdHRyKFwiaGVpZ2h0XCIsIChkKSA9PiByZWN0SGVpZ2h0KGQudGFyZ2V0KSk7XHJcbiAgICB0ZXh0LnRyYW5zaXRpb24odCkuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gK2xhYmVsVmlzaWJsZShkLnRhcmdldCkpO1xyXG4gICAgdHNwYW5cclxuICAgICAgLnRyYW5zaXRpb24odClcclxuICAgICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgKGQpID0+IChsYWJlbFZpc2libGUoZCkgPyAxIDogMCkgKiAwLjcpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcmVjdEhlaWdodChkKSB7XHJcbiAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgICByZXR1cm4gZC54MSAtIGQueDAgLSBNYXRoLm1pbigxLCAoZC54MSAtIGQueDApIC8gMik7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsYWJlbFZpc2libGUoZCkge1xyXG4gICAgcmV0dXJuIGQueTEgPD0gd2lkdGggJiYgZC55MCA+PSAwICYmIGQueDEgLSBkLngwID4gMTY7XHJcbiAgfVxyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCByYWRpYWxUcmVlID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IHJvb3QgPSBkM1xyXG4gICAgLmhpZXJhcmNoeShoaWVyYXJjaHksIChkKSA9PiBkLmNoaWxkcmVuKVxyXG4gICAgLnN1bSgoZCkgPT4gKGQuY2hpbGRyZW4gPyAwIDogMSkpXHJcbiAgICAuc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpO1xyXG5cclxuICBjb25zdCBvdXRlclJhZGl1cyA9IHdpZHRoIC8gMjtcclxuICBjb25zdCBpbm5lclJhZGl1cyA9IG91dGVyUmFkaXVzIC0gMTcwO1xyXG5cclxuICBjb25zdCBjbHVzdGVyID0gZDNcclxuICAgIC5jbHVzdGVyKClcclxuICAgIC5zaXplKFszNjAsIGlubmVyUmFkaXVzXSlcclxuICAgIC5zZXBhcmF0aW9uKChhLCBiKSA9PiAxKTtcclxuXHJcbiAgY29uc3QgY29sb3IgPSBkM1xyXG4gICAgLnNjYWxlT3JkaW5hbCgpXHJcbiAgICAuZG9tYWluKGdyYXBoLm5vZGVzKCkpXHJcbiAgICAucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XHJcblxyXG4gIGZ1bmN0aW9uIG1heExlbmd0aChkOiBkMy5IaWVyYXJjaHlOb2RlPHVua25vd24+KSB7XHJcbiAgICByZXR1cm4gZC5kYXRhLmRhdGEuZGVwdGggKyAoZC5jaGlsZHJlbiA/IGQzLm1heChkLmNoaWxkcmVuLCBtYXhMZW5ndGgpIDogMCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBzZXRSYWRpdXMoZDogZDMuSGllcmFyY2h5Tm9kZTx1bmtub3duPiwgeTA6IG51bWJlciwgazogbnVtYmVyKSB7XHJcbiAgICBkLnJhZGl1cyA9ICh5MCArPSBkLmRhdGEuZGF0YS5kZXB0aCkgKiBrO1xyXG4gICAgaWYgKGQuY2hpbGRyZW4pIGQuY2hpbGRyZW4uZm9yRWFjaCgoZCkgPT4gc2V0UmFkaXVzKGQsIHkwLCBrKSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBzZXRDb2xvcihkOiBkMy5IaWVyYXJjaHlOb2RlPHVua25vd24+KSB7XHJcbiAgICB2YXIgbmFtZSA9IGQuZGF0YS5kYXRhLm5hbWU7XHJcbiAgICBkLmNvbG9yID1cclxuICAgICAgY29sb3IuZG9tYWluKCkuaW5kZXhPZihuYW1lKSA+PSAwXHJcbiAgICAgICAgPyBjb2xvcihuYW1lKVxyXG4gICAgICAgIDogZC5wYXJlbnRcclxuICAgICAgICAgID8gZC5wYXJlbnQuY29sb3JcclxuICAgICAgICAgIDogbnVsbDtcclxuICAgIGlmIChkLmNoaWxkcmVuKSBkLmNoaWxkcmVuLmZvckVhY2goc2V0Q29sb3IpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua1ZhcmlhYmxlKGQpIHtcclxuICAgIHJldHVybiBsaW5rU3RlcChkLnNvdXJjZS54LCBkLnNvdXJjZS5yYWRpdXMsIGQudGFyZ2V0LngsIGQudGFyZ2V0LnJhZGl1cyk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaW5rQ29uc3RhbnQoZCkge1xyXG4gICAgcmV0dXJuIGxpbmtTdGVwKGQuc291cmNlLngsIGQuc291cmNlLnksIGQudGFyZ2V0LngsIGQudGFyZ2V0LnkpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua0V4dGVuc2lvblZhcmlhYmxlKGQpIHtcclxuICAgIHJldHVybiBsaW5rU3RlcChkLnRhcmdldC54LCBkLnRhcmdldC5yYWRpdXMsIGQudGFyZ2V0LngsIGlubmVyUmFkaXVzKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtFeHRlbnNpb25Db25zdGFudChkKSB7XHJcbiAgICByZXR1cm4gbGlua1N0ZXAoZC50YXJnZXQueCwgZC50YXJnZXQueSwgZC50YXJnZXQueCwgaW5uZXJSYWRpdXMpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua1N0ZXAoXHJcbiAgICBzdGFydEFuZ2xlOiBudW1iZXIsXHJcbiAgICBzdGFydFJhZGl1czogbnVtYmVyLFxyXG4gICAgZW5kQW5nbGU6IG51bWJlcixcclxuICAgIGVuZFJhZGl1czogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjMCA9IE1hdGguY29zKChzdGFydEFuZ2xlID0gKChzdGFydEFuZ2xlIC0gOTApIC8gMTgwKSAqIE1hdGguUEkpKTtcclxuICAgIGNvbnN0IHMwID0gTWF0aC5zaW4oc3RhcnRBbmdsZSk7XHJcbiAgICBjb25zdCBjMSA9IE1hdGguY29zKChlbmRBbmdsZSA9ICgoZW5kQW5nbGUgLSA5MCkgLyAxODApICogTWF0aC5QSSkpO1xyXG4gICAgY29uc3QgczEgPSBNYXRoLnNpbihlbmRBbmdsZSk7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBcIk1cIiArXHJcbiAgICAgIHN0YXJ0UmFkaXVzICogYzAgK1xyXG4gICAgICBcIixcIiArXHJcbiAgICAgIHN0YXJ0UmFkaXVzICogczAgK1xyXG4gICAgICAoZW5kQW5nbGUgPT09IHN0YXJ0QW5nbGVcclxuICAgICAgICA/IFwiXCJcclxuICAgICAgICA6IFwiQVwiICtcclxuICAgICAgICBzdGFydFJhZGl1cyArXHJcbiAgICAgICAgXCIsXCIgK1xyXG4gICAgICAgIHN0YXJ0UmFkaXVzICtcclxuICAgICAgICBcIiAwIDAgXCIgK1xyXG4gICAgICAgIChlbmRBbmdsZSA+IHN0YXJ0QW5nbGUgPyAxIDogMCkgK1xyXG4gICAgICAgIFwiIFwiICtcclxuICAgICAgICBzdGFydFJhZGl1cyAqIGMxICtcclxuICAgICAgICBcIixcIiArXHJcbiAgICAgICAgc3RhcnRSYWRpdXMgKiBzMSkgK1xyXG4gICAgICBcIkxcIiArXHJcbiAgICAgIGVuZFJhZGl1cyAqIGMxICtcclxuICAgICAgXCIsXCIgK1xyXG4gICAgICBlbmRSYWRpdXMgKiBzMVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGxlZ2VuZCA9IChzdmcpID0+IHtcclxuICAgIGNvbnN0IGcgPSBzdmdcclxuICAgICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgICAgLmRhdGEoY29sb3IuZG9tYWluKCkpXHJcbiAgICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICBcInRyYW5zZm9ybVwiLFxyXG4gICAgICAgIChkLCBpKSA9PiBgdHJhbnNsYXRlKCR7LW91dGVyUmFkaXVzfSwkey1vdXRlclJhZGl1cyArIGkgKiAyMH0pYFxyXG4gICAgICApO1xyXG5cclxuICAgIGcuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwid2lkdGhcIiwgMTgpLmF0dHIoXCJoZWlnaHRcIiwgMTgpLmF0dHIoXCJmaWxsXCIsIGNvbG9yKTtcclxuXHJcbiAgICBnLmFwcGVuZChcInRleHRcIilcclxuICAgICAgLmF0dHIoXCJ4XCIsIDI0KVxyXG4gICAgICAuYXR0cihcInlcIiwgOSlcclxuICAgICAgLmF0dHIoXCJkeVwiLCBcIjAuMzVlbVwiKVxyXG4gICAgICAudGV4dCgoZCkgPT4gZCk7XHJcbiAgfTtcclxuXHJcbiAgY2x1c3Rlcihyb290KTtcclxuICBzZXRSYWRpdXMocm9vdCwgKHJvb3QuZGF0YS5kYXRhLmRlcHRoID0gMCksIGlubmVyUmFkaXVzIC8gbWF4TGVuZ3RoKHJvb3QpKTtcclxuICBzZXRDb2xvcihyb290KTtcclxuXHJcbiAgc3ZnLmFwcGVuZChcImdcIikuY2FsbChsZWdlbmQpO1xyXG5cclxuICBzdmcuYXBwZW5kKFwic3R5bGVcIikudGV4dChgXHJcblxyXG4ubGluay0tYWN0aXZlIHtcclxuc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7XHJcbnN0cm9rZS13aWR0aDogMS41cHg7XHJcbn1cclxuXHJcbi5saW5rLWV4dGVuc2lvbi0tYWN0aXZlIHtcclxuc3Ryb2tlLW9wYWNpdHk6IC42O1xyXG59XHJcblxyXG4ubGFiZWwtLWFjdGl2ZSB7XHJcbmZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG5gKTtcclxuXHJcbiAgY29uc3QgbGlua0V4dGVuc2lvbiA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzAwMFwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjI1KVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKHJvb3QubGlua3MoKS5maWx0ZXIoKGQpID0+ICFkLnRhcmdldC5jaGlsZHJlbikpXHJcbiAgICAuam9pbihcInBhdGhcIilcclxuICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGQudGFyZ2V0LmxpbmtFeHRlbnNpb25Ob2RlID0gdGhpcztcclxuICAgIH0pXHJcbiAgICAuYXR0cihcImRcIiwgbGlua0V4dGVuc2lvbkNvbnN0YW50KTtcclxuXHJcbiAgY29uc3QgbGluayA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzAwMFwiKVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKHJvb3QubGlua3MoKSlcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLmVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgZC50YXJnZXQubGlua05vZGUgPSB0aGlzO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiZFwiLCBsaW5rQ29uc3RhbnQpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCAoZCkgPT4gZC50YXJnZXQuY29sb3IpO1xyXG5cclxuICBjb25zdCBsYWJlbCA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5zZWxlY3RBbGwoXCJ0ZXh0XCIpXHJcbiAgICAuZGF0YShyb290LmxlYXZlcygpKVxyXG4gICAgLmpvaW4oXCJ0ZXh0XCIpXHJcbiAgICAuYXR0cihcImR5XCIsIFwiLjMxZW1cIilcclxuICAgIC5hdHRyKFxyXG4gICAgICBcInRyYW5zZm9ybVwiLFxyXG4gICAgICAoZCkgPT5cclxuICAgICAgICBgcm90YXRlKCR7ZC54IC0gOTB9KSB0cmFuc2xhdGUoJHtpbm5lclJhZGl1cyArIDR9LDApJHtkLnggPCAxODAgPyBcIlwiIDogXCIgcm90YXRlKDE4MClcIlxyXG4gICAgICAgIH1gXHJcbiAgICApXHJcbiAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIChkKSA9PiAoZC54IDwgMTgwID8gXCJzdGFydFwiIDogXCJlbmRcIikpXHJcbiAgICAudGV4dCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAgIC5vbihcIm1vdXNlb3ZlclwiLCBtb3VzZW92ZXJlZCh0cnVlKSlcclxuICAgIC5vbihcIm1vdXNlb3V0XCIsIG1vdXNlb3ZlcmVkKGZhbHNlKSk7XHJcblxyXG4gIC8vICAgZnVuY3Rpb24gdXBkYXRlKGNoZWNrZWQpIHtcclxuICAvLyAgICAgY29uc3QgdCA9IGQzLnRyYW5zaXRpb24oKS5kdXJhdGlvbig3NTApO1xyXG4gIC8vICAgICBsaW5rRXh0ZW5zaW9uXHJcbiAgLy8gICAgICAgLnRyYW5zaXRpb24odClcclxuICAvLyAgICAgICAuYXR0cihcImRcIiwgY2hlY2tlZCA/IGxpbmtFeHRlbnNpb25WYXJpYWJsZSA6IGxpbmtFeHRlbnNpb25Db25zdGFudCk7XHJcbiAgLy8gICAgIGxpbmsudHJhbnNpdGlvbih0KS5hdHRyKFwiZFwiLCBjaGVja2VkID8gbGlua1ZhcmlhYmxlIDogbGlua0NvbnN0YW50KTtcclxuICAvLyAgIH1cclxuXHJcbiAgZnVuY3Rpb24gbW91c2VvdmVyZWQoYWN0aXZlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBkKSB7XHJcbiAgICAgIGQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKFwibGFiZWwtLWFjdGl2ZVwiLCBhY3RpdmUpO1xyXG4gICAgICBkMy5zZWxlY3QoZC5saW5rRXh0ZW5zaW9uTm9kZSlcclxuICAgICAgICAuY2xhc3NlZChcImxpbmstZXh0ZW5zaW9uLS1hY3RpdmVcIiwgYWN0aXZlKVxyXG4gICAgICAgIC5yYWlzZSgpO1xyXG4gICAgICBkbyBkMy5zZWxlY3QoZC5saW5rTm9kZSkuY2xhc3NlZChcImxpbmstLWFjdGl2ZVwiLCBhY3RpdmUpLnJhaXNlKCk7XHJcbiAgICAgIHdoaWxlICgoZCA9IGQucGFyZW50KSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIGxpbmtFeHRlbnNpb24uYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gICAgbGluay5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgICBsYWJlbC5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHN1bmJ1cnN0ID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICB2YXIgcmFkaXVzID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyOyAvLyA8IC0tIDJcclxuICB2YXIgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XHJcblxyXG4gIHZhciBnID0gZDNcclxuICAgIC5zZWxlY3QoXCJzdmdcIikgLy8gPC0tIDFcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpIC8vIDwtLSAyXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXBwZW5kKFwiZ1wiKSAvLyA8LS0gM1xyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyB3aWR0aCAvIDIgKyBcIixcIiArIGhlaWdodCAvIDIgKyBcIilcIik7IC8vIDwtLSA0XHJcblxyXG4gIHZhciBnID0gZDNcclxuICAgIC5zZWxlY3QoXCJzdmdcIikgLy8gcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgPHN2Zz4gZWxlbWVudFxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCkgLy8gc2V0cyB0aGUgd2lkdGggb2YgPHN2Zz4gYW5kIHRoZW4gcmV0dXJucyB0aGUgPHN2Zz4gZWxlbWVudCBhZ2FpblxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KSAvLyAoc2FtZSBhcyB3aWR0aClcclxuICAgIC5hcHBlbmQoXCJnXCIpIC8vIGFkZHMgYSA8Zz4gZWxlbWVudCB0byB0aGUgPHN2Zz4gZWxlbWVudC4gSXQgcmV0dXJucyB0aGUgPGc+IGVsZW1lbnRcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIFwidHJhbnNsYXRlKFwiICsgd2lkdGggLyAyICsgXCIsXCIgKyBoZWlnaHQgLyAyICsgXCIpXCIpOyAvLyB0YWtlcyB0aGUgPGc+IGVsZW1lbnQgYW5kIG1vdmVzIHRoZSBbMCwwXSBjZW50ZXIgb3ZlciBhbmQgZG93blxyXG5cclxuICB2YXIgZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwic3ZnXCIpIC8vIC0tPiA8c3ZnPjwvc3ZnPlxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCkgLy8gLS0+IDxzdmcgd2lkdGg9XCI1MDBcIj48L3N2Zz5cclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodCkgLy8gLS0+IDxzdmcgd2lkdGg9XCI1MDBcIiBoZWlnaHQ9XCI1MDBcIj48L3N2Zz5cclxuICAgIC5hcHBlbmQoXCJnXCIpIC8vIC0tPiA8c3ZnIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiNTAwXCI+PGc+PC9nPjwvc3ZnPlxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyB3aWR0aCAvIDIgKyBcIixcIiArIGhlaWdodCAvIDIgKyBcIilcIik7IC8vIC0tPiA8c3ZnIHdpZHRoPVwiNTAwXCIgaGVpZ2h0PVwiNTAwXCI+PGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDI1MCwyNTApXCI+PC9nPjwvc3ZnPlxyXG5cclxuICB2YXIgcGFydGl0aW9uID0gZDNcclxuICAgIC5wYXJ0aXRpb24oKSAvLyA8LS0gMVxyXG4gICAgLnNpemUoWzIgKiBNYXRoLlBJLCByYWRpdXNdKTsgLy8gPC0tIDJcclxuXHJcbiAgdmFyIHJvb3QgPSBkM1xyXG4gICAgLmhpZXJhcmNoeShoaWVyYXJjaHkpIC8vIDwtLSAxXHJcbiAgICAuc3VtKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLmhlaWdodDtcclxuICAgIH0pOyAvLyA8LS0gMlxyXG5cclxuICBwYXJ0aXRpb24ocm9vdCk7IC8vIDwtLSAxXHJcbiAgdmFyIGFyYyA9IGQzXHJcbiAgICAuYXJjKCkgLy8gPC0tIDJcclxuICAgIC5zdGFydEFuZ2xlKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLngwO1xyXG4gICAgfSlcclxuICAgIC5lbmRBbmdsZShmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC54MTtcclxuICAgIH0pXHJcbiAgICAuaW5uZXJSYWRpdXMoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQueTA7XHJcbiAgICB9KVxyXG4gICAgLm91dGVyUmFkaXVzKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLnkxO1xyXG4gICAgfSk7XHJcblxyXG4gIGcuc2VsZWN0QWxsKFwicGF0aFwiKSAvLyA8LS0gMVxyXG4gICAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKSAvLyA8LS0gMlxyXG4gICAgLmVudGVyKCkgLy8gPC0tIDNcclxuICAgIC5hcHBlbmQoXCJwYXRoXCIpIC8vIDwtLSA0XHJcbiAgICAuYXR0cihcImRpc3BsYXlcIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQuZGVwdGggPyBudWxsIDogXCJub25lXCI7XHJcbiAgICB9KSAvLyA8LS0gNVxyXG4gICAgLmF0dHIoXCJkXCIsIGFyYykgLy8gPC0tIDZcclxuICAgIC5zdHlsZShcInN0cm9rZVwiLCBcIiNmZmZcIikgLy8gPC0tIDdcclxuICAgIC5zdHlsZShcImZpbGxcIiwgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGNvbG9yKChkLmNoaWxkcmVuID8gZCA6IGQucGFyZW50KS5kYXRhLm5hbWUpO1xyXG4gICAgfSk7IC8vIDwtLSA4XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHRpZHlUcmVlID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgLy8gY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IGJmc0Fkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICAvLyBjb25zb2xlLmxvZyh7IGFkakxpc3QgfSk7XHJcblxyXG4gIC8vIGNvbnN0IG5vRG91YmxlcyA9IFsuLi5hZGpMaXN0XTtcclxuICAvLyBub0RvdWJsZXMuZm9yRWFjaCgoYSwgaSwgbGlzdCkgPT4ge1xyXG4gIC8vICAgaWYgKGxpc3Quc29tZSgoYiwgaikgPT4gaSAhPT0gaiAmJiBhLnBhcmVudElkID09PSBiLnBhcmVudElkKSkge1xyXG4gIC8vICAgICBub0RvdWJsZXMuc3BsaWNlKGksIDEpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH0pO1xyXG4gIC8vIGNvbnNvbGUubG9nKHsgbm9Eb3VibGVzIH0pO1xyXG5cclxuICBjb25zdCB0cmVlID0gKGRhdGEpID0+IHtcclxuICAgIGNvbnN0IHJvb3QgPSBkMy5oaWVyYXJjaHkoZGF0YSk7XHJcbiAgICByb290LmR4ID0gMTA7XHJcbiAgICByb290LmR5ID0gd2lkdGggLyAocm9vdC5oZWlnaHQgKyAxKTtcclxuICAgIHJldHVybiBkMy50cmVlKCkubm9kZVNpemUoW3Jvb3QuZHgsIHJvb3QuZHldKShyb290KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXJhcmNoeSA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIGNvbnN0IHJvb3QgPSB0cmVlKGhpZXJhcmNoeSk7XHJcbiAgY29uc29sZS5sb2cocm9vdCk7XHJcblxyXG4gIGxldCB4MCA9IEluZmluaXR5O1xyXG4gIGxldCB4MSA9IC14MDtcclxuICByb290LmVhY2goKGQpID0+IHtcclxuICAgIGlmIChkLnggPiB4MSkgeDEgPSBkLng7XHJcbiAgICBpZiAoZC54IDwgeDApIHgwID0gZC54O1xyXG4gIH0pO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcblxyXG4gIGNvbnN0IGcgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZvbnQtZmFtaWx5XCIsIFwic2Fucy1zZXJpZlwiKVxyXG4gICAgLmF0dHIoXCJmb250LXNpemVcIiwgMTApXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cm9vdC5keSAvIDN9LCR7cm9vdC5keCAtIHgwfSlgKTtcclxuXHJcbiAgY29uc3QgbGluayA9IGdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiM1NTVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC40KVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMS41KVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKHJvb3QubGlua3MoKSlcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLmF0dHIoXHJcbiAgICAgIFwiZFwiLFxyXG4gICAgICBkM1xyXG4gICAgICAgIC5saW5rSG9yaXpvbnRhbCgpXHJcbiAgICAgICAgLngoKGQpID0+IGQueSlcclxuICAgICAgICAueSgoZCkgPT4gZC54KVxyXG4gICAgKTtcclxuXHJcbiAgY29uc3Qgbm9kZSA9IGdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1saW5lam9pblwiLCBcInJvdW5kXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAxMClcclxuICAgIC5zZWxlY3RBbGwoXCJnXCIpXHJcbiAgICAuZGF0YShyb290LmRlc2NlbmRhbnRzKCkpXHJcbiAgICAuam9pbihcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC55fSwke2QueH0pYCk7XHJcblxyXG4gIG5vZGVcclxuICAgIC5hcHBlbmQoXCJjaXJjbGVcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyBcIiM1NTVcIiA6IFwiIzk5OVwiKSlcclxuICAgIC5hdHRyKFwiclwiLCAxMCk7XHJcblxyXG4gIG5vZGUuYXR0cihcImFyaWEtbGFiZWxcIiwgKGQpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKGQpO1xyXG4gICAgcmV0dXJuIGQuZGF0YS5kYXRhLm5hbWU7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG5vZGVDbGljayA9IChldmVudDogTW91c2VFdmVudCwgZGVzdDogc3RyaW5nKSA9PiB7XHJcbiAgICBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQpO1xyXG4gICAgbW9kYWwuY2xvc2UoKTtcclxuICB9O1xyXG4gIG5vZGUub24oXCJjbGlja1wiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKHsgZCB9KTtcclxuICAgIG5vZGVDbGljayhldmVudCwgZC5kYXRhLmRhdGEubmFtZSk7XHJcbiAgfSk7XHJcblxyXG4gIG5vZGVcclxuICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAuYXR0cihcImR5XCIsIFwiMC4zMWVtXCIpXHJcbiAgICAuYXR0cihcInhcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gLTYgOiA2KSlcclxuICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gXCJlbmRcIiA6IFwic3RhcnRcIikpXHJcbiAgICAudGV4dCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAgIC5jbG9uZSh0cnVlKVxyXG4gICAgLmxvd2VyKClcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwid2hpdGVcIik7XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBzdmcuYXR0cihcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0pO1xyXG4gIH1cclxuICBzdmcuY2FsbChcclxuICAgIGQzXHJcbiAgICAgIC56b29tKClcclxuICAgICAgLmV4dGVudChbXHJcbiAgICAgICAgWzAsIDBdLFxyXG4gICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcclxuICAgICAgXSlcclxuICAgICAgLnNjYWxlRXh0ZW50KFswLjUsIDhdKVxyXG4gICAgICAub24oXCJ6b29tXCIsIHpvb21lZClcclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHR5cGUgeyBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0IH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuXHJcbmV4cG9ydCBjb25zdCB0cmVlTWFwID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHkgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCByb290ID0gZDNcclxuICAgIC50cmVlbWFwKClcclxuICAgIC50aWxlKGQzLnRyZWVtYXBCaW5hcnkpXHJcbiAgICAuc2l6ZShbd2lkdGgsIGhlaWdodF0pXHJcbiAgICAucGFkZGluZygxKVxyXG4gICAgLnJvdW5kKHRydWUpKFxyXG4gICAgICBoaWVyYXJjaHkuc3VtKChkKSA9PiBkLmhlaWdodCkuc29ydCgoYSwgYikgPT4gYi5oZWlnaHQgLSBhLmhlaWdodClcclxuICAgICk7XHJcblxyXG4gIC8vICAgY29uc3Qgcm9vdCA9IHRyZWVtYXAoZGF0YSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKVxyXG4gICAgLnN0eWxlKFwiZm9udFwiLCBcIjEwcHggc2Fucy1zZXJpZlwiKTtcclxuXHJcbiAgY29uc3QgbGVhZiA9IHN2Z1xyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKHJvb3QubGVhdmVzKCkpXHJcbiAgICAuam9pbihcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7ZC54MH0sJHtkLnkwfSlgKTtcclxuXHJcbiAgbGVhZi5hdHRyKFwiYXJpYS1sYWJlbFwiLCAoZCkgPT4gZC5kYXRhLm5hbWUpO1xyXG5cclxuICAvLyAgIGxlYWYuYXBwZW5kKFwidGl0bGVcIikudGV4dChcclxuICAvLyAgICAgKGQpID0+XHJcbiAgLy8gICAgICAgYCR7ZFxyXG4gIC8vICAgICAgICAgLmFuY2VzdG9ycygpXHJcbiAgLy8gICAgICAgICAucmV2ZXJzZSgpXHJcbiAgLy8gICAgICAgICAubWFwKChkKSA9PiBkLmRhdGEuaWQpXHJcbiAgLy8gICAgICAgICAuam9pbihcIi9cIil9XFxuJHtmb3JtYXQoZC5oZWlnaHQpfWBcclxuICAvLyAgICk7XHJcblxyXG4gIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApO1xyXG5cclxuICBsZWFmXHJcbiAgICAuYXBwZW5kKFwicmVjdFwiKVxyXG4gICAgLy8gLmF0dHIoXCJpZFwiLCAoZCkgPT4gKGQubGVhZlVpZCA9IERPTS51aWQoXCJsZWFmXCIpKS5pZClcclxuICAgIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4ge1xyXG4gICAgICB3aGlsZSAoZC5kZXB0aCA+IDEpIGQgPSBkLnBhcmVudDtcclxuICAgICAgcmV0dXJuIGNvbG9yKGQuZGF0YS5pZCk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCAoZCkgPT4gZC54MSAtIGQueDApXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCAoZCkgPT4gZC55MSAtIGQueTApO1xyXG5cclxuICBsZWFmXHJcbiAgICAuYXBwZW5kKFwiY2xpcFBhdGhcIilcclxuICAgIC8vIC5hdHRyKFwiaWRcIiwgKGQpID0+IChkLmNsaXBVaWQgPSBET00udWlkKFwiY2xpcFwiKSkuaWQpXHJcbiAgICAuYXBwZW5kKFwidXNlXCIpO1xyXG4gIC8vIC5hdHRyKFwieGxpbms6aHJlZlwiLCAoZCkgPT4gZC5sZWFmVWlkLmhyZWYpO1xyXG5cclxuICAvLyAgIGxlYWZcclxuICAvLyAgICAgLmFwcGVuZChcInRleHRcIilcclxuICAvLyAgICAgLmF0dHIoXCJjbGlwLXBhdGhcIiwgKGQpID0+IGQuY2xpcFVpZClcclxuICAvLyAgICAgLnNlbGVjdEFsbChcInRzcGFuXCIpXHJcbiAgLy8gICAgIC5kYXRhKChkKSA9PiB7XHJcbiAgLy8gICAgICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gIC8vICAgICAgIHJldHVybiBkLmRhdGEubmFtZS5zcGxpdCgvKD89W0EtWl1bXkEtWl0pL2cpLmNvbmNhdChmb3JtYXQoZC5oZWlnaHQpKTtcclxuICAvLyAgICAgfSlcclxuICAvLyAgICAgLmpvaW4oXCJ0c3BhblwiKVxyXG4gIC8vICAgICAuYXR0cihcInhcIiwgMylcclxuICAvLyAgICAgLmF0dHIoXHJcbiAgLy8gICAgICAgXCJ5XCIsXHJcbiAgLy8gICAgICAgKGQsIGksIG5vZGVzKSA9PiBgJHsoaSA9PT0gbm9kZXMubGVuZ3RoIC0gMSkgKiAwLjMgKyAxLjEgKyBpICogMC45fWVtYFxyXG4gIC8vICAgICApXHJcbiAgLy8gICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIChkLCBpLCBub2RlcykgPT5cclxuICAvLyAgICAgICBpID09PSBub2Rlcy5sZW5ndGggLSAxID8gMC43IDogbnVsbFxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgLy8gLnRleHQoKGQpID0+IGQpO1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuICBsZWFmLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkKSA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgICBub2RlQ2xpY2soZXZlbnQsIGQuZGF0YS5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIHN2Zy5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDaEQsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUMxRSxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDMUUsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQ2hELFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDbkMsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUN0QixRQUFRO0FBQUEsUUFFUixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFDMUIsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEs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QzVCO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixX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LEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsVUFBVTtBQUFBLEVBQ1YsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsc0JBQXNCO0FBQUEsRUFDdEIsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsZUFBZTtBQUFBLEVBQ2YsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1Isa0JBQWtCO0FBQUEsRUFDbEIsWUFBWTtBQUFBLEVBQ1osY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsaUJBQWlCO0FBQUEsRUFDakIsbUJBQW1CO0FBQUEsRUFDbkIsaUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUEsRUFDakIsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsZUFBZTtBQUFBLEVBQ2YsV0FBVztBQUFBLEVBQ1gsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osUUFBUTtBQUFBLEVBQ1IsZUFBZTtBQUFBLEVBQ2YsS0FBSztBQUFBLEVBQ0wsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUFBLEVBQ2IsV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osUUFBUTtBQUFBLEVBQ1IsYUFBYTtBQUNmO0FBRUEsZUFBTyxPQUFPLE9BQU87QUFBQSxFQUNuQixNQUFNLFNBQVMsVUFBVTtBQUN2QixXQUFPLE9BQU8sT0FBTyxJQUFJLEtBQUssZUFBYSxNQUFNLFFBQVE7QUFBQSxFQUMzRDtBQUFBLEVBQ0EsYUFBYSxXQUFXO0FBQ3RCLFdBQU8sS0FBSyxJQUFJLEVBQUUsWUFBWTtBQUFBLEVBQ2hDO0FBQUEsRUFDQSxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxVQUFVO0FBQ1osQ0FBQztBQUVELDJCQUEyQjtBQUN6QixTQUFPLEtBQUssSUFBSSxFQUFFLFVBQVU7QUFDOUI7QUFFQSwyQkFBMkI7QUFDekIsU0FBTyxXQUFXLElBQUksRUFBRSxVQUFVO0FBQ3BDO0FBRUEsMkJBQTJCO0FBQ3pCLFNBQU8sS0FBSyxJQUFJLEVBQUUsVUFBVTtBQUM5QjtBQUVlLGVBQWUsU0FBUTtBQUNwQyxNQUFJLElBQUc7QUFDUCxZQUFVLFdBQVMsSUFBSSxLQUFLLEVBQUUsWUFBWTtBQUMxQyxTQUFRLE1BQUksTUFBTSxLQUFLLE9BQU0sS0FBTSxLQUFJLEdBQUUsR0FBRyxRQUFRLEtBQUksU0FBUyxHQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxLQUFLLEVBQUMsSUFDdEYsTUFBTSxJQUFJLElBQUksSUFBSyxNQUFLLElBQUksS0FBUSxNQUFLLElBQUksS0FBUSxNQUFLLElBQUksS0FBUSxLQUFJLEtBQVMsTUFBSSxPQUFRLElBQU0sS0FBSSxJQUFNLENBQUMsSUFDaEgsTUFBTSxJQUFJLEtBQUssTUFBSyxLQUFLLEtBQU0sTUFBSyxLQUFLLEtBQU0sTUFBSyxJQUFJLEtBQU8sTUFBSSxPQUFRLEdBQUksSUFDL0UsTUFBTSxJQUFJLEtBQU0sTUFBSyxLQUFLLEtBQVEsTUFBSyxJQUFJLEtBQVEsTUFBSyxJQUFJLEtBQVEsTUFBSyxJQUFJLEtBQVEsTUFBSyxJQUFJLEtBQVEsS0FBSSxLQUFVLE9BQUksT0FBUSxJQUFNLEtBQUksTUFBUSxHQUFJLElBQ3RKLFFBQ0MsTUFBSSxhQUFhLEtBQUssT0FBTSxLQUFLLElBQUksSUFBSSxHQUFFLElBQUksR0FBRSxJQUFJLEdBQUUsSUFBSSxDQUFDLElBQzVELE1BQUksYUFBYSxLQUFLLE9BQU0sS0FBSyxJQUFJLElBQUksR0FBRSxLQUFLLE1BQU0sS0FBSyxHQUFFLEtBQUssTUFBTSxLQUFLLEdBQUUsS0FBSyxNQUFNLEtBQUssQ0FBQyxJQUNoRyxNQUFJLGNBQWMsS0FBSyxPQUFNLEtBQUssS0FBSyxHQUFFLElBQUksR0FBRSxJQUFJLEdBQUUsSUFBSSxHQUFFLEVBQUUsSUFDN0QsTUFBSSxjQUFjLEtBQUssT0FBTSxLQUFLLEtBQUssR0FBRSxLQUFLLE1BQU0sS0FBSyxHQUFFLEtBQUssTUFBTSxLQUFLLEdBQUUsS0FBSyxNQUFNLEtBQUssR0FBRSxFQUFFLElBQ2pHLE1BQUksYUFBYSxLQUFLLE9BQU0sS0FBSyxLQUFLLEdBQUUsSUFBSSxHQUFFLEtBQUssS0FBSyxHQUFFLEtBQUssS0FBSyxDQUFDLElBQ3JFLE1BQUksY0FBYyxLQUFLLE9BQU0sS0FBSyxLQUFLLEdBQUUsSUFBSSxHQUFFLEtBQUssS0FBSyxHQUFFLEtBQUssS0FBSyxHQUFFLEVBQUUsSUFDMUUsTUFBTSxlQUFlLE9BQU0sSUFBSSxLQUFLLE1BQU0sUUFBTyxJQUNqRCxZQUFXLGdCQUFnQixJQUFJLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUNuRDtBQUNSO0FBRUEsY0FBYyxHQUFHO0FBQ2YsU0FBTyxJQUFJLElBQUksS0FBSyxLQUFLLEtBQU0sS0FBSyxJQUFJLEtBQU0sSUFBSSxLQUFNLENBQUM7QUFDM0Q7QUFFQSxjQUFjLEdBQUcsR0FBRyxHQUFHLElBQUc7QUFDeEIsTUFBSSxNQUFLO0FBQUcsUUFBSSxJQUFJLElBQUk7QUFDeEIsU0FBTyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBQztBQUMzQjtBQUVPLG9CQUFvQixHQUFHO0FBQzVCLE1BQUksQ0FBRSxjQUFhO0FBQVEsUUFBSSxNQUFNLENBQUM7QUFDdEMsTUFBSSxDQUFDO0FBQUcsV0FBTyxJQUFJO0FBQ25CLE1BQUksRUFBRSxJQUFJO0FBQ1YsU0FBTyxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPO0FBQ3pDO0FBRU8sYUFBYSxHQUFHLEdBQUcsR0FBRyxTQUFTO0FBQ3BDLFNBQU8sVUFBVSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLFdBQVcsT0FBTyxJQUFJLE9BQU87QUFDaEc7QUFFTyxhQUFhLEdBQUcsR0FBRyxHQUFHLFNBQVM7QUFDcEMsT0FBSyxJQUFJLENBQUM7QUFDVixPQUFLLElBQUksQ0FBQztBQUNWLE9BQUssSUFBSSxDQUFDO0FBQ1YsT0FBSyxVQUFVLENBQUM7QUFDbEI7QUFFQSxlQUFPLEtBQUssS0FBSyxPQUFPLE9BQU87QUFBQSxFQUM3QixVQUFVLFNBQVMsR0FBRztBQUNwQixRQUFJLEtBQUssT0FBTyxXQUFXLEtBQUssSUFBSSxVQUFVLENBQUM7QUFDL0MsV0FBTyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPO0FBQUEsRUFDakU7QUFBQSxFQUNBLFFBQVEsU0FBUyxHQUFHO0FBQ2xCLFFBQUksS0FBSyxPQUFPLFNBQVMsS0FBSyxJQUFJLFFBQVEsQ0FBQztBQUMzQyxXQUFPLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU87QUFBQSxFQUNqRTtBQUFBLEVBQ0EsS0FBSyxXQUFXO0FBQ2QsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLGFBQWEsV0FBVztBQUN0QixXQUFRLFFBQVEsS0FBSyxLQUFLLEtBQUssSUFBSSxTQUMzQixTQUFRLEtBQUssS0FBSyxLQUFLLElBQUksVUFDM0IsU0FBUSxLQUFLLEtBQUssS0FBSyxJQUFJLFVBQzNCLE1BQUssS0FBSyxXQUFXLEtBQUssV0FBVztBQUFBLEVBQy9DO0FBQUEsRUFDQSxLQUFLO0FBQUEsRUFDTCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxVQUFVO0FBQ1osQ0FBQyxDQUFDO0FBRUYseUJBQXlCO0FBQ3ZCLFNBQU8sTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7QUFDckQ7QUFFQSx5QkFBeUI7QUFDdkIsTUFBSSxLQUFJLEtBQUs7QUFBUyxPQUFJLE1BQU0sRUFBQyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBQyxDQUFDO0FBQ25FLFNBQVEsUUFBTSxJQUFJLFNBQVMsV0FDckIsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLE9BQ3RELEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxPQUN0RCxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQ2pELFFBQU0sSUFBSSxNQUFNLE9BQU8sS0FBSTtBQUNwQztBQUVBLGFBQWEsT0FBTztBQUNsQixVQUFRLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3pELFNBQVEsU0FBUSxLQUFLLE1BQU0sTUFBTSxNQUFNLFNBQVMsRUFBRTtBQUNwRDtBQUVBLGNBQWMsR0FBRyxHQUFHLEdBQUcsSUFBRztBQUN4QixNQUFJLE1BQUs7QUFBRyxRQUFJLElBQUksSUFBSTtBQUFBLFdBQ2YsS0FBSyxLQUFLLEtBQUs7QUFBRyxRQUFJLElBQUk7QUFBQSxXQUMxQixLQUFLO0FBQUcsUUFBSTtBQUNyQixTQUFPLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFDO0FBQzNCO0FBRU8sb0JBQW9CLEdBQUc7QUFDNUIsTUFBSSxhQUFhO0FBQUssV0FBTyxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPO0FBQzdELE1BQUksQ0FBRSxjQUFhO0FBQVEsUUFBSSxNQUFNLENBQUM7QUFDdEMsTUFBSSxDQUFDO0FBQUcsV0FBTyxJQUFJO0FBQ25CLE1BQUksYUFBYTtBQUFLLFdBQU87QUFDN0IsTUFBSSxFQUFFLElBQUk7QUFDVixNQUFJLElBQUksRUFBRSxJQUFJLEtBQ1YsSUFBSSxFQUFFLElBQUksS0FDVixJQUFJLEVBQUUsSUFBSSxLQUNWLE9BQU0sS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQ3RCLE9BQU0sS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQ3RCLElBQUksS0FDSixJQUFJLE9BQU0sTUFDVixJQUFLLFFBQU0sUUFBTztBQUN0QixNQUFJLEdBQUc7QUFDTCxRQUFJLE1BQU07QUFBSyxVQUFLLEtBQUksS0FBSyxJQUFLLEtBQUksS0FBSztBQUFBLGFBQ2xDLE1BQU07QUFBSyxVQUFLLEtBQUksS0FBSyxJQUFJO0FBQUE7QUFDakMsVUFBSyxLQUFJLEtBQUssSUFBSTtBQUN2QixTQUFLLElBQUksTUFBTSxPQUFNLE9BQU0sSUFBSSxPQUFNO0FBQ3JDLFNBQUs7QUFBQSxFQUNQLE9BQU87QUFDTCxRQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSTtBQUFBLEVBQzNCO0FBQ0EsU0FBTyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPO0FBQ25DO0FBRU8sYUFBYSxHQUFHLEdBQUcsR0FBRyxTQUFTO0FBQ3BDLFNBQU8sVUFBVSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLFdBQVcsT0FBTyxJQUFJLE9BQU87QUFDaEc7QUFFQSxhQUFhLEdBQUcsR0FBRyxHQUFHLFNBQVM7QUFDN0IsT0FBSyxJQUFJLENBQUM7QUFDVixPQUFLLElBQUksQ0FBQztBQUNWLE9BQUssSUFBSSxDQUFDO0FBQ1YsT0FBSyxVQUFVLENBQUM7QUFDbEI7QUFFQSxlQUFPLEtBQUssS0FBSyxPQUFPLE9BQU87QUFBQSxFQUM3QixVQUFVLFNBQVMsR0FBRztBQUNwQixRQUFJLEtBQUssT0FBTyxXQUFXLEtBQUssSUFBSSxVQUFVLENBQUM7QUFDL0MsV0FBTyxJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU87QUFBQSxFQUN6RDtBQUFBLEVBQ0EsUUFBUSxTQUFTLEdBQUc7QUFDbEIsUUFBSSxLQUFLLE9BQU8sU0FBUyxLQUFLLElBQUksUUFBUSxDQUFDO0FBQzNDLFdBQU8sSUFBSSxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPO0FBQUEsRUFDekQ7QUFBQSxFQUNBLEtBQUssV0FBVztBQUNkLFFBQUksSUFBSSxLQUFLLElBQUksTUFBTyxNQUFLLElBQUksS0FBSyxLQUNsQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLEdBQ3pDLElBQUksS0FBSyxHQUNULEtBQUssSUFBSyxLQUFJLE1BQU0sSUFBSSxJQUFJLEtBQUssR0FDakMsS0FBSyxJQUFJLElBQUk7QUFDakIsV0FBTyxJQUFJLElBQ1QsUUFBUSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLEVBQUUsR0FDNUMsUUFBUSxHQUFHLElBQUksRUFBRSxHQUNqQixRQUFRLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksRUFBRSxHQUMzQyxLQUFLLE9BQ1A7QUFBQSxFQUNGO0FBQUEsRUFDQSxhQUFhLFdBQVc7QUFDdEIsV0FBUSxNQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssQ0FBQyxNQUMxQyxNQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssTUFDekIsTUFBSyxLQUFLLFdBQVcsS0FBSyxXQUFXO0FBQUEsRUFDL0M7QUFBQSxFQUNBLFdBQVcsV0FBVztBQUNwQixRQUFJLEtBQUksS0FBSztBQUFTLFNBQUksTUFBTSxFQUFDLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxFQUFDLENBQUM7QUFDbkUsV0FBUSxRQUFNLElBQUksU0FBUyxXQUNwQixNQUFLLEtBQUssS0FBSyxPQUNmLE1BQUssS0FBSyxLQUFLLE1BQU0sUUFDckIsTUFBSyxLQUFLLEtBQUssTUFBTSxNQUNyQixRQUFNLElBQUksTUFBTSxPQUFPLEtBQUk7QUFBQSxFQUNwQztBQUNGLENBQUMsQ0FBQztBQUdGLGlCQUFpQixHQUFHLElBQUksSUFBSTtBQUMxQixTQUFRLEtBQUksS0FBSyxLQUFNLE1BQUssTUFBTSxJQUFJLEtBQ2hDLElBQUksTUFBTSxLQUNWLElBQUksTUFBTSxLQUFNLE1BQUssTUFBTyxPQUFNLEtBQUssS0FDdkMsTUFBTTtBQUNkOzs7QUNsWE8sSUFBTSxVQUFVLEtBQUssS0FBSztBQUMxQixJQUFNLFVBQVUsTUFBTSxLQUFLOzs7QUNHbEMsSUFBSSxJQUFJO0FBQVIsSUFDSSxJQUFJO0FBRFIsSUFFSSxJQUFJO0FBRlIsSUFHSSxJQUFJO0FBSFIsSUFJSSxJQUFJO0FBSlIsSUFLSSxLQUFLLElBQUk7QUFMYixJQU1JLEtBQUssSUFBSTtBQU5iLElBT0ksUUFBUSxJQUFJLElBQUksSUFBSTtBQUV4QiwwQkFBMEIsR0FBRztBQUMzQixNQUFJLGFBQWE7QUFBVyxXQUFPLElBQUksVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU87QUFDekUsTUFBSSxDQUFFLGNBQWE7QUFBTSxRQUFJLFdBQVcsQ0FBQztBQUN6QyxNQUFJLElBQUksRUFBRSxJQUFJLEtBQ1YsSUFBSSxFQUFFLElBQUksS0FDVixJQUFJLEVBQUUsSUFBSSxLQUNWLElBQUssU0FBUSxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQU0sU0FBUSxLQUFLLEtBQ2xELEtBQUssSUFBSSxHQUNULElBQUssS0FBSyxLQUFJLEtBQUssSUFBSSxNQUFNLEdBQzdCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSyxLQUFJLElBQUssS0FBSSxLQUMvQyxJQUFJLElBQUksS0FBSyxNQUFNLEdBQUcsRUFBRSxJQUFJLFVBQVUsTUFBTTtBQUNoRCxTQUFPLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsT0FBTztBQUMzRDtBQUVlLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxTQUFTO0FBQ2xELFNBQU8sVUFBVSxXQUFXLElBQUksaUJBQWlCLENBQUMsSUFBSSxJQUFJLFVBQVUsR0FBRyxHQUFHLEdBQUcsV0FBVyxPQUFPLElBQUksT0FBTztBQUM1RztBQUVPLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxTQUFTO0FBQzFDLE9BQUssSUFBSSxDQUFDO0FBQ1YsT0FBSyxJQUFJLENBQUM7QUFDVixPQUFLLElBQUksQ0FBQztBQUNWLE9BQUssVUFBVSxDQUFDO0FBQ2xCO0FBRUEsZUFBTyxXQUFXLFdBQVcsT0FBTyxPQUFPO0FBQUEsRUFDekMsVUFBVSxTQUFTLEdBQUc7QUFDcEIsUUFBSSxLQUFLLE9BQU8sV0FBVyxLQUFLLElBQUksVUFBVSxDQUFDO0FBQy9DLFdBQU8sSUFBSSxVQUFVLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxPQUFPO0FBQUEsRUFDL0Q7QUFBQSxFQUNBLFFBQVEsU0FBUyxHQUFHO0FBQ2xCLFFBQUksS0FBSyxPQUFPLFNBQVMsS0FBSyxJQUFJLFFBQVEsQ0FBQztBQUMzQyxXQUFPLElBQUksVUFBVSxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssT0FBTztBQUFBLEVBQy9EO0FBQUEsRUFDQSxLQUFLLFdBQVc7QUFDZCxRQUFJLElBQUksTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFLLE1BQUssSUFBSSxPQUFPLFNBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQ1YsS0FBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUssS0FBSSxJQUMxQyxRQUFPLEtBQUssSUFBSSxDQUFDLEdBQ2pCLFFBQU8sS0FBSyxJQUFJLENBQUM7QUFDckIsV0FBTyxJQUFJLElBQ1QsTUFBTyxLQUFJLEtBQUssS0FBSSxRQUFPLElBQUksU0FDL0IsTUFBTyxLQUFJLEtBQUssS0FBSSxRQUFPLElBQUksU0FDL0IsTUFBTyxLQUFJLEtBQUssS0FBSSxTQUNwQixLQUFLLE9BQ1A7QUFBQSxFQUNGO0FBQ0YsQ0FBQyxDQUFDOzs7QUM1REssZUFBZSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDeEMsTUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFDNUIsU0FBUyxNQUFJLElBQUksS0FBSyxJQUFJLEtBQUssTUFBTSxLQUM5QixLQUFJLElBQUksS0FBSyxJQUFJLE1BQU0sS0FDdkIsS0FBSSxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxLQUNqQyxLQUFLLE1BQU07QUFDbkI7QUFFZSx1QkFBUyxRQUFRO0FBQzlCLE1BQUksSUFBSSxPQUFPLFNBQVM7QUFDeEIsU0FBTyxTQUFTLEdBQUc7QUFDakIsUUFBSSxJQUFJLEtBQUssSUFBSyxJQUFJLElBQUssS0FBSyxJQUFLLEtBQUksR0FBRyxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksQ0FBQyxHQUNqRSxLQUFLLE9BQU8sSUFDWixLQUFLLE9BQU8sSUFBSSxJQUNoQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLEtBQUssSUFDdEMsS0FBSyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJLEtBQUs7QUFDOUMsV0FBTyxNQUFPLEtBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRTtBQUFBLEVBQzlDO0FBQ0Y7OztBQ2hCZSw2QkFBUyxRQUFRO0FBQzlCLE1BQUksSUFBSSxPQUFPO0FBQ2YsU0FBTyxTQUFTLEdBQUc7QUFDakIsUUFBSSxJQUFJLEtBQUssTUFBUSxPQUFLLEtBQUssSUFBSSxFQUFFLElBQUksS0FBSyxDQUFDLEdBQzNDLEtBQUssT0FBUSxLQUFJLElBQUksS0FBSyxJQUMxQixLQUFLLE9BQU8sSUFBSSxJQUNoQixLQUFLLE9BQVEsS0FBSSxLQUFLLElBQ3RCLEtBQUssT0FBUSxLQUFJLEtBQUs7QUFDMUIsV0FBTyxNQUFPLEtBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRTtBQUFBLEVBQzlDO0FBQ0Y7OztBQ1pBLElBQU8sb0JBQVEsUUFBSyxNQUFNOzs7QUNFMUIsZ0JBQWdCLElBQUcsR0FBRztBQUNwQixTQUFPLFNBQVMsR0FBRztBQUNqQixXQUFPLEtBQUksSUFBSTtBQUFBLEVBQ2pCO0FBQ0Y7QUFFQSxxQkFBcUIsSUFBRyxHQUFHLElBQUc7QUFDNUIsU0FBTyxLQUFJLEtBQUssSUFBSSxJQUFHLEVBQUMsR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUMsSUFBSSxJQUFHLEtBQUksSUFBSSxJQUFHLFNBQVMsR0FBRztBQUN4RSxXQUFPLEtBQUssSUFBSSxLQUFJLElBQUksR0FBRyxFQUFDO0FBQUEsRUFDOUI7QUFDRjtBQUVPLGFBQWEsSUFBRyxHQUFHO0FBQ3hCLE1BQUksSUFBSSxJQUFJO0FBQ1osU0FBTyxJQUFJLE9BQU8sSUFBRyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLGtCQUFTLE1BQU0sRUFBQyxJQUFJLElBQUksRUFBQztBQUMzRztBQUVPLGVBQWUsSUFBRztBQUN2QixTQUFRLE1BQUksQ0FBQyxRQUFPLElBQUksVUFBVSxTQUFTLElBQUcsR0FBRztBQUMvQyxXQUFPLElBQUksS0FBSSxZQUFZLElBQUcsR0FBRyxFQUFDLElBQUksa0JBQVMsTUFBTSxFQUFDLElBQUksSUFBSSxFQUFDO0FBQUEsRUFDakU7QUFDRjtBQUVlLGlCQUFpQixJQUFHLEdBQUc7QUFDcEMsTUFBSSxJQUFJLElBQUk7QUFDWixTQUFPLElBQUksT0FBTyxJQUFHLENBQUMsSUFBSSxrQkFBUyxNQUFNLEVBQUMsSUFBSSxJQUFJLEVBQUM7QUFDckQ7OztBQ3ZCQSxJQUFPLGNBQVMsa0JBQWtCLElBQUc7QUFDbkMsTUFBSSxTQUFRLE1BQU0sRUFBQztBQUVuQixnQkFBYSxRQUFPLEtBQUs7QUFDdkIsUUFBSSxJQUFJLE9BQU8sVUFBUSxJQUFTLE1BQUssR0FBRyxHQUFJLE9BQU0sSUFBUyxHQUFHLEdBQUcsQ0FBQyxHQUM5RCxJQUFJLE9BQU0sT0FBTSxHQUFHLElBQUksQ0FBQyxHQUN4QixJQUFJLE9BQU0sT0FBTSxHQUFHLElBQUksQ0FBQyxHQUN4QixVQUFVLFFBQVEsT0FBTSxTQUFTLElBQUksT0FBTztBQUNoRCxXQUFPLFNBQVMsR0FBRztBQUNqQixhQUFNLElBQUksRUFBRSxDQUFDO0FBQ2IsYUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNiLGFBQU0sSUFBSSxFQUFFLENBQUM7QUFDYixhQUFNLFVBQVUsUUFBUSxDQUFDO0FBQ3pCLGFBQU8sU0FBUTtBQUFBLElBQ2pCO0FBQUEsRUFDRjtBQUVBLE9BQUksUUFBUTtBQUVaLFNBQU87QUFDVCxFQUFHLENBQUM7QUFFSixtQkFBbUIsUUFBUTtBQUN6QixTQUFPLFNBQVMsUUFBUTtBQUN0QixRQUFJLElBQUksT0FBTyxRQUNYLElBQUksSUFBSSxNQUFNLENBQUMsR0FDZixJQUFJLElBQUksTUFBTSxDQUFDLEdBQ2YsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUNmLEdBQUc7QUFDUCxTQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ3RCLGVBQVEsSUFBUyxPQUFPLEVBQUU7QUFDMUIsUUFBRSxLQUFLLE9BQU0sS0FBSztBQUNsQixRQUFFLEtBQUssT0FBTSxLQUFLO0FBQ2xCLFFBQUUsS0FBSyxPQUFNLEtBQUs7QUFBQSxJQUNwQjtBQUNBLFFBQUksT0FBTyxDQUFDO0FBQ1osUUFBSSxPQUFPLENBQUM7QUFDWixRQUFJLE9BQU8sQ0FBQztBQUNaLFdBQU0sVUFBVTtBQUNoQixXQUFPLFNBQVMsR0FBRztBQUNqQixhQUFNLElBQUksRUFBRSxDQUFDO0FBQ2IsYUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNiLGFBQU0sSUFBSSxFQUFFLENBQUM7QUFDYixhQUFPLFNBQVE7QUFBQSxJQUNqQjtBQUFBLEVBQ0Y7QUFDRjtBQUVPLElBQUksV0FBVyxVQUFVLGFBQUs7QUFDOUIsSUFBSSxpQkFBaUIsVUFBVSxtQkFBVzs7O0FDdERsQyw2QkFBUyxJQUFHLEdBQUc7QUFDNUIsTUFBSSxDQUFDO0FBQUcsUUFBSSxDQUFDO0FBQ2IsTUFBSSxJQUFJLEtBQUksS0FBSyxJQUFJLEVBQUUsUUFBUSxHQUFFLE1BQU0sSUFBSSxHQUN2QyxLQUFJLEVBQUUsTUFBTSxHQUNaO0FBQ0osU0FBTyxTQUFTLEdBQUc7QUFDakIsU0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7QUFBRyxTQUFFLEtBQUssR0FBRSxLQUFNLEtBQUksS0FBSyxFQUFFLEtBQUs7QUFDdkQsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVPLHVCQUF1QixJQUFHO0FBQy9CLFNBQU8sWUFBWSxPQUFPLEVBQUMsS0FBSyxDQUFFLGVBQWE7QUFDakQ7OztBQ05PLHNCQUFzQixJQUFHLEdBQUc7QUFDakMsTUFBSSxLQUFLLElBQUksRUFBRSxTQUFTLEdBQ3BCLEtBQUssS0FBSSxLQUFLLElBQUksSUFBSSxHQUFFLE1BQU0sSUFBSSxHQUNsQyxLQUFJLElBQUksTUFBTSxFQUFFLEdBQ2hCLEtBQUksSUFBSSxNQUFNLEVBQUUsR0FDaEI7QUFFSixPQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtBQUFHLE9BQUUsS0FBSyxjQUFNLEdBQUUsSUFBSSxFQUFFLEVBQUU7QUFDaEQsU0FBTyxJQUFJLElBQUksRUFBRTtBQUFHLE9BQUUsS0FBSyxFQUFFO0FBRTdCLFNBQU8sU0FBUyxHQUFHO0FBQ2pCLFNBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO0FBQUcsU0FBRSxLQUFLLEdBQUUsR0FBRyxDQUFDO0FBQ3RDLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3JCZSxzQkFBUyxJQUFHLEdBQUc7QUFDNUIsTUFBSSxJQUFJLElBQUk7QUFDWixTQUFPLEtBQUksQ0FBQyxJQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRztBQUNqQyxXQUFPLEVBQUUsUUFBUSxLQUFLLEtBQUksS0FBSyxJQUFJLENBQUMsR0FBRztBQUFBLEVBQ3pDO0FBQ0Y7OztBQ0xlLHlCQUFTLElBQUcsR0FBRztBQUM1QixTQUFPLEtBQUksQ0FBQyxJQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRztBQUNqQyxXQUFPLEtBQUssS0FBSSxLQUFLLElBQUk7QUFBQSxFQUMzQjtBQUNGOzs7QUNGZSx3QkFBUyxJQUFHLEdBQUc7QUFDNUIsTUFBSSxJQUFJLENBQUMsR0FDTCxLQUFJLENBQUMsR0FDTDtBQUVKLE1BQUksT0FBTSxRQUFRLE9BQU8sT0FBTTtBQUFVLFNBQUksQ0FBQztBQUM5QyxNQUFJLE1BQU0sUUFBUSxPQUFPLE1BQU07QUFBVSxRQUFJLENBQUM7QUFFOUMsT0FBSyxLQUFLLEdBQUc7QUFDWCxRQUFJLEtBQUssSUFBRztBQUNWLFFBQUUsS0FBSyxjQUFNLEdBQUUsSUFBSSxFQUFFLEVBQUU7QUFBQSxJQUN6QixPQUFPO0FBQ0wsU0FBRSxLQUFLLEVBQUU7QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUVBLFNBQU8sU0FBUyxHQUFHO0FBQ2pCLFNBQUssS0FBSztBQUFHLFNBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNwQkEsSUFBSSxNQUFNO0FBQVYsSUFDSSxNQUFNLElBQUksT0FBTyxJQUFJLFFBQVEsR0FBRztBQUVwQyxjQUFjLEdBQUc7QUFDZixTQUFPLFdBQVc7QUFDaEIsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLGFBQWEsR0FBRztBQUNkLFNBQU8sU0FBUyxHQUFHO0FBQ2pCLFdBQU8sRUFBRSxDQUFDLElBQUk7QUFBQSxFQUNoQjtBQUNGO0FBRWUsd0JBQVMsSUFBRyxHQUFHO0FBQzVCLE1BQUksS0FBSyxJQUFJLFlBQVksSUFBSSxZQUFZLEdBQ3JDLElBQ0EsSUFDQSxJQUNBLElBQUksSUFDSixJQUFJLENBQUMsR0FDTCxJQUFJLENBQUM7QUFHVCxPQUFJLEtBQUksSUFBSSxJQUFJLElBQUk7QUFHcEIsU0FBUSxNQUFLLElBQUksS0FBSyxFQUFDLE1BQ2YsTUFBSyxJQUFJLEtBQUssQ0FBQyxJQUFJO0FBQ3pCLFFBQUssTUFBSyxHQUFHLFNBQVMsSUFBSTtBQUN4QixXQUFLLEVBQUUsTUFBTSxJQUFJLEVBQUU7QUFDbkIsVUFBSSxFQUFFO0FBQUksVUFBRSxNQUFNO0FBQUE7QUFDYixVQUFFLEVBQUUsS0FBSztBQUFBLElBQ2hCO0FBQ0EsUUFBSyxNQUFLLEdBQUcsUUFBUyxNQUFLLEdBQUcsS0FBSztBQUNqQyxVQUFJLEVBQUU7QUFBSSxVQUFFLE1BQU07QUFBQTtBQUNiLFVBQUUsRUFBRSxLQUFLO0FBQUEsSUFDaEIsT0FBTztBQUNMLFFBQUUsRUFBRSxLQUFLO0FBQ1QsUUFBRSxLQUFLLEVBQUMsR0FBTSxHQUFHLGdCQUFPLElBQUksRUFBRSxFQUFDLENBQUM7QUFBQSxJQUNsQztBQUNBLFNBQUssSUFBSTtBQUFBLEVBQ1g7QUFHQSxNQUFJLEtBQUssRUFBRSxRQUFRO0FBQ2pCLFNBQUssRUFBRSxNQUFNLEVBQUU7QUFDZixRQUFJLEVBQUU7QUFBSSxRQUFFLE1BQU07QUFBQTtBQUNiLFFBQUUsRUFBRSxLQUFLO0FBQUEsRUFDaEI7QUFJQSxTQUFPLEVBQUUsU0FBUyxJQUFLLEVBQUUsS0FDbkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUNWLEtBQUssQ0FBQyxJQUNMLEtBQUksRUFBRSxRQUFRLFNBQVMsR0FBRztBQUN6QixhQUFTLEtBQUksR0FBRyxHQUFHLEtBQUksR0FBRyxFQUFFO0FBQUcsUUFBRyxLQUFJLEVBQUUsS0FBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQ3RELFdBQU8sRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUNsQjtBQUNSOzs7QUNyRGUsdUJBQVMsSUFBRyxHQUFHO0FBQzVCLE1BQUksSUFBSSxPQUFPLEdBQUc7QUFDbEIsU0FBTyxLQUFLLFFBQVEsTUFBTSxZQUFZLGtCQUFTLENBQUMsSUFDekMsT0FBTSxXQUFXLGtCQUNsQixNQUFNLFdBQWEsTUFBSSxNQUFNLENBQUMsS0FBTSxLQUFJLElBQUcsZUFBTyxpQkFDbEQsYUFBYSxRQUFRLGNBQ3JCLGFBQWEsT0FBTyxlQUNwQixjQUFjLENBQUMsSUFBSSxzQkFDbkIsTUFBTSxRQUFRLENBQUMsSUFBSSxlQUNuQixPQUFPLEVBQUUsWUFBWSxjQUFjLE9BQU8sRUFBRSxhQUFhLGNBQWMsTUFBTSxDQUFDLElBQUksaUJBQ2xGLGlCQUFRLElBQUcsQ0FBQztBQUNwQjs7O0FDckJlLHVCQUFTLElBQUcsR0FBRztBQUM1QixTQUFPLEtBQUksQ0FBQyxJQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRztBQUNqQyxXQUFPLEtBQUssTUFBTSxLQUFLLEtBQUksS0FBSyxJQUFJLENBQUM7QUFBQSxFQUN2QztBQUNGOzs7QUNKQSxJQUFJLFdBQVUsTUFBTSxLQUFLO0FBRWxCLElBQUksV0FBVztBQUFBLEVBQ3BCLFlBQVk7QUFBQSxFQUNaLFlBQVk7QUFBQSxFQUNaLFFBQVE7QUFBQSxFQUNSLE9BQU87QUFBQSxFQUNQLFFBQVE7QUFBQSxFQUNSLFFBQVE7QUFDVjtBQUVlLDJCQUFTLElBQUcsR0FBRyxJQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ3hDLE1BQUksUUFBUSxRQUFRO0FBQ3BCLE1BQUksU0FBUyxLQUFLLEtBQUssS0FBSSxLQUFJLElBQUksQ0FBQztBQUFHLFVBQUssUUFBUSxLQUFLO0FBQ3pELE1BQUksUUFBUSxLQUFJLEtBQUksSUFBSTtBQUFHLFVBQUssS0FBSSxPQUFPLEtBQUssSUFBSTtBQUNwRCxNQUFJLFNBQVMsS0FBSyxLQUFLLEtBQUksS0FBSSxJQUFJLENBQUM7QUFBRyxVQUFLLFFBQVEsS0FBSyxRQUFRLFNBQVM7QUFDMUUsTUFBSSxLQUFJLElBQUksSUFBSTtBQUFHLFNBQUksQ0FBQyxJQUFHLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLFNBQVMsQ0FBQztBQUM3RCxTQUFPO0FBQUEsSUFDTCxZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsSUFDWixRQUFRLEtBQUssTUFBTSxHQUFHLEVBQUMsSUFBSTtBQUFBLElBQzNCLE9BQU8sS0FBSyxLQUFLLEtBQUssSUFBSTtBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRjs7O0FDdkJBLElBQUk7QUFHRyxrQkFBa0IsT0FBTztBQUM5QixRQUFNLEtBQUksSUFBSyxRQUFPLGNBQWMsYUFBYSxZQUFZLGlCQUFpQixRQUFRLEVBQUU7QUFDeEYsU0FBTyxHQUFFLGFBQWEsV0FBVyxrQkFBVSxHQUFFLEdBQUcsR0FBRSxHQUFHLEdBQUUsR0FBRyxHQUFFLEdBQUcsR0FBRSxHQUFHLEdBQUUsQ0FBQztBQUN6RTtBQUVPLGtCQUFrQixPQUFPO0FBQzlCLE1BQUksU0FBUztBQUFNLFdBQU87QUFDMUIsTUFBSSxDQUFDO0FBQVMsY0FBVSxTQUFTLGdCQUFnQiw4QkFBOEIsR0FBRztBQUNsRixVQUFRLGFBQWEsYUFBYSxLQUFLO0FBQ3ZDLE1BQUksQ0FBRSxTQUFRLFFBQVEsVUFBVSxRQUFRLFlBQVk7QUFBSSxXQUFPO0FBQy9ELFVBQVEsTUFBTTtBQUNkLFNBQU8sa0JBQVUsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDdkU7OztBQ2RBLDhCQUE4QixPQUFPLFNBQVMsU0FBUyxVQUFVO0FBRS9ELGVBQWEsR0FBRztBQUNkLFdBQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLE1BQU07QUFBQSxFQUNwQztBQUVBLHFCQUFtQixJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRztBQUN2QyxRQUFJLE9BQU8sTUFBTSxPQUFPLElBQUk7QUFDMUIsVUFBSSxJQUFJLEVBQUUsS0FBSyxjQUFjLE1BQU0sU0FBUyxNQUFNLE9BQU87QUFDekQsUUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxnQkFBTyxJQUFJLEVBQUUsRUFBQyxHQUFHLEVBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxnQkFBTyxJQUFJLEVBQUUsRUFBQyxDQUFDO0FBQUEsSUFDckUsV0FBVyxNQUFNLElBQUk7QUFDbkIsUUFBRSxLQUFLLGVBQWUsS0FBSyxVQUFVLEtBQUssT0FBTztBQUFBLElBQ25EO0FBQUEsRUFDRjtBQUVBLGtCQUFnQixJQUFHLEdBQUcsR0FBRyxHQUFHO0FBQzFCLFFBQUksT0FBTSxHQUFHO0FBQ1gsVUFBSSxLQUFJLElBQUk7QUFBSyxhQUFLO0FBQUEsZUFBYyxJQUFJLEtBQUk7QUFBSyxjQUFLO0FBQ3RELFFBQUUsS0FBSyxFQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLFdBQVcsTUFBTSxRQUFRLElBQUksR0FBRyxHQUFHLGdCQUFPLElBQUcsQ0FBQyxFQUFDLENBQUM7QUFBQSxJQUM3RSxXQUFXLEdBQUc7QUFDWixRQUFFLEtBQUssSUFBSSxDQUFDLElBQUksWUFBWSxJQUFJLFFBQVE7QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFFQSxpQkFBZSxJQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ3pCLFFBQUksT0FBTSxHQUFHO0FBQ1gsUUFBRSxLQUFLLEVBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksVUFBVSxNQUFNLFFBQVEsSUFBSSxHQUFHLEdBQUcsZ0JBQU8sSUFBRyxDQUFDLEVBQUMsQ0FBQztBQUFBLElBQzVFLFdBQVcsR0FBRztBQUNaLFFBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxXQUFXLElBQUksUUFBUTtBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUVBLGlCQUFlLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHO0FBQ25DLFFBQUksT0FBTyxNQUFNLE9BQU8sSUFBSTtBQUMxQixVQUFJLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLFVBQVUsTUFBTSxLQUFLLE1BQU0sR0FBRztBQUN0RCxRQUFFLEtBQUssRUFBQyxHQUFHLElBQUksR0FBRyxHQUFHLGdCQUFPLElBQUksRUFBRSxFQUFDLEdBQUcsRUFBQyxHQUFHLElBQUksR0FBRyxHQUFHLGdCQUFPLElBQUksRUFBRSxFQUFDLENBQUM7QUFBQSxJQUNyRSxXQUFXLE9BQU8sS0FBSyxPQUFPLEdBQUc7QUFDL0IsUUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLFdBQVcsS0FBSyxNQUFNLEtBQUssR0FBRztBQUFBLElBQ2hEO0FBQUEsRUFDRjtBQUVBLFNBQU8sU0FBUyxJQUFHLEdBQUc7QUFDcEIsUUFBSSxJQUFJLENBQUMsR0FDTCxJQUFJLENBQUM7QUFDVCxTQUFJLE1BQU0sRUFBQyxHQUFHLElBQUksTUFBTSxDQUFDO0FBQ3pCLGNBQVUsR0FBRSxZQUFZLEdBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEdBQUcsQ0FBQztBQUN0RSxXQUFPLEdBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxDQUFDO0FBQy9CLFVBQU0sR0FBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDNUIsVUFBTSxHQUFFLFFBQVEsR0FBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxDQUFDO0FBQ2xELFNBQUksSUFBSTtBQUNSLFdBQU8sU0FBUyxHQUFHO0FBQ2pCLFVBQUksSUFBSSxJQUFJLElBQUksRUFBRSxRQUFRO0FBQzFCLGFBQU8sRUFBRSxJQUFJO0FBQUcsVUFBRyxLQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQ3ZDLGFBQU8sRUFBRSxLQUFLLEVBQUU7QUFBQSxJQUNsQjtBQUFBLEVBQ0Y7QUFDRjtBQUVPLElBQUksMEJBQTBCLHFCQUFxQixVQUFVLFFBQVEsT0FBTyxNQUFNO0FBQ2xGLElBQUksMEJBQTBCLHFCQUFxQixVQUFVLE1BQU0sS0FBSyxHQUFHOzs7QUM5RGxGLElBQUksV0FBVztBQUVmLGNBQWMsSUFBRztBQUNmLFNBQVMsT0FBSSxLQUFLLElBQUksRUFBQyxLQUFLLElBQUksTUFBSztBQUN2QztBQUVBLGNBQWMsSUFBRztBQUNmLFNBQVMsT0FBSSxLQUFLLElBQUksRUFBQyxLQUFLLElBQUksTUFBSztBQUN2QztBQUVBLGNBQWMsSUFBRztBQUNmLFNBQVMsT0FBSSxLQUFLLElBQUksSUFBSSxFQUFDLEtBQUssS0FBTSxNQUFJO0FBQzVDO0FBRUEsSUFBTyxlQUFTLGlCQUFpQixLQUFLLE1BQU0sTUFBTTtBQUloRCxnQkFBYyxJQUFJLElBQUk7QUFDcEIsUUFBSSxNQUFNLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFDbEMsTUFBTSxHQUFHLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxHQUFHLElBQ2xDLEtBQUssTUFBTSxLQUNYLEtBQUssTUFBTSxLQUNYLEtBQUssS0FBSyxLQUFLLEtBQUssSUFDcEIsR0FDQTtBQUdKLFFBQUksS0FBSyxVQUFVO0FBQ2pCLFVBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJO0FBQ3hCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTztBQUFBLFVBQ0wsTUFBTSxJQUFJO0FBQUEsVUFDVixNQUFNLElBQUk7QUFBQSxVQUNWLEtBQUssS0FBSyxJQUFJLE1BQU0sSUFBSSxDQUFDO0FBQUEsUUFDM0I7QUFBQSxNQUNGO0FBQUEsSUFDRixPQUdLO0FBQ0gsVUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFLEdBQ2pCLEtBQU0sTUFBSyxLQUFLLEtBQUssS0FBSyxPQUFPLE1BQU8sS0FBSSxLQUFLLE9BQU8sS0FDeEQsS0FBTSxNQUFLLEtBQUssS0FBSyxLQUFLLE9BQU8sTUFBTyxLQUFJLEtBQUssT0FBTyxLQUN4RCxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQ3pDLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUU7QUFDN0MsVUFBSyxNQUFLLE1BQU07QUFDaEIsVUFBSSxTQUFTLEdBQUc7QUFDZCxZQUFJLElBQUksSUFBSSxHQUNSLFNBQVMsS0FBSyxFQUFFLEdBQ2hCLElBQUksS0FBTSxRQUFPLE1BQU8sVUFBUyxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFO0FBQ2pFLGVBQU87QUFBQSxVQUNMLE1BQU0sSUFBSTtBQUFBLFVBQ1YsTUFBTSxJQUFJO0FBQUEsVUFDVixLQUFLLFNBQVMsS0FBSyxNQUFNLElBQUksRUFBRTtBQUFBLFFBQ2pDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxNQUFFLFdBQVcsSUFBSSxNQUFPLE1BQU0sS0FBSztBQUVuQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE9BQUssTUFBTSxTQUFTLEdBQUc7QUFDckIsUUFBSSxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSztBQUNyRCxXQUFPLFFBQVEsSUFBSSxJQUFJLEVBQUU7QUFBQSxFQUMzQjtBQUVBLFNBQU87QUFDVCxFQUFHLEtBQUssT0FBTyxHQUFHLENBQUM7OztBQ25FbkIsb0JBQW1CLE1BQUs7QUFDdEIsU0FBUSx3QkFBd0IsSUFBRztBQUNqQyxTQUFJLENBQUM7QUFFTCx3QkFBbUIsUUFBTyxLQUFLO0FBQzdCLFVBQUksSUFBSSxLQUFLLFVBQVEsVUFBZSxNQUFLLEdBQUcsR0FBSSxPQUFNLFVBQWUsR0FBRyxHQUFHLENBQUMsR0FDeEUsSUFBSSxRQUFNLE9BQU0sR0FBRyxJQUFJLENBQUMsR0FDeEIsSUFBSSxRQUFNLE9BQU0sR0FBRyxJQUFJLENBQUMsR0FDeEIsVUFBVSxRQUFNLE9BQU0sU0FBUyxJQUFJLE9BQU87QUFDOUMsYUFBTyxTQUFTLEdBQUc7QUFDakIsZUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNiLGVBQU0sSUFBSSxFQUFFLENBQUM7QUFDYixlQUFNLElBQUksRUFBRSxLQUFLLElBQUksR0FBRyxFQUFDLENBQUM7QUFDMUIsZUFBTSxVQUFVLFFBQVEsQ0FBQztBQUN6QixlQUFPLFNBQVE7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFFQSxlQUFVLFFBQVE7QUFFbEIsV0FBTztBQUFBLEVBQ1QsRUFBRyxDQUFDO0FBQ047QUFFQSxJQUFPLG9CQUFRLFdBQVUsR0FBRztBQUNyQixJQUFJLGdCQUFnQixXQUFVLE9BQUs7OztBQzVCM0IsMEJBQVMsY0FBYyxHQUFHO0FBQ3ZDLE1BQUksVUFBVSxJQUFJLE1BQU0sQ0FBQztBQUN6QixXQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUFHLFlBQVEsS0FBSyxhQUFhLElBQUssS0FBSSxFQUFFO0FBQ2pFLFNBQU87QUFDVDs7O0FDSkEsSUFBSSxRQUFRO0FBQVosSUFDSSxVQUFVO0FBRGQsSUFFSSxXQUFXO0FBRmYsSUFHSSxZQUFZO0FBSGhCLElBSUk7QUFKSixJQUtJO0FBTEosSUFNSSxZQUFZO0FBTmhCLElBT0ksV0FBVztBQVBmLElBUUksWUFBWTtBQVJoQixJQVNJLFFBQVEsT0FBTyxnQkFBZ0IsWUFBWSxZQUFZLE1BQU0sY0FBYztBQVQvRSxJQVVJLFdBQVcsT0FBTyxXQUFXLFlBQVksT0FBTyx3QkFBd0IsT0FBTyxzQkFBc0IsS0FBSyxNQUFNLElBQUksU0FBUyxHQUFHO0FBQUUsYUFBVyxHQUFHLEVBQUU7QUFBRztBQUVsSixlQUFlO0FBQ3BCLFNBQU8sWUFBYSxVQUFTLFFBQVEsR0FBRyxXQUFXLE1BQU0sSUFBSSxJQUFJO0FBQ25FO0FBRUEsb0JBQW9CO0FBQ2xCLGFBQVc7QUFDYjtBQUVPLGlCQUFpQjtBQUN0QixPQUFLLFFBQ0wsS0FBSyxRQUNMLEtBQUssUUFBUTtBQUNmO0FBRUEsTUFBTSxZQUFZLE1BQU0sWUFBWTtBQUFBLEVBQ2xDLGFBQWE7QUFBQSxFQUNiLFNBQVMsU0FBUyxVQUFVLE9BQU8sTUFBTTtBQUN2QyxRQUFJLE9BQU8sYUFBYTtBQUFZLFlBQU0sSUFBSSxVQUFVLDRCQUE0QjtBQUNwRixXQUFRLFNBQVEsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFTLFVBQVMsT0FBTyxJQUFJLENBQUM7QUFDOUQsUUFBSSxDQUFDLEtBQUssU0FBUyxhQUFhLE1BQU07QUFDcEMsVUFBSTtBQUFVLGlCQUFTLFFBQVE7QUFBQTtBQUMxQixtQkFBVztBQUNoQixpQkFBVztBQUFBLElBQ2I7QUFDQSxTQUFLLFFBQVE7QUFDYixTQUFLLFFBQVE7QUFDYixVQUFNO0FBQUEsRUFDUjtBQUFBLEVBQ0EsTUFBTSxXQUFXO0FBQ2YsUUFBSSxLQUFLLE9BQU87QUFDZCxXQUFLLFFBQVE7QUFDYixXQUFLLFFBQVE7QUFDYixZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFDRjtBQUVPLGVBQWUsVUFBVSxPQUFPLE1BQU07QUFDM0MsTUFBSSxJQUFJLElBQUk7QUFDWixJQUFFLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFDL0IsU0FBTztBQUNUO0FBRU8sc0JBQXNCO0FBQzNCLE1BQUk7QUFDSixJQUFFO0FBQ0YsTUFBSSxJQUFJLFVBQVU7QUFDbEIsU0FBTyxHQUFHO0FBQ1IsUUFBSyxLQUFJLFdBQVcsRUFBRSxVQUFVO0FBQUcsUUFBRSxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ3ZELFFBQUksRUFBRTtBQUFBLEVBQ1I7QUFDQSxJQUFFO0FBQ0o7QUFFQSxnQkFBZ0I7QUFDZCxhQUFZLGFBQVksTUFBTSxJQUFJLEtBQUs7QUFDdkMsVUFBUSxVQUFVO0FBQ2xCLE1BQUk7QUFDRixlQUFXO0FBQUEsRUFDYixVQUFFO0FBQ0EsWUFBUTtBQUNSLFFBQUk7QUFDSixlQUFXO0FBQUEsRUFDYjtBQUNGO0FBRUEsZ0JBQWdCO0FBQ2QsTUFBSSxPQUFNLE1BQU0sSUFBSSxHQUFHLFFBQVEsT0FBTTtBQUNyQyxNQUFJLFFBQVE7QUFBVyxpQkFBYSxPQUFPLFlBQVk7QUFDekQ7QUFFQSxlQUFlO0FBQ2IsTUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLE9BQU87QUFDbEMsU0FBTyxJQUFJO0FBQ1QsUUFBSSxHQUFHLE9BQU87QUFDWixVQUFJLE9BQU8sR0FBRztBQUFPLGVBQU8sR0FBRztBQUMvQixXQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDbkIsT0FBTztBQUNMLFdBQUssR0FBRyxPQUFPLEdBQUcsUUFBUTtBQUMxQixXQUFLLEtBQUssR0FBRyxRQUFRLEtBQUssV0FBVztBQUFBLElBQ3ZDO0FBQUEsRUFDRjtBQUNBLGFBQVc7QUFDWCxRQUFNLElBQUk7QUFDWjtBQUVBLGVBQWUsTUFBTTtBQUNuQixNQUFJO0FBQU87QUFDWCxNQUFJO0FBQVMsY0FBVSxhQUFhLE9BQU87QUFDM0MsTUFBSSxRQUFRLE9BQU87QUFDbkIsTUFBSSxRQUFRLElBQUk7QUFDZCxRQUFJLE9BQU87QUFBVSxnQkFBVSxXQUFXLE1BQU0sT0FBTyxNQUFNLElBQUksSUFBSSxTQUFTO0FBQzlFLFFBQUk7QUFBVSxpQkFBVyxjQUFjLFFBQVE7QUFBQSxFQUNqRCxPQUFPO0FBQ0wsUUFBSSxDQUFDO0FBQVUsa0JBQVksTUFBTSxJQUFJLEdBQUcsV0FBVyxZQUFZLE1BQU0sU0FBUztBQUM5RSxZQUFRLEdBQUcsU0FBUyxJQUFJO0FBQUEsRUFDMUI7QUFDRjs7O0FDM0dlLHlCQUFTLFVBQVUsT0FBTyxNQUFNO0FBQzdDLE1BQUksSUFBSSxJQUFJO0FBQ1osVUFBUSxTQUFTLE9BQU8sSUFBSSxDQUFDO0FBQzdCLElBQUUsUUFBUSxhQUFXO0FBQ25CLE1BQUUsS0FBSztBQUNQLGFBQVMsVUFBVSxLQUFLO0FBQUEsRUFDMUIsR0FBRyxPQUFPLElBQUk7QUFDZCxTQUFPO0FBQ1Q7OztBQ1BBLElBQUksVUFBVSxpQkFBUyxTQUFTLE9BQU8sVUFBVSxXQUFXO0FBQzVELElBQUksYUFBYSxDQUFDO0FBRVgsSUFBSSxVQUFVO0FBQ2QsSUFBSSxZQUFZO0FBQ2hCLElBQUksV0FBVztBQUNmLElBQUksVUFBVTtBQUNkLElBQUksVUFBVTtBQUNkLElBQUksU0FBUztBQUNiLElBQUksUUFBUTtBQUVKLDBCQUFTLE1BQU0sTUFBTSxLQUFJLFFBQU8sT0FBTyxRQUFRO0FBQzVELE1BQUksWUFBWSxLQUFLO0FBQ3JCLE1BQUksQ0FBQztBQUFXLFNBQUssZUFBZSxDQUFDO0FBQUEsV0FDNUIsT0FBTTtBQUFXO0FBQzFCLFNBQU8sTUFBTSxLQUFJO0FBQUEsSUFDZjtBQUFBLElBQ0EsT0FBTztBQUFBLElBQ1A7QUFBQSxJQUNBLElBQUk7QUFBQSxJQUNKLE9BQU87QUFBQSxJQUNQLE1BQU0sT0FBTztBQUFBLElBQ2IsT0FBTyxPQUFPO0FBQUEsSUFDZCxVQUFVLE9BQU87QUFBQSxJQUNqQixNQUFNLE9BQU87QUFBQSxJQUNiLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxFQUNULENBQUM7QUFDSDtBQUVPLGVBQWMsTUFBTSxLQUFJO0FBQzdCLE1BQUksV0FBVyxLQUFJLE1BQU0sR0FBRTtBQUMzQixNQUFJLFNBQVMsUUFBUTtBQUFTLFVBQU0sSUFBSSxNQUFNLDZCQUE2QjtBQUMzRSxTQUFPO0FBQ1Q7QUFFTyxjQUFhLE1BQU0sS0FBSTtBQUM1QixNQUFJLFdBQVcsS0FBSSxNQUFNLEdBQUU7QUFDM0IsTUFBSSxTQUFTLFFBQVE7QUFBUyxVQUFNLElBQUksTUFBTSwyQkFBMkI7QUFDekUsU0FBTztBQUNUO0FBRU8sY0FBYSxNQUFNLEtBQUk7QUFDNUIsTUFBSSxXQUFXLEtBQUs7QUFDcEIsTUFBSSxDQUFDLFlBQVksQ0FBRSxZQUFXLFNBQVM7QUFBTSxVQUFNLElBQUksTUFBTSxzQkFBc0I7QUFDbkYsU0FBTztBQUNUO0FBRUEsZ0JBQWdCLE1BQU0sS0FBSSxPQUFNO0FBQzlCLE1BQUksWUFBWSxLQUFLLGNBQ2pCO0FBSUosWUFBVSxPQUFNO0FBQ2hCLFFBQUssUUFBUSxNQUFNLFVBQVUsR0FBRyxNQUFLLElBQUk7QUFFekMsb0JBQWtCLFNBQVM7QUFDekIsVUFBSyxRQUFRO0FBQ2IsVUFBSyxNQUFNLFFBQVEsUUFBTyxNQUFLLE9BQU8sTUFBSyxJQUFJO0FBRy9DLFFBQUksTUFBSyxTQUFTO0FBQVMsYUFBTSxVQUFVLE1BQUssS0FBSztBQUFBLEVBQ3ZEO0FBRUEsa0JBQWUsU0FBUztBQUN0QixRQUFJLEdBQUcsR0FBRyxHQUFHO0FBR2IsUUFBSSxNQUFLLFVBQVU7QUFBVyxhQUFPLEtBQUs7QUFFMUMsU0FBSyxLQUFLLFdBQVc7QUFDbkIsVUFBSSxVQUFVO0FBQ2QsVUFBSSxFQUFFLFNBQVMsTUFBSztBQUFNO0FBSzFCLFVBQUksRUFBRSxVQUFVO0FBQVMsZUFBTyxnQkFBUSxNQUFLO0FBRzdDLFVBQUksRUFBRSxVQUFVLFNBQVM7QUFDdkIsVUFBRSxRQUFRO0FBQ1YsVUFBRSxNQUFNLEtBQUs7QUFDYixVQUFFLEdBQUcsS0FBSyxhQUFhLE1BQU0sS0FBSyxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFDNUQsZUFBTyxVQUFVO0FBQUEsTUFDbkIsV0FHUyxDQUFDLElBQUksS0FBSTtBQUNoQixVQUFFLFFBQVE7QUFDVixVQUFFLE1BQU0sS0FBSztBQUNiLFVBQUUsR0FBRyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUN6RCxlQUFPLFVBQVU7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFNQSxvQkFBUSxXQUFXO0FBQ2pCLFVBQUksTUFBSyxVQUFVLFNBQVM7QUFDMUIsY0FBSyxRQUFRO0FBQ2IsY0FBSyxNQUFNLFFBQVEsT0FBTSxNQUFLLE9BQU8sTUFBSyxJQUFJO0FBQzlDLGNBQUssT0FBTztBQUFBLE1BQ2Q7QUFBQSxJQUNGLENBQUM7QUFJRCxVQUFLLFFBQVE7QUFDYixVQUFLLEdBQUcsS0FBSyxTQUFTLE1BQU0sS0FBSyxVQUFVLE1BQUssT0FBTyxNQUFLLEtBQUs7QUFDakUsUUFBSSxNQUFLLFVBQVU7QUFBVTtBQUM3QixVQUFLLFFBQVE7QUFHYixZQUFRLElBQUksTUFBTSxJQUFJLE1BQUssTUFBTSxNQUFNO0FBQ3ZDLFNBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQzlCLFVBQUksSUFBSSxNQUFLLE1BQU0sR0FBRyxNQUFNLEtBQUssTUFBTSxLQUFLLFVBQVUsTUFBSyxPQUFPLE1BQUssS0FBSyxHQUFHO0FBQzdFLGNBQU0sRUFBRSxLQUFLO0FBQUEsTUFDZjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFNBQVMsSUFBSTtBQUFBLEVBQ3JCO0FBRUEsaUJBQWMsU0FBUztBQUNyQixRQUFJLElBQUksVUFBVSxNQUFLLFdBQVcsTUFBSyxLQUFLLEtBQUssTUFBTSxVQUFVLE1BQUssUUFBUSxJQUFLLE9BQUssTUFBTSxRQUFRLElBQUksR0FBRyxNQUFLLFFBQVEsUUFBUSxJQUM5SCxJQUFJLElBQ0osSUFBSSxNQUFNO0FBRWQsV0FBTyxFQUFFLElBQUksR0FBRztBQUNkLFlBQU0sR0FBRyxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQ3ZCO0FBR0EsUUFBSSxNQUFLLFVBQVUsUUFBUTtBQUN6QixZQUFLLEdBQUcsS0FBSyxPQUFPLE1BQU0sS0FBSyxVQUFVLE1BQUssT0FBTyxNQUFLLEtBQUs7QUFDL0QsV0FBSztBQUFBLElBQ1A7QUFBQSxFQUNGO0FBRUEsa0JBQWdCO0FBQ2QsVUFBSyxRQUFRO0FBQ2IsVUFBSyxNQUFNLEtBQUs7QUFDaEIsV0FBTyxVQUFVO0FBQ2pCLGFBQVMsS0FBSztBQUFXO0FBQ3pCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDRjs7O0FDdEplLDJCQUFTLE1BQU0sTUFBTTtBQUNsQyxNQUFJLFlBQVksS0FBSyxjQUNqQixVQUNBLFFBQ0EsU0FBUSxNQUNSO0FBRUosTUFBSSxDQUFDO0FBQVc7QUFFaEIsU0FBTyxRQUFRLE9BQU8sT0FBTyxPQUFPO0FBRXBDLE9BQUssS0FBSyxXQUFXO0FBQ25CLFFBQUssWUFBVyxVQUFVLElBQUksU0FBUyxNQUFNO0FBQUUsZUFBUTtBQUFPO0FBQUEsSUFBVTtBQUN4RSxhQUFTLFNBQVMsUUFBUSxZQUFZLFNBQVMsUUFBUTtBQUN2RCxhQUFTLFFBQVE7QUFDakIsYUFBUyxNQUFNLEtBQUs7QUFDcEIsYUFBUyxHQUFHLEtBQUssU0FBUyxjQUFjLFVBQVUsTUFBTSxLQUFLLFVBQVUsU0FBUyxPQUFPLFNBQVMsS0FBSztBQUNyRyxXQUFPLFVBQVU7QUFBQSxFQUNuQjtBQUVBLE1BQUk7QUFBTyxXQUFPLEtBQUs7QUFDekI7OztBQ3JCZSw0QkFBUyxNQUFNO0FBQzVCLFNBQU8sS0FBSyxLQUFLLFdBQVc7QUFDMUIsc0JBQVUsTUFBTSxJQUFJO0FBQUEsRUFDdEIsQ0FBQztBQUNIOzs7QUNKQSxxQkFBcUIsS0FBSSxNQUFNO0FBQzdCLE1BQUksUUFBUTtBQUNaLFNBQU8sV0FBVztBQUNoQixRQUFJLFdBQVcsS0FBSSxNQUFNLEdBQUUsR0FDdkIsUUFBUSxTQUFTO0FBS3JCLFFBQUksVUFBVSxRQUFRO0FBQ3BCLGVBQVMsU0FBUztBQUNsQixlQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQzdDLFlBQUksT0FBTyxHQUFHLFNBQVMsTUFBTTtBQUMzQixtQkFBUyxPQUFPLE1BQU07QUFDdEIsaUJBQU8sT0FBTyxHQUFHLENBQUM7QUFDbEI7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxhQUFTLFFBQVE7QUFBQSxFQUNuQjtBQUNGO0FBRUEsdUJBQXVCLEtBQUksTUFBTSxPQUFPO0FBQ3RDLE1BQUksUUFBUTtBQUNaLE1BQUksT0FBTyxVQUFVO0FBQVksVUFBTSxJQUFJO0FBQzNDLFNBQU8sV0FBVztBQUNoQixRQUFJLFdBQVcsS0FBSSxNQUFNLEdBQUUsR0FDdkIsUUFBUSxTQUFTO0FBS3JCLFFBQUksVUFBVSxRQUFRO0FBQ3BCLGVBQVUsVUFBUyxPQUFPLE1BQU07QUFDaEMsZUFBUyxJQUFJLEVBQUMsTUFBWSxNQUFZLEdBQUcsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDN0UsWUFBSSxPQUFPLEdBQUcsU0FBUyxNQUFNO0FBQzNCLGlCQUFPLEtBQUs7QUFDWjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQ0EsVUFBSSxNQUFNO0FBQUcsZUFBTyxLQUFLLENBQUM7QUFBQSxJQUM1QjtBQUVBLGFBQVMsUUFBUTtBQUFBLEVBQ25CO0FBQ0Y7QUFFZSx1QkFBUyxNQUFNLE9BQU87QUFDbkMsTUFBSSxNQUFLLEtBQUs7QUFFZCxVQUFRO0FBRVIsTUFBSSxVQUFVLFNBQVMsR0FBRztBQUN4QixRQUFJLFFBQVEsS0FBSSxLQUFLLEtBQUssR0FBRyxHQUFFLEVBQUU7QUFDakMsYUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQy9DLFVBQUssS0FBSSxNQUFNLElBQUksU0FBUyxNQUFNO0FBQ2hDLGVBQU8sRUFBRTtBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLEtBQUssS0FBTSxVQUFTLE9BQU8sY0FBYyxlQUFlLEtBQUksTUFBTSxLQUFLLENBQUM7QUFDakY7QUFFTyxvQkFBb0IsYUFBWSxNQUFNLE9BQU87QUFDbEQsTUFBSSxNQUFLLFlBQVc7QUFFcEIsY0FBVyxLQUFLLFdBQVc7QUFDekIsUUFBSSxXQUFXLEtBQUksTUFBTSxHQUFFO0FBQzNCLElBQUMsVUFBUyxTQUFVLFVBQVMsUUFBUSxDQUFDLElBQUksUUFBUSxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQUEsRUFDL0UsQ0FBQztBQUVELFNBQU8sU0FBUyxNQUFNO0FBQ3BCLFdBQU8sS0FBSSxNQUFNLEdBQUUsRUFBRSxNQUFNO0FBQUEsRUFDN0I7QUFDRjs7O0FDN0VlLDZCQUFTLElBQUcsR0FBRztBQUM1QixNQUFJO0FBQ0osU0FBUSxRQUFPLE1BQU0sV0FBVyxrQkFDMUIsYUFBYSxRQUFRLGNBQ3BCLE1BQUksTUFBTSxDQUFDLEtBQU0sS0FBSSxJQUFHLGVBQ3pCLGdCQUFtQixJQUFHLENBQUM7QUFDL0I7OztBQ0pBLHFCQUFvQixNQUFNO0FBQ3hCLFNBQU8sV0FBVztBQUNoQixTQUFLLGdCQUFnQixJQUFJO0FBQUEsRUFDM0I7QUFDRjtBQUVBLHVCQUFzQixVQUFVO0FBQzlCLFNBQU8sV0FBVztBQUNoQixTQUFLLGtCQUFrQixTQUFTLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFDdkQ7QUFDRjtBQUVBLHVCQUFzQixNQUFNLGFBQWEsUUFBUTtBQUMvQyxNQUFJLFVBQ0EsVUFBVSxTQUFTLElBQ25CO0FBQ0osU0FBTyxXQUFXO0FBQ2hCLFFBQUksVUFBVSxLQUFLLGFBQWEsSUFBSTtBQUNwQyxXQUFPLFlBQVksVUFBVSxPQUN2QixZQUFZLFdBQVcsZUFDdkIsZUFBZSxZQUFZLFdBQVcsU0FBUyxNQUFNO0FBQUEsRUFDN0Q7QUFDRjtBQUVBLHlCQUF3QixVQUFVLGFBQWEsUUFBUTtBQUNyRCxNQUFJLFVBQ0EsVUFBVSxTQUFTLElBQ25CO0FBQ0osU0FBTyxXQUFXO0FBQ2hCLFFBQUksVUFBVSxLQUFLLGVBQWUsU0FBUyxPQUFPLFNBQVMsS0FBSztBQUNoRSxXQUFPLFlBQVksVUFBVSxPQUN2QixZQUFZLFdBQVcsZUFDdkIsZUFBZSxZQUFZLFdBQVcsU0FBUyxNQUFNO0FBQUEsRUFDN0Q7QUFDRjtBQUVBLHVCQUFzQixNQUFNLGFBQWEsT0FBTztBQUM5QyxNQUFJLFVBQ0EsVUFDQTtBQUNKLFNBQU8sV0FBVztBQUNoQixRQUFJLFNBQVMsU0FBUyxNQUFNLElBQUksR0FBRztBQUNuQyxRQUFJLFVBQVU7QUFBTSxhQUFPLEtBQUssS0FBSyxnQkFBZ0IsSUFBSTtBQUN6RCxjQUFVLEtBQUssYUFBYSxJQUFJO0FBQ2hDLGNBQVUsU0FBUztBQUNuQixXQUFPLFlBQVksVUFBVSxPQUN2QixZQUFZLFlBQVksWUFBWSxXQUFXLGVBQzlDLFlBQVcsU0FBUyxlQUFlLFlBQVksV0FBVyxTQUFTLE1BQU07QUFBQSxFQUNsRjtBQUNGO0FBRUEseUJBQXdCLFVBQVUsYUFBYSxPQUFPO0FBQ3BELE1BQUksVUFDQSxVQUNBO0FBQ0osU0FBTyxXQUFXO0FBQ2hCLFFBQUksU0FBUyxTQUFTLE1BQU0sSUFBSSxHQUFHO0FBQ25DLFFBQUksVUFBVTtBQUFNLGFBQU8sS0FBSyxLQUFLLGtCQUFrQixTQUFTLE9BQU8sU0FBUyxLQUFLO0FBQ3JGLGNBQVUsS0FBSyxlQUFlLFNBQVMsT0FBTyxTQUFTLEtBQUs7QUFDNUQsY0FBVSxTQUFTO0FBQ25CLFdBQU8sWUFBWSxVQUFVLE9BQ3ZCLFlBQVksWUFBWSxZQUFZLFdBQVcsZUFDOUMsWUFBVyxTQUFTLGVBQWUsWUFBWSxXQUFXLFNBQVMsTUFBTTtBQUFBLEVBQ2xGO0FBQ0Y7QUFFZSx1QkFBUyxNQUFNLE9BQU87QUFDbkMsTUFBSSxXQUFXLGtCQUFVLElBQUksR0FBRyxJQUFJLGFBQWEsY0FBYywwQkFBdUI7QUFDdEYsU0FBTyxLQUFLLFVBQVUsTUFBTSxPQUFPLFVBQVUsYUFDdEMsVUFBUyxRQUFRLGtCQUFpQixlQUFjLFVBQVUsR0FBRyxXQUFXLE1BQU0sVUFBVSxNQUFNLEtBQUssQ0FBQyxJQUNyRyxTQUFTLE9BQVEsVUFBUyxRQUFRLGdCQUFlLGFBQVksUUFBUSxJQUNwRSxVQUFTLFFBQVEsa0JBQWlCLGVBQWMsVUFBVSxHQUFHLEtBQUssQ0FBQztBQUM1RTs7O0FDM0VBLHlCQUF5QixNQUFNLEdBQUc7QUFDaEMsU0FBTyxTQUFTLEdBQUc7QUFDakIsU0FBSyxhQUFhLE1BQU0sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDekM7QUFDRjtBQUVBLDJCQUEyQixVQUFVLEdBQUc7QUFDdEMsU0FBTyxTQUFTLEdBQUc7QUFDakIsU0FBSyxlQUFlLFNBQVMsT0FBTyxTQUFTLE9BQU8sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDckU7QUFDRjtBQUVBLHFCQUFxQixVQUFVLE9BQU87QUFDcEMsTUFBSSxJQUFJO0FBQ1IsbUJBQWlCO0FBQ2YsUUFBSSxJQUFJLE1BQU0sTUFBTSxNQUFNLFNBQVM7QUFDbkMsUUFBSSxNQUFNO0FBQUksV0FBTSxNQUFLLE1BQU0sa0JBQWtCLFVBQVUsQ0FBQztBQUM1RCxXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sU0FBUztBQUNmLFNBQU87QUFDVDtBQUVBLG1CQUFtQixNQUFNLE9BQU87QUFDOUIsTUFBSSxJQUFJO0FBQ1IsbUJBQWlCO0FBQ2YsUUFBSSxJQUFJLE1BQU0sTUFBTSxNQUFNLFNBQVM7QUFDbkMsUUFBSSxNQUFNO0FBQUksV0FBTSxNQUFLLE1BQU0sZ0JBQWdCLE1BQU0sQ0FBQztBQUN0RCxXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sU0FBUztBQUNmLFNBQU87QUFDVDtBQUVlLDJCQUFTLE1BQU0sT0FBTztBQUNuQyxNQUFJLE1BQU0sVUFBVTtBQUNwQixNQUFJLFVBQVUsU0FBUztBQUFHLFdBQVEsT0FBTSxLQUFLLE1BQU0sR0FBRyxNQUFNLElBQUk7QUFDaEUsTUFBSSxTQUFTO0FBQU0sV0FBTyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQzlDLE1BQUksT0FBTyxVQUFVO0FBQVksVUFBTSxJQUFJO0FBQzNDLE1BQUksV0FBVyxrQkFBVSxJQUFJO0FBQzdCLFNBQU8sS0FBSyxNQUFNLEtBQU0sVUFBUyxRQUFRLGNBQWMsV0FBVyxVQUFVLEtBQUssQ0FBQztBQUNwRjs7O0FDekNBLHVCQUF1QixLQUFJLE9BQU87QUFDaEMsU0FBTyxXQUFXO0FBQ2hCLFVBQUssTUFBTSxHQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sTUFBTSxNQUFNLFNBQVM7QUFBQSxFQUNyRDtBQUNGO0FBRUEsdUJBQXVCLEtBQUksT0FBTztBQUNoQyxTQUFPLFFBQVEsQ0FBQyxPQUFPLFdBQVc7QUFDaEMsVUFBSyxNQUFNLEdBQUUsRUFBRSxRQUFRO0FBQUEsRUFDekI7QUFDRjtBQUVlLHVCQUFTLE9BQU87QUFDN0IsTUFBSSxNQUFLLEtBQUs7QUFFZCxTQUFPLFVBQVUsU0FDWCxLQUFLLEtBQU0sUUFBTyxVQUFVLGFBQ3hCLGdCQUNBLGVBQWUsS0FBSSxLQUFLLENBQUMsSUFDN0IsS0FBSSxLQUFLLEtBQUssR0FBRyxHQUFFLEVBQUU7QUFDN0I7OztBQ3BCQSwwQkFBMEIsS0FBSSxPQUFPO0FBQ25DLFNBQU8sV0FBVztBQUNoQixTQUFJLE1BQU0sR0FBRSxFQUFFLFdBQVcsQ0FBQyxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQUEsRUFDdkQ7QUFDRjtBQUVBLDBCQUEwQixLQUFJLE9BQU87QUFDbkMsU0FBTyxRQUFRLENBQUMsT0FBTyxXQUFXO0FBQ2hDLFNBQUksTUFBTSxHQUFFLEVBQUUsV0FBVztBQUFBLEVBQzNCO0FBQ0Y7QUFFZSwwQkFBUyxPQUFPO0FBQzdCLE1BQUksTUFBSyxLQUFLO0FBRWQsU0FBTyxVQUFVLFNBQ1gsS0FBSyxLQUFNLFFBQU8sVUFBVSxhQUN4QixtQkFDQSxrQkFBa0IsS0FBSSxLQUFLLENBQUMsSUFDaEMsS0FBSSxLQUFLLEtBQUssR0FBRyxHQUFFLEVBQUU7QUFDN0I7OztBQ3BCQSxzQkFBc0IsS0FBSSxPQUFPO0FBQy9CLE1BQUksT0FBTyxVQUFVO0FBQVksVUFBTSxJQUFJO0FBQzNDLFNBQU8sV0FBVztBQUNoQixTQUFJLE1BQU0sR0FBRSxFQUFFLE9BQU87QUFBQSxFQUN2QjtBQUNGO0FBRWUsc0JBQVMsT0FBTztBQUM3QixNQUFJLE1BQUssS0FBSztBQUVkLFNBQU8sVUFBVSxTQUNYLEtBQUssS0FBSyxhQUFhLEtBQUksS0FBSyxDQUFDLElBQ2pDLEtBQUksS0FBSyxLQUFLLEdBQUcsR0FBRSxFQUFFO0FBQzdCOzs7QUNiQSxxQkFBcUIsS0FBSSxPQUFPO0FBQzlCLFNBQU8sV0FBVztBQUNoQixRQUFJLElBQUksTUFBTSxNQUFNLE1BQU0sU0FBUztBQUNuQyxRQUFJLE9BQU8sTUFBTTtBQUFZLFlBQU0sSUFBSTtBQUN2QyxTQUFJLE1BQU0sR0FBRSxFQUFFLE9BQU87QUFBQSxFQUN2QjtBQUNGO0FBRWUsNkJBQVMsT0FBTztBQUM3QixNQUFJLE9BQU8sVUFBVTtBQUFZLFVBQU0sSUFBSTtBQUMzQyxTQUFPLEtBQUssS0FBSyxZQUFZLEtBQUssS0FBSyxLQUFLLENBQUM7QUFDL0M7OztBQ1ZlLHlCQUFTLE9BQU87QUFDN0IsTUFBSSxPQUFPLFVBQVU7QUFBWSxZQUFRLGdCQUFRLEtBQUs7QUFFdEQsV0FBUyxTQUFTLEtBQUssU0FBUyxLQUFJLE9BQU8sUUFBUSxZQUFZLElBQUksTUFBTSxFQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBRyxFQUFFLEdBQUc7QUFDOUYsYUFBUyxRQUFRLE9BQU8sSUFBSSxJQUFJLE1BQU0sUUFBUSxXQUFXLFVBQVUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNuRyxVQUFLLFFBQU8sTUFBTSxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssVUFBVSxHQUFHLEtBQUssR0FBRztBQUNsRSxpQkFBUyxLQUFLLElBQUk7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxJQUFJLFdBQVcsV0FBVyxLQUFLLFVBQVUsS0FBSyxPQUFPLEtBQUssR0FBRztBQUN0RTs7O0FDYmUsd0JBQVMsYUFBWTtBQUNsQyxNQUFJLFlBQVcsUUFBUSxLQUFLO0FBQUssVUFBTSxJQUFJO0FBRTNDLFdBQVMsVUFBVSxLQUFLLFNBQVMsVUFBVSxZQUFXLFNBQVMsS0FBSyxRQUFRLFFBQVEsS0FBSyxRQUFRLFFBQVEsS0FBSSxLQUFLLElBQUksSUFBSSxFQUFFLEdBQUcsU0FBUyxJQUFJLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUcsRUFBRSxHQUFHO0FBQ3hLLGFBQVMsU0FBUyxRQUFRLElBQUksU0FBUyxRQUFRLElBQUksSUFBSSxPQUFPLFFBQVEsUUFBUSxPQUFPLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQy9ILFVBQUksT0FBTyxPQUFPLE1BQU0sT0FBTyxJQUFJO0FBQ2pDLGNBQU0sS0FBSztBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sSUFBSSxJQUFJLEVBQUUsR0FBRztBQUNsQixXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBRUEsU0FBTyxJQUFJLFdBQVcsUUFBUSxLQUFLLFVBQVUsS0FBSyxPQUFPLEtBQUssR0FBRztBQUNuRTs7O0FDaEJBLGVBQWUsTUFBTTtBQUNuQixTQUFRLFFBQU8sSUFBSSxLQUFLLEVBQUUsTUFBTSxPQUFPLEVBQUUsTUFBTSxTQUFTLEdBQUc7QUFDekQsUUFBSSxJQUFJLEVBQUUsUUFBUSxHQUFHO0FBQ3JCLFFBQUksS0FBSztBQUFHLFVBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUM1QixXQUFPLENBQUMsS0FBSyxNQUFNO0FBQUEsRUFDckIsQ0FBQztBQUNIO0FBRUEsb0JBQW9CLEtBQUksTUFBTSxVQUFVO0FBQ3RDLE1BQUksS0FBSyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksUUFBTztBQUN6QyxTQUFPLFdBQVc7QUFDaEIsUUFBSSxXQUFXLElBQUksTUFBTSxHQUFFLEdBQ3ZCLEtBQUssU0FBUztBQUtsQixRQUFJLE9BQU87QUFBSyxNQUFDLE9BQU8sT0FBTSxJQUFJLEtBQUssR0FBRyxHQUFHLE1BQU0sUUFBUTtBQUUzRCxhQUFTLEtBQUs7QUFBQSxFQUNoQjtBQUNGO0FBRWUscUJBQVMsTUFBTSxVQUFVO0FBQ3RDLE1BQUksTUFBSyxLQUFLO0FBRWQsU0FBTyxVQUFVLFNBQVMsSUFDcEIsS0FBSSxLQUFLLEtBQUssR0FBRyxHQUFFLEVBQUUsR0FBRyxHQUFHLElBQUksSUFDL0IsS0FBSyxLQUFLLFdBQVcsS0FBSSxNQUFNLFFBQVEsQ0FBQztBQUNoRDs7O0FDL0JBLHdCQUF3QixLQUFJO0FBQzFCLFNBQU8sV0FBVztBQUNoQixRQUFJLFNBQVMsS0FBSztBQUNsQixhQUFTLEtBQUssS0FBSztBQUFjLFVBQUksQ0FBQyxNQUFNO0FBQUk7QUFDaEQsUUFBSTtBQUFRLGFBQU8sWUFBWSxJQUFJO0FBQUEsRUFDckM7QUFDRjtBQUVlLDJCQUFXO0FBQ3hCLFNBQU8sS0FBSyxHQUFHLGNBQWMsZUFBZSxLQUFLLEdBQUcsQ0FBQztBQUN2RDs7O0FDTmUseUJBQVMsUUFBUTtBQUM5QixNQUFJLE9BQU8sS0FBSyxPQUNaLE1BQUssS0FBSztBQUVkLE1BQUksT0FBTyxXQUFXO0FBQVksYUFBUyxpQkFBUyxNQUFNO0FBRTFELFdBQVMsU0FBUyxLQUFLLFNBQVMsS0FBSSxPQUFPLFFBQVEsWUFBWSxJQUFJLE1BQU0sRUFBQyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUcsRUFBRSxHQUFHO0FBQzlGLGFBQVMsUUFBUSxPQUFPLElBQUksSUFBSSxNQUFNLFFBQVEsV0FBVyxVQUFVLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxNQUFNLFNBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEgsVUFBSyxRQUFPLE1BQU0sT0FBUSxXQUFVLE9BQU8sS0FBSyxNQUFNLEtBQUssVUFBVSxHQUFHLEtBQUssSUFBSTtBQUMvRSxZQUFJLGNBQWM7QUFBTSxrQkFBUSxXQUFXLEtBQUs7QUFDaEQsaUJBQVMsS0FBSztBQUNkLHlCQUFTLFNBQVMsSUFBSSxNQUFNLEtBQUksR0FBRyxVQUFVLEtBQUksTUFBTSxHQUFFLENBQUM7QUFBQSxNQUM1RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxJQUFJLFdBQVcsV0FBVyxLQUFLLFVBQVUsTUFBTSxHQUFFO0FBQzFEOzs7QUNqQmUsNEJBQVMsUUFBUTtBQUM5QixNQUFJLE9BQU8sS0FBSyxPQUNaLE1BQUssS0FBSztBQUVkLE1BQUksT0FBTyxXQUFXO0FBQVksYUFBUyxvQkFBWSxNQUFNO0FBRTdELFdBQVMsU0FBUyxLQUFLLFNBQVMsS0FBSSxPQUFPLFFBQVEsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBRyxFQUFFLEdBQUc7QUFDbEcsYUFBUyxRQUFRLE9BQU8sSUFBSSxJQUFJLE1BQU0sUUFBUSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ3JFLFVBQUksT0FBTyxNQUFNLElBQUk7QUFDbkIsaUJBQVMsWUFBVyxPQUFPLEtBQUssTUFBTSxLQUFLLFVBQVUsR0FBRyxLQUFLLEdBQUcsT0FBTyxXQUFVLEtBQUksTUFBTSxHQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksVUFBUyxRQUFRLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEksY0FBSSxRQUFRLFVBQVMsSUFBSTtBQUN2Qiw2QkFBUyxPQUFPLE1BQU0sS0FBSSxHQUFHLFdBQVUsUUFBTztBQUFBLFVBQ2hEO0FBQUEsUUFDRjtBQUNBLGtCQUFVLEtBQUssU0FBUTtBQUN2QixnQkFBUSxLQUFLLElBQUk7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxJQUFJLFdBQVcsV0FBVyxTQUFTLE1BQU0sR0FBRTtBQUNwRDs7O0FDdkJBLElBQUksYUFBWSxrQkFBVSxVQUFVO0FBRXJCLDhCQUFXO0FBQ3hCLFNBQU8sSUFBSSxXQUFVLEtBQUssU0FBUyxLQUFLLFFBQVE7QUFDbEQ7OztBQ0FBLG1CQUFtQixNQUFNLGFBQWE7QUFDcEMsTUFBSSxVQUNBLFVBQ0E7QUFDSixTQUFPLFdBQVc7QUFDaEIsUUFBSSxVQUFVLFdBQU0sTUFBTSxJQUFJLEdBQzFCLFVBQVcsTUFBSyxNQUFNLGVBQWUsSUFBSSxHQUFHLFdBQU0sTUFBTSxJQUFJO0FBQ2hFLFdBQU8sWUFBWSxVQUFVLE9BQ3ZCLFlBQVksWUFBWSxZQUFZLFdBQVcsZUFDL0MsZUFBZSxZQUFZLFdBQVcsU0FBUyxXQUFXLE9BQU87QUFBQSxFQUN6RTtBQUNGO0FBRUEsc0JBQXFCLE1BQU07QUFDekIsU0FBTyxXQUFXO0FBQ2hCLFNBQUssTUFBTSxlQUFlLElBQUk7QUFBQSxFQUNoQztBQUNGO0FBRUEsd0JBQXVCLE1BQU0sYUFBYSxRQUFRO0FBQ2hELE1BQUksVUFDQSxVQUFVLFNBQVMsSUFDbkI7QUFDSixTQUFPLFdBQVc7QUFDaEIsUUFBSSxVQUFVLFdBQU0sTUFBTSxJQUFJO0FBQzlCLFdBQU8sWUFBWSxVQUFVLE9BQ3ZCLFlBQVksV0FBVyxlQUN2QixlQUFlLFlBQVksV0FBVyxTQUFTLE1BQU07QUFBQSxFQUM3RDtBQUNGO0FBRUEsd0JBQXVCLE1BQU0sYUFBYSxPQUFPO0FBQy9DLE1BQUksVUFDQSxVQUNBO0FBQ0osU0FBTyxXQUFXO0FBQ2hCLFFBQUksVUFBVSxXQUFNLE1BQU0sSUFBSSxHQUMxQixTQUFTLE1BQU0sSUFBSSxHQUNuQixVQUFVLFNBQVM7QUFDdkIsUUFBSSxVQUFVO0FBQU0sZ0JBQVUsU0FBVSxNQUFLLE1BQU0sZUFBZSxJQUFJLEdBQUcsV0FBTSxNQUFNLElBQUk7QUFDekYsV0FBTyxZQUFZLFVBQVUsT0FDdkIsWUFBWSxZQUFZLFlBQVksV0FBVyxlQUM5QyxZQUFXLFNBQVMsZUFBZSxZQUFZLFdBQVcsU0FBUyxNQUFNO0FBQUEsRUFDbEY7QUFDRjtBQUVBLDBCQUEwQixLQUFJLE1BQU07QUFDbEMsTUFBSSxLQUFLLEtBQUssV0FBVyxNQUFNLFdBQVcsTUFBTSxRQUFRLFNBQVMsS0FBSztBQUN0RSxTQUFPLFdBQVc7QUFDaEIsUUFBSSxXQUFXLEtBQUksTUFBTSxHQUFFLEdBQ3ZCLEtBQUssU0FBUyxJQUNkLFdBQVcsU0FBUyxNQUFNLFFBQVEsT0FBTyxXQUFXLFdBQVMsYUFBWSxJQUFJLEtBQUs7QUFLdEYsUUFBSSxPQUFPLE9BQU8sY0FBYztBQUFVLE1BQUMsT0FBTyxPQUFNLElBQUksS0FBSyxHQUFHLEdBQUcsT0FBTyxZQUFZLFFBQVE7QUFFbEcsYUFBUyxLQUFLO0FBQUEsRUFDaEI7QUFDRjtBQUVlLHdCQUFTLE1BQU0sT0FBTyxVQUFVO0FBQzdDLE1BQUksSUFBSyxTQUFRLFFBQVEsY0FBYywwQkFBdUI7QUFDOUQsU0FBTyxTQUFTLE9BQU8sS0FDbEIsV0FBVyxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQUMsRUFDbkMsR0FBRyxlQUFlLE1BQU0sYUFBWSxJQUFJLENBQUMsSUFDMUMsT0FBTyxVQUFVLGFBQWEsS0FDN0IsV0FBVyxNQUFNLGVBQWMsTUFBTSxHQUFHLFdBQVcsTUFBTSxXQUFXLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFDakYsS0FBSyxpQkFBaUIsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUN0QyxLQUNDLFdBQVcsTUFBTSxlQUFjLE1BQU0sR0FBRyxLQUFLLEdBQUcsUUFBUSxFQUN4RCxHQUFHLGVBQWUsTUFBTSxJQUFJO0FBQ25DOzs7QUMvRUEsMEJBQTBCLE1BQU0sR0FBRyxVQUFVO0FBQzNDLFNBQU8sU0FBUyxHQUFHO0FBQ2pCLFNBQUssTUFBTSxZQUFZLE1BQU0sRUFBRSxLQUFLLE1BQU0sQ0FBQyxHQUFHLFFBQVE7QUFBQSxFQUN4RDtBQUNGO0FBRUEsb0JBQW9CLE1BQU0sT0FBTyxVQUFVO0FBQ3pDLE1BQUksR0FBRztBQUNQLG1CQUFpQjtBQUNmLFFBQUksSUFBSSxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQ25DLFFBQUksTUFBTTtBQUFJLFVBQUssTUFBSyxNQUFNLGlCQUFpQixNQUFNLEdBQUcsUUFBUTtBQUNoRSxXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sU0FBUztBQUNmLFNBQU87QUFDVDtBQUVlLDRCQUFTLE1BQU0sT0FBTyxVQUFVO0FBQzdDLE1BQUksTUFBTSxXQUFZLFNBQVE7QUFDOUIsTUFBSSxVQUFVLFNBQVM7QUFBRyxXQUFRLE9BQU0sS0FBSyxNQUFNLEdBQUcsTUFBTSxJQUFJO0FBQ2hFLE1BQUksU0FBUztBQUFNLFdBQU8sS0FBSyxNQUFNLEtBQUssSUFBSTtBQUM5QyxNQUFJLE9BQU8sVUFBVTtBQUFZLFVBQU0sSUFBSTtBQUMzQyxTQUFPLEtBQUssTUFBTSxLQUFLLFdBQVcsTUFBTSxPQUFPLFlBQVksT0FBTyxLQUFLLFFBQVEsQ0FBQztBQUNsRjs7O0FDckJBLHVCQUFzQixPQUFPO0FBQzNCLFNBQU8sV0FBVztBQUNoQixTQUFLLGNBQWM7QUFBQSxFQUNyQjtBQUNGO0FBRUEsdUJBQXNCLE9BQU87QUFDM0IsU0FBTyxXQUFXO0FBQ2hCLFFBQUksU0FBUyxNQUFNLElBQUk7QUFDdkIsU0FBSyxjQUFjLFVBQVUsT0FBTyxLQUFLO0FBQUEsRUFDM0M7QUFDRjtBQUVlLHVCQUFTLE9BQU87QUFDN0IsU0FBTyxLQUFLLE1BQU0sUUFBUSxPQUFPLFVBQVUsYUFDckMsY0FBYSxXQUFXLE1BQU0sUUFBUSxLQUFLLENBQUMsSUFDNUMsY0FBYSxTQUFTLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztBQUNyRDs7O0FDbkJBLHlCQUF5QixHQUFHO0FBQzFCLFNBQU8sU0FBUyxHQUFHO0FBQ2pCLFNBQUssY0FBYyxFQUFFLEtBQUssTUFBTSxDQUFDO0FBQUEsRUFDbkM7QUFDRjtBQUVBLG1CQUFtQixPQUFPO0FBQ3hCLE1BQUksSUFBSTtBQUNSLG1CQUFpQjtBQUNmLFFBQUksSUFBSSxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQ25DLFFBQUksTUFBTTtBQUFJLFdBQU0sTUFBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxTQUFTO0FBQ2YsU0FBTztBQUNUO0FBRWUsMkJBQVMsT0FBTztBQUM3QixNQUFJLE1BQU07QUFDVixNQUFJLFVBQVUsU0FBUztBQUFHLFdBQVEsT0FBTSxLQUFLLE1BQU0sR0FBRyxNQUFNLElBQUk7QUFDaEUsTUFBSSxTQUFTO0FBQU0sV0FBTyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQzlDLE1BQUksT0FBTyxVQUFVO0FBQVksVUFBTSxJQUFJO0FBQzNDLFNBQU8sS0FBSyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUM7QUFDekM7OztBQ3BCZSw4QkFBVztBQUN4QixNQUFJLE9BQU8sS0FBSyxPQUNaLE1BQU0sS0FBSyxLQUNYLE1BQU0sTUFBTTtBQUVoQixXQUFTLFNBQVMsS0FBSyxTQUFTLEtBQUksT0FBTyxRQUFRLElBQUksR0FBRyxJQUFJLElBQUcsRUFBRSxHQUFHO0FBQ3BFLGFBQVMsUUFBUSxPQUFPLElBQUksSUFBSSxNQUFNLFFBQVEsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNyRSxVQUFJLE9BQU8sTUFBTSxJQUFJO0FBQ25CLFlBQUksV0FBVSxLQUFJLE1BQU0sR0FBRztBQUMzQix5QkFBUyxNQUFNLE1BQU0sS0FBSyxHQUFHLE9BQU87QUFBQSxVQUNsQyxNQUFNLFNBQVEsT0FBTyxTQUFRLFFBQVEsU0FBUTtBQUFBLFVBQzdDLE9BQU87QUFBQSxVQUNQLFVBQVUsU0FBUTtBQUFBLFVBQ2xCLE1BQU0sU0FBUTtBQUFBLFFBQ2hCLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLElBQUksV0FBVyxRQUFRLEtBQUssVUFBVSxNQUFNLEdBQUc7QUFDeEQ7OztBQ3JCZSx1QkFBVztBQUN4QixNQUFJLEtBQUssS0FBSyxPQUFPLE1BQU0sTUFBSyxLQUFLLEtBQUssT0FBTyxLQUFLLEtBQUs7QUFDM0QsU0FBTyxJQUFJLFFBQVEsU0FBUyxTQUFTLFFBQVE7QUFDM0MsUUFBSSxTQUFTLEVBQUMsT0FBTyxPQUFNLEdBQ3ZCLE1BQU0sRUFBQyxPQUFPLFdBQVc7QUFBRSxVQUFJLEVBQUUsU0FBUztBQUFHLGdCQUFRO0FBQUEsSUFBRyxFQUFDO0FBRTdELFNBQUssS0FBSyxXQUFXO0FBQ25CLFVBQUksV0FBVyxLQUFJLE1BQU0sR0FBRSxHQUN2QixLQUFLLFNBQVM7QUFLbEIsVUFBSSxPQUFPLEtBQUs7QUFDZCxjQUFPLE9BQU0sSUFBSSxLQUFLO0FBQ3RCLFlBQUksRUFBRSxPQUFPLEtBQUssTUFBTTtBQUN4QixZQUFJLEVBQUUsVUFBVSxLQUFLLE1BQU07QUFDM0IsWUFBSSxFQUFFLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDcEI7QUFFQSxlQUFTLEtBQUs7QUFBQSxJQUNoQixDQUFDO0FBR0QsUUFBSSxTQUFTO0FBQUcsY0FBUTtBQUFBLEVBQzFCLENBQUM7QUFDSDs7O0FDTkEsSUFBSSxLQUFLO0FBRUYsb0JBQW9CLFFBQVEsU0FBUyxNQUFNLEtBQUk7QUFDcEQsT0FBSyxVQUFVO0FBQ2YsT0FBSyxXQUFXO0FBQ2hCLE9BQUssUUFBUTtBQUNiLE9BQUssTUFBTTtBQUNiO0FBRWUsb0JBQW9CLE1BQU07QUFDdkMsU0FBTyxrQkFBVSxFQUFFLFdBQVcsSUFBSTtBQUNwQztBQUVPLGlCQUFpQjtBQUN0QixTQUFPLEVBQUU7QUFDWDtBQUVBLElBQUksc0JBQXNCLGtCQUFVO0FBRXBDLFdBQVcsWUFBWSxXQUFXLFlBQVk7QUFBQSxFQUM1QyxhQUFhO0FBQUEsRUFDYixRQUFRO0FBQUEsRUFDUixXQUFXO0FBQUEsRUFDWCxRQUFRO0FBQUEsRUFDUixPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxZQUFZO0FBQUEsRUFDWixNQUFNLG9CQUFvQjtBQUFBLEVBQzFCLE9BQU8sb0JBQW9CO0FBQUEsRUFDM0IsTUFBTSxvQkFBb0I7QUFBQSxFQUMxQixNQUFNLG9CQUFvQjtBQUFBLEVBQzFCLE9BQU8sb0JBQW9CO0FBQUEsRUFDM0IsTUFBTSxvQkFBb0I7QUFBQSxFQUMxQixJQUFJO0FBQUEsRUFDSixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxZQUFZO0FBQUEsRUFDWixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxRQUFRO0FBQUEsRUFDUixPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixhQUFhO0FBQUEsRUFDYixLQUFLO0FBQUEsRUFDTCxDQUFDLE9BQU8sV0FBVyxvQkFBb0IsT0FBTztBQUNoRDs7O0FDOURPLG9CQUFvQixHQUFHO0FBQzVCLFNBQVMsT0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUssTUFBSyxLQUFLLElBQUksSUFBSSxLQUFLO0FBQzlEOzs7QUNMQSxJQUFJLGdCQUFnQjtBQUFBLEVBQ2xCLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLE1BQU07QUFDUjtBQUVBLGlCQUFpQixNQUFNLEtBQUk7QUFDekIsTUFBSTtBQUNKLFNBQU8sQ0FBRSxVQUFTLEtBQUssaUJBQWlCLENBQUUsVUFBUyxPQUFPLE9BQU07QUFDOUQsUUFBSSxDQUFFLFFBQU8sS0FBSyxhQUFhO0FBQzdCLFlBQU0sSUFBSSxNQUFNLGNBQWMsZUFBYztBQUFBLElBQzlDO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVlLDZCQUFTLE1BQU07QUFDNUIsTUFBSSxLQUNBO0FBRUosTUFBSSxnQkFBZ0IsWUFBWTtBQUM5QixVQUFLLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUM3QixPQUFPO0FBQ0wsVUFBSyxNQUFNLEdBQUksVUFBUyxlQUFlLE9BQU8sSUFBSSxHQUFHLE9BQU8sUUFBUSxPQUFPLE9BQU8sT0FBTztBQUFBLEVBQzNGO0FBRUEsV0FBUyxTQUFTLEtBQUssU0FBUyxLQUFJLE9BQU8sUUFBUSxJQUFJLEdBQUcsSUFBSSxJQUFHLEVBQUUsR0FBRztBQUNwRSxhQUFTLFFBQVEsT0FBTyxJQUFJLElBQUksTUFBTSxRQUFRLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDckUsVUFBSSxPQUFPLE1BQU0sSUFBSTtBQUNuQix5QkFBUyxNQUFNLE1BQU0sS0FBSSxHQUFHLE9BQU8sVUFBVSxRQUFRLE1BQU0sR0FBRSxDQUFDO0FBQUEsTUFDaEU7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sSUFBSSxXQUFXLFFBQVEsS0FBSyxVQUFVLE1BQU0sR0FBRTtBQUN2RDs7O0FDckNBLGtCQUFVLFVBQVUsWUFBWTtBQUNoQyxrQkFBVSxVQUFVLGFBQWE7OztBQ1NqQyxJQUFNLEVBQUMsS0FBSyxXQUFLLFFBQU87QUFFeEIsaUJBQWlCLEdBQUc7QUFDbEIsU0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCO0FBRUEsaUJBQWlCLEdBQUc7QUFDbEIsU0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsUUFBUSxFQUFFLEVBQUUsQ0FBQztBQUN0QztBQUVBLElBQUksSUFBSTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sU0FBUyxDQUFDLEtBQUssR0FBRyxFQUFFLElBQUksSUFBSTtBQUFBLEVBQzVCLE9BQU8sU0FBUyxJQUFHLEdBQUc7QUFBRSxXQUFPLE1BQUssT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUFBLEVBQUc7QUFBQSxFQUN4RixRQUFRLFNBQVMsSUFBSTtBQUFFLFdBQU8sTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQUEsRUFBRztBQUM1RDtBQUVBLElBQUksSUFBSTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sU0FBUyxDQUFDLEtBQUssR0FBRyxFQUFFLElBQUksSUFBSTtBQUFBLEVBQzVCLE9BQU8sU0FBUyxJQUFHLEdBQUc7QUFBRSxXQUFPLE1BQUssT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFFLEVBQUUsQ0FBQztBQUFBLEVBQUc7QUFBQSxFQUN4RixRQUFRLFNBQVMsSUFBSTtBQUFFLFdBQU8sTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQUEsRUFBRztBQUM1RDtBQUVBLElBQUksS0FBSztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sU0FBUyxDQUFDLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxNQUFNLE1BQU0sSUFBSSxFQUFFLElBQUksSUFBSTtBQUFBLEVBQzlELE9BQU8sU0FBUyxJQUFJO0FBQUUsV0FBTyxNQUFNLE9BQU8sT0FBTyxRQUFRLEVBQUU7QUFBQSxFQUFHO0FBQUEsRUFDOUQsUUFBUSxTQUFTLElBQUk7QUFBRSxXQUFPO0FBQUEsRUFBSTtBQUNwQztBQTJEQSxjQUFjLEdBQUc7QUFDZixTQUFPLEVBQUMsTUFBTSxFQUFDO0FBQ2pCOzs7QUN4R0EsSUFBTSxLQUFLLEtBQUs7QUFBaEIsSUFDSSxNQUFNLElBQUk7QUFEZCxJQUVJLFVBQVU7QUFGZCxJQUdJLGFBQWEsTUFBTTtBQUV2QixnQkFBZ0I7QUFDZCxPQUFLLE1BQU0sS0FBSyxNQUNoQixLQUFLLE1BQU0sS0FBSyxNQUFNO0FBQ3RCLE9BQUssSUFBSTtBQUNYO0FBRUEsZ0JBQWdCO0FBQ2QsU0FBTyxJQUFJO0FBQ2I7QUFFQSxLQUFLLFlBQVksS0FBSyxZQUFZO0FBQUEsRUFDaEMsYUFBYTtBQUFBLEVBQ2IsUUFBUSxTQUFTLElBQUcsSUFBRztBQUNyQixTQUFLLEtBQUssTUFBTyxNQUFLLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBSyxNQUFPLE1BQUssTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQzdFO0FBQUEsRUFDQSxXQUFXLFdBQVc7QUFDcEIsUUFBSSxLQUFLLFFBQVEsTUFBTTtBQUNyQixXQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLO0FBQ3JDLFdBQUssS0FBSztBQUFBLElBQ1o7QUFBQSxFQUNGO0FBQUEsRUFDQSxRQUFRLFNBQVMsSUFBRyxJQUFHO0FBQ3JCLFNBQUssS0FBSyxNQUFPLE1BQUssTUFBTSxDQUFDLE1BQUssTUFBTyxNQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3ZEO0FBQUEsRUFDQSxrQkFBa0IsU0FBUyxJQUFJLElBQUksSUFBRyxJQUFHO0FBQ3ZDLFNBQUssS0FBSyxNQUFPLENBQUMsS0FBTSxNQUFPLENBQUMsS0FBTSxNQUFPLE1BQUssTUFBTSxDQUFDLE1BQUssTUFBTyxNQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ25GO0FBQUEsRUFDQSxlQUFlLFNBQVMsSUFBSSxJQUFJLEtBQUksS0FBSSxJQUFHLElBQUc7QUFDNUMsU0FBSyxLQUFLLE1BQU8sQ0FBQyxLQUFNLE1BQU8sQ0FBQyxLQUFNLE1BQU8sQ0FBQyxNQUFNLE1BQU8sQ0FBQyxNQUFNLE1BQU8sTUFBSyxNQUFNLENBQUMsTUFBSyxNQUFPLE1BQUssTUFBTSxDQUFDO0FBQUEsRUFDL0c7QUFBQSxFQUNBLE9BQU8sU0FBUyxJQUFJLElBQUksS0FBSSxLQUFJLEdBQUc7QUFDakMsU0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksTUFBSyxDQUFDLEtBQUksTUFBSyxDQUFDLEtBQUksSUFBSSxDQUFDO0FBQzdDLFFBQUksS0FBSyxLQUFLLEtBQ1YsS0FBSyxLQUFLLEtBQ1YsTUFBTSxNQUFLLElBQ1gsTUFBTSxNQUFLLElBQ1gsTUFBTSxLQUFLLElBQ1gsTUFBTSxLQUFLLElBQ1gsUUFBUSxNQUFNLE1BQU0sTUFBTTtBQUc5QixRQUFJLElBQUk7QUFBRyxZQUFNLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUdsRCxRQUFJLEtBQUssUUFBUSxNQUFNO0FBQ3JCLFdBQUssS0FBSyxNQUFPLE1BQUssTUFBTSxNQUFNLE1BQU8sTUFBSyxNQUFNO0FBQUEsSUFDdEQsV0FHUyxDQUFFLFNBQVE7QUFBUztBQUFBLGFBS25CLENBQUUsTUFBSyxJQUFJLE1BQU0sTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRztBQUMzRCxXQUFLLEtBQUssTUFBTyxNQUFLLE1BQU0sTUFBTSxNQUFPLE1BQUssTUFBTTtBQUFBLElBQ3RELE9BR0s7QUFDSCxVQUFJLE1BQU0sTUFBSyxJQUNYLE1BQU0sTUFBSyxJQUNYLFFBQVEsTUFBTSxNQUFNLE1BQU0sS0FDMUIsUUFBUSxNQUFNLE1BQU0sTUFBTSxLQUMxQixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQ3JCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FDckIsSUFBSSxJQUFJLEtBQUssSUFBSyxNQUFLLEtBQUssS0FBTSxTQUFRLFFBQVEsU0FBVSxLQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FDaEYsTUFBTSxJQUFJLEtBQ1YsTUFBTSxJQUFJO0FBR2QsVUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksU0FBUztBQUMvQixhQUFLLEtBQUssTUFBTyxNQUFLLE1BQU0sT0FBTyxNQUFPLE1BQUssTUFBTTtBQUFBLE1BQ3ZEO0FBRUEsV0FBSyxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksVUFBVyxDQUFFLE9BQU0sTUFBTSxNQUFNLE9BQVEsTUFBTyxNQUFLLE1BQU0sS0FBSyxNQUFNLE9BQU8sTUFBTyxNQUFLLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDeEk7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLLFNBQVMsSUFBRyxJQUFHLEdBQUcsSUFBSSxJQUFJLEtBQUs7QUFDbEMsU0FBSSxDQUFDLElBQUcsS0FBSSxDQUFDLElBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDaEMsUUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEVBQUUsR0FDcEIsS0FBSyxJQUFJLEtBQUssSUFBSSxFQUFFLEdBQ3BCLEtBQUssS0FBSSxJQUNULEtBQUssS0FBSSxJQUNULEtBQUssSUFBSSxLQUNULEtBQUssTUFBTSxLQUFLLEtBQUssS0FBSztBQUc5QixRQUFJLElBQUk7QUFBRyxZQUFNLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUdsRCxRQUFJLEtBQUssUUFBUSxNQUFNO0FBQ3JCLFdBQUssS0FBSyxNQUFNLEtBQUssTUFBTTtBQUFBLElBQzdCLFdBR1MsS0FBSyxJQUFJLEtBQUssTUFBTSxFQUFFLElBQUksV0FBVyxLQUFLLElBQUksS0FBSyxNQUFNLEVBQUUsSUFBSSxTQUFTO0FBQy9FLFdBQUssS0FBSyxNQUFNLEtBQUssTUFBTTtBQUFBLElBQzdCO0FBR0EsUUFBSSxDQUFDO0FBQUc7QUFHUixRQUFJLEtBQUs7QUFBRyxXQUFLLEtBQUssTUFBTTtBQUc1QixRQUFJLEtBQUssWUFBWTtBQUNuQixXQUFLLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxVQUFVLEtBQUssTUFBTyxNQUFJLE1BQU0sTUFBTyxNQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sSUFBSSxVQUFVLEtBQUssTUFBTyxNQUFLLE1BQU0sTUFBTSxNQUFPLE1BQUssTUFBTTtBQUFBLElBQzlKLFdBR1MsS0FBSyxTQUFTO0FBQ3JCLFdBQUssS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLFFBQVMsQ0FBRSxPQUFNLE1BQU8sTUFBTSxLQUFLLE1BQU8sTUFBSyxNQUFNLEtBQUksSUFBSSxLQUFLLElBQUksRUFBRSxLQUFLLE1BQU8sTUFBSyxNQUFNLEtBQUksSUFBSSxLQUFLLElBQUksRUFBRTtBQUFBLElBQ2xKO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTSxTQUFTLElBQUcsSUFBRyxHQUFHLEdBQUc7QUFDekIsU0FBSyxLQUFLLE1BQU8sTUFBSyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQUssTUFBTyxNQUFLLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBSyxNQUFPLENBQUMsSUFBSyxNQUFPLENBQUMsSUFBSyxNQUFPLENBQUMsSUFBSztBQUFBLEVBQ3pIO0FBQUEsRUFDQSxVQUFVLFdBQVc7QUFDbkIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUNGO0FBRUEsSUFBTyxlQUFROzs7QUNqSUEsd0JBQVMsSUFBRyxJQUFHO0FBQzVCLE1BQUksT0FBTyxXQUFXO0FBRXRCLE1BQUksTUFBSztBQUFNLFNBQUk7QUFDbkIsTUFBSSxNQUFLO0FBQU0sU0FBSTtBQUVuQixtQkFBaUI7QUFDZixRQUFJLEdBQ0EsSUFBSSxNQUFNLFFBQ1YsTUFDQSxLQUFLLEdBQ0wsS0FBSztBQUVULFNBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEIsYUFBTyxNQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLO0FBQUEsSUFDNUM7QUFFQSxTQUFLLEtBQU0sTUFBSyxJQUFJLE1BQUssVUFBVSxLQUFNLE1BQUssSUFBSSxNQUFLLFVBQVUsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDbEYsYUFBTyxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLO0FBQUEsSUFDM0M7QUFBQSxFQUNGO0FBRUEsUUFBTSxhQUFhLFNBQVMsR0FBRztBQUM3QixZQUFRO0FBQUEsRUFDVjtBQUVBLFFBQU0sSUFBSSxTQUFTLEdBQUc7QUFDcEIsV0FBTyxVQUFVLFNBQVUsTUFBSSxDQUFDLEdBQUcsU0FBUztBQUFBLEVBQzlDO0FBRUEsUUFBTSxJQUFJLFNBQVMsR0FBRztBQUNwQixXQUFPLFVBQVUsU0FBVSxNQUFJLENBQUMsR0FBRyxTQUFTO0FBQUEsRUFDOUM7QUFFQSxRQUFNLFdBQVcsU0FBUyxHQUFHO0FBQzNCLFdBQU8sVUFBVSxTQUFVLFlBQVcsQ0FBQyxHQUFHLFNBQVM7QUFBQSxFQUNyRDtBQUVBLFNBQU87QUFDVDs7O0FDdkNlLHFCQUFTLEdBQUc7QUFDekIsUUFBTSxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssTUFBTSxDQUFDLEdBQzNCLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxNQUFNLENBQUM7QUFDN0IsU0FBTyxJQUFJLEtBQUssTUFBTSxJQUFHLEVBQUMsR0FBRyxJQUFHLElBQUcsQ0FBQztBQUN0QztBQUVBLGFBQWEsTUFBTSxJQUFHLElBQUcsR0FBRztBQUMxQixNQUFJLE1BQU0sRUFBQyxLQUFLLE1BQU0sRUFBQztBQUFHLFdBQU87QUFFakMsTUFBSSxRQUNBLE9BQU8sS0FBSyxPQUNaLE9BQU8sRUFBQyxNQUFNLEVBQUMsR0FDZixLQUFLLEtBQUssS0FDVixLQUFLLEtBQUssS0FDVixLQUFLLEtBQUssS0FDVixLQUFLLEtBQUssS0FDVixJQUNBLElBQ0EsSUFDQSxJQUNBLE9BQ0EsUUFDQSxHQUNBO0FBR0osTUFBSSxDQUFDO0FBQU0sV0FBTyxLQUFLLFFBQVEsTUFBTTtBQUdyQyxTQUFPLEtBQUssUUFBUTtBQUNsQixRQUFJLFFBQVEsTUFBTSxNQUFNLE1BQUssTUFBTTtBQUFJLFdBQUs7QUFBQTtBQUFTLFdBQUs7QUFDMUQsUUFBSSxTQUFTLE1BQU0sTUFBTSxNQUFLLE1BQU07QUFBSSxXQUFLO0FBQUE7QUFBUyxXQUFLO0FBQzNELFFBQUksU0FBUyxNQUFNLENBQUUsUUFBTyxLQUFLLElBQUksVUFBVSxJQUFJO0FBQVMsYUFBTyxPQUFPLEtBQUssTUFBTTtBQUFBLEVBQ3ZGO0FBR0EsT0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQ2xDLE9BQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUNsQyxNQUFJLE9BQU0sTUFBTSxPQUFNO0FBQUksV0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLE9BQU8sS0FBSyxPQUFPLEtBQUssUUFBUSxNQUFNO0FBR2xHLEtBQUc7QUFDRCxhQUFTLFNBQVMsT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDO0FBQ3JFLFFBQUksUUFBUSxNQUFNLE1BQU0sTUFBSyxNQUFNO0FBQUksV0FBSztBQUFBO0FBQVMsV0FBSztBQUMxRCxRQUFJLFNBQVMsTUFBTSxNQUFNLE1BQUssTUFBTTtBQUFJLFdBQUs7QUFBQTtBQUFTLFdBQUs7QUFBQSxFQUM3RCxTQUFVLEtBQUksVUFBVSxJQUFJLFdBQVksS0FBSyxPQUFNLE9BQU8sSUFBSyxNQUFNO0FBQ3JFLFNBQU8sT0FBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU07QUFDN0M7QUFFTyxnQkFBZ0IsTUFBTTtBQUMzQixNQUFJLEdBQUcsR0FBRyxJQUFJLEtBQUssUUFDZixJQUNBLElBQ0EsS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUNoQixLQUFLLElBQUksTUFBTSxDQUFDLEdBQ2hCLEtBQUssVUFDTCxLQUFLLFVBQ0wsS0FBSyxXQUNMLEtBQUs7QUFHVCxPQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ3RCLFFBQUksTUFBTSxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDLEtBQUssTUFBTSxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBRztBQUN0RixPQUFHLEtBQUs7QUFDUixPQUFHLEtBQUs7QUFDUixRQUFJLEtBQUk7QUFBSSxXQUFLO0FBQ2pCLFFBQUksS0FBSTtBQUFJLFdBQUs7QUFDakIsUUFBSSxLQUFJO0FBQUksV0FBSztBQUNqQixRQUFJLEtBQUk7QUFBSSxXQUFLO0FBQUEsRUFDbkI7QUFHQSxNQUFJLEtBQUssTUFBTSxLQUFLO0FBQUksV0FBTztBQUcvQixPQUFLLE1BQU0sSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLEVBQUU7QUFHL0IsT0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUN0QixRQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUU7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFDVDs7O0FDbkZlLHVCQUFTLElBQUcsSUFBRztBQUM1QixNQUFJLE1BQU0sS0FBSSxDQUFDLEVBQUMsS0FBSyxNQUFNLEtBQUksQ0FBQyxFQUFDO0FBQUcsV0FBTztBQUUzQyxNQUFJLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSztBQUtkLE1BQUksTUFBTSxFQUFFLEdBQUc7QUFDYixTQUFNLE1BQUssS0FBSyxNQUFNLEVBQUMsS0FBSztBQUM1QixTQUFNLE1BQUssS0FBSyxNQUFNLEVBQUMsS0FBSztBQUFBLEVBQzlCLE9BR0s7QUFDSCxRQUFJLElBQUksS0FBSyxNQUFNLEdBQ2YsT0FBTyxLQUFLLE9BQ1osUUFDQTtBQUVKLFdBQU8sS0FBSyxNQUFLLE1BQUssTUFBTSxLQUFLLE1BQUssTUFBSyxJQUFJO0FBQzdDLFVBQUssTUFBSSxPQUFPLElBQUssS0FBSTtBQUN6QixlQUFTLElBQUksTUFBTSxDQUFDLEdBQUcsT0FBTyxLQUFLLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFDN0QsY0FBUTtBQUFBLGFBQ0Q7QUFBRyxlQUFLLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBRztBQUFBLGFBQzdCO0FBQUcsZUFBSyxLQUFLLEdBQUcsS0FBSyxLQUFLO0FBQUc7QUFBQSxhQUM3QjtBQUFHLGVBQUssS0FBSyxHQUFHLEtBQUssS0FBSztBQUFHO0FBQUEsYUFDN0I7QUFBRyxlQUFLLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBRztBQUFBO0FBQUEsSUFFdEM7QUFFQSxRQUFJLEtBQUssU0FBUyxLQUFLLE1BQU07QUFBUSxXQUFLLFFBQVE7QUFBQSxFQUNwRDtBQUVBLE9BQUssTUFBTTtBQUNYLE9BQUssTUFBTTtBQUNYLE9BQUssTUFBTTtBQUNYLE9BQUssTUFBTTtBQUNYLFNBQU87QUFDVDs7O0FDMUNlLHlCQUFXO0FBQ3hCLE1BQUksT0FBTyxDQUFDO0FBQ1osT0FBSyxNQUFNLFNBQVMsTUFBTTtBQUN4QixRQUFJLENBQUMsS0FBSztBQUFRO0FBQUcsYUFBSyxLQUFLLEtBQUssSUFBSTtBQUFBLGFBQVUsT0FBTyxLQUFLO0FBQUEsRUFDaEUsQ0FBQztBQUNELFNBQU87QUFDVDs7O0FDTmUsd0JBQVMsR0FBRztBQUN6QixTQUFPLFVBQVUsU0FDWCxLQUFLLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFZLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHLENBQUM7QUFDakY7OztBQ0plLHNCQUFTLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSTtBQUM1QyxPQUFLLE9BQU87QUFDWixPQUFLLEtBQUs7QUFDVixPQUFLLEtBQUs7QUFDVixPQUFLLEtBQUs7QUFDVixPQUFLLEtBQUs7QUFDWjs7O0FDSmUsc0JBQVMsSUFBRyxJQUFHLFFBQVE7QUFDcEMsTUFBSSxNQUNBLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSyxLQUNWLElBQ0EsSUFDQSxLQUNBLEtBQ0EsTUFBSyxLQUFLLEtBQ1YsTUFBSyxLQUFLLEtBQ1YsUUFBUSxDQUFDLEdBQ1QsT0FBTyxLQUFLLE9BQ1osR0FDQTtBQUVKLE1BQUk7QUFBTSxVQUFNLEtBQUssSUFBSSxhQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUksR0FBRSxDQUFDO0FBQ25ELE1BQUksVUFBVTtBQUFNLGFBQVM7QUFBQSxPQUN4QjtBQUNILFNBQUssS0FBSSxRQUFRLEtBQUssS0FBSTtBQUMxQixVQUFLLEtBQUksUUFBUSxNQUFLLEtBQUk7QUFDMUIsY0FBVTtBQUFBLEVBQ1o7QUFFQSxTQUFPLElBQUksTUFBTSxJQUFJLEdBQUc7QUFHdEIsUUFBSSxDQUFFLFFBQU8sRUFBRSxTQUNQLE1BQUssRUFBRSxNQUFNLE9BQ2IsTUFBSyxFQUFFLE1BQU0sT0FDYixPQUFLLEVBQUUsTUFBTSxNQUNiLE9BQUssRUFBRSxNQUFNO0FBQUk7QUFHekIsUUFBSSxLQUFLLFFBQVE7QUFDZixVQUFJLEtBQU0sTUFBSyxPQUFNLEdBQ2pCLEtBQU0sTUFBSyxPQUFNO0FBRXJCLFlBQU0sS0FDSixJQUFJLGFBQUssS0FBSyxJQUFJLElBQUksSUFBSSxLQUFJLEdBQUUsR0FDaEMsSUFBSSxhQUFLLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxHQUFFLEdBQ2hDLElBQUksYUFBSyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUksRUFBRSxHQUNoQyxJQUFJLGFBQUssS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FDbEM7QUFHQSxVQUFJLElBQUssT0FBSyxPQUFPLElBQUssTUFBSyxJQUFLO0FBQ2xDLFlBQUksTUFBTSxNQUFNLFNBQVM7QUFDekIsY0FBTSxNQUFNLFNBQVMsS0FBSyxNQUFNLE1BQU0sU0FBUyxJQUFJO0FBQ25ELGNBQU0sTUFBTSxTQUFTLElBQUksS0FBSztBQUFBLE1BQ2hDO0FBQUEsSUFDRixPQUdLO0FBQ0gsVUFBSSxLQUFLLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUN0QyxLQUFLLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUN0QyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ3hCLFVBQUksS0FBSyxRQUFRO0FBQ2YsWUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDN0IsYUFBSyxLQUFJLEdBQUcsS0FBSyxLQUFJO0FBQ3JCLGNBQUssS0FBSSxHQUFHLE1BQUssS0FBSTtBQUNyQixlQUFPLEtBQUs7QUFBQSxNQUNkO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7OztBQ3JFZSx5QkFBUyxHQUFHO0FBQ3pCLE1BQUksTUFBTSxLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEtBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUFHLFdBQU87QUFFbkYsTUFBSSxRQUNBLE9BQU8sS0FBSyxPQUNaLFVBQ0EsVUFDQSxNQUNBLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSyxLQUNWLEtBQUssS0FBSyxLQUNWLElBQ0EsSUFDQSxJQUNBLElBQ0EsT0FDQSxRQUNBLEdBQ0E7QUFHSixNQUFJLENBQUM7QUFBTSxXQUFPO0FBSWxCLE1BQUksS0FBSztBQUFRLFdBQU8sTUFBTTtBQUM1QixVQUFJLFFBQVEsTUFBTSxNQUFNLE1BQUssTUFBTTtBQUFJLGFBQUs7QUFBQTtBQUFTLGFBQUs7QUFDMUQsVUFBSSxTQUFTLE1BQU0sTUFBTSxNQUFLLE1BQU07QUFBSSxhQUFLO0FBQUE7QUFBUyxhQUFLO0FBQzNELFVBQUksQ0FBRSxVQUFTLE1BQU0sT0FBTyxLQUFLLElBQUksVUFBVSxJQUFJO0FBQVMsZUFBTztBQUNuRSxVQUFJLENBQUMsS0FBSztBQUFRO0FBQ2xCLFVBQUksT0FBUSxJQUFJLElBQUssTUFBTSxPQUFRLElBQUksSUFBSyxNQUFNLE9BQVEsSUFBSSxJQUFLO0FBQUksbUJBQVcsUUFBUSxJQUFJO0FBQUEsSUFDaEc7QUFHQSxTQUFPLEtBQUssU0FBUztBQUFHLFFBQUksQ0FBRSxZQUFXLE1BQU0sT0FBTyxLQUFLO0FBQU8sYUFBTztBQUN6RSxNQUFJLE9BQU8sS0FBSztBQUFNLFdBQU8sS0FBSztBQUdsQyxNQUFJO0FBQVUsV0FBUSxPQUFPLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxNQUFPO0FBRzNFLE1BQUksQ0FBQztBQUFRLFdBQU8sS0FBSyxRQUFRLE1BQU07QUFHdkMsU0FBTyxPQUFPLEtBQUssT0FBTyxPQUFPLE9BQU87QUFHeEMsTUFBSyxRQUFPLE9BQU8sTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNLE9BQU8sT0FDbkQsU0FBVSxRQUFPLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxPQUFPLE9BQ3hELENBQUMsS0FBSyxRQUFRO0FBQ25CLFFBQUk7QUFBVSxlQUFTLEtBQUs7QUFBQTtBQUN2QixXQUFLLFFBQVE7QUFBQSxFQUNwQjtBQUVBLFNBQU87QUFDVDtBQUVPLG1CQUFtQixNQUFNO0FBQzlCLFdBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLElBQUksR0FBRyxFQUFFO0FBQUcsU0FBSyxPQUFPLEtBQUssRUFBRTtBQUNoRSxTQUFPO0FBQ1Q7OztBQzdEZSx3QkFBVztBQUN4QixTQUFPLEtBQUs7QUFDZDs7O0FDRmUseUJBQVc7QUFDeEIsTUFBSSxPQUFPO0FBQ1gsT0FBSyxNQUFNLFNBQVMsTUFBTTtBQUN4QixRQUFJLENBQUMsS0FBSztBQUFRO0FBQUcsVUFBRTtBQUFBLGFBQWEsT0FBTyxLQUFLO0FBQUEsRUFDbEQsQ0FBQztBQUNELFNBQU87QUFDVDs7O0FDSmUsdUJBQVMsVUFBVTtBQUNoQyxNQUFJLFFBQVEsQ0FBQyxHQUFHLEdBQUcsT0FBTyxLQUFLLE9BQU8sT0FBTyxJQUFJLElBQUksSUFBSTtBQUN6RCxNQUFJO0FBQU0sVUFBTSxLQUFLLElBQUksYUFBSyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQzNFLFNBQU8sSUFBSSxNQUFNLElBQUksR0FBRztBQUN0QixRQUFJLENBQUMsU0FBUyxPQUFPLEVBQUUsTUFBTSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBRSxLQUFLLEtBQUssUUFBUTtBQUN2RixVQUFJLEtBQU0sTUFBSyxNQUFNLEdBQUcsS0FBTSxNQUFLLE1BQU07QUFDekMsVUFBSSxRQUFRLEtBQUs7QUFBSSxjQUFNLEtBQUssSUFBSSxhQUFLLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9ELFVBQUksUUFBUSxLQUFLO0FBQUksY0FBTSxLQUFLLElBQUksYUFBSyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUMvRCxVQUFJLFFBQVEsS0FBSztBQUFJLGNBQU0sS0FBSyxJQUFJLGFBQUssT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7QUFDL0QsVUFBSSxRQUFRLEtBQUs7QUFBSSxjQUFNLEtBQUssSUFBSSxhQUFLLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQUEsSUFDakU7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOzs7QUNiZSw0QkFBUyxVQUFVO0FBQ2hDLE1BQUksUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUc7QUFDM0IsTUFBSSxLQUFLO0FBQU8sVUFBTSxLQUFLLElBQUksYUFBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLENBQUM7QUFDdkYsU0FBTyxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQ3RCLFFBQUksT0FBTyxFQUFFO0FBQ2IsUUFBSSxLQUFLLFFBQVE7QUFDZixVQUFJLE9BQU8sS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksS0FBTSxNQUFLLE1BQU0sR0FBRyxLQUFNLE1BQUssTUFBTTtBQUM1RixVQUFJLFFBQVEsS0FBSztBQUFJLGNBQU0sS0FBSyxJQUFJLGFBQUssT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7QUFDL0QsVUFBSSxRQUFRLEtBQUs7QUFBSSxjQUFNLEtBQUssSUFBSSxhQUFLLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9ELFVBQUksUUFBUSxLQUFLO0FBQUksY0FBTSxLQUFLLElBQUksYUFBSyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUMvRCxVQUFJLFFBQVEsS0FBSztBQUFJLGNBQU0sS0FBSyxJQUFJLGFBQUssT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7QUFBQSxJQUNqRTtBQUNBLFNBQUssS0FBSyxDQUFDO0FBQUEsRUFDYjtBQUNBLFNBQU8sSUFBSSxLQUFLLElBQUksR0FBRztBQUNyQixhQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7QUFBQSxFQUN6QztBQUNBLFNBQU87QUFDVDs7O0FDcEJPLGtCQUFrQixHQUFHO0FBQzFCLFNBQU8sRUFBRTtBQUNYO0FBRWUsbUJBQVMsR0FBRztBQUN6QixTQUFPLFVBQVUsU0FBVSxNQUFLLEtBQUssR0FBRyxRQUFRLEtBQUs7QUFDdkQ7OztBQ05PLGtCQUFrQixHQUFHO0FBQzFCLFNBQU8sRUFBRTtBQUNYO0FBRWUsbUJBQVMsR0FBRztBQUN6QixTQUFPLFVBQVUsU0FBVSxNQUFLLEtBQUssR0FBRyxRQUFRLEtBQUs7QUFDdkQ7OztBQ09lLGtCQUFrQixPQUFPLElBQUcsSUFBRztBQUM1QyxNQUFJLE9BQU8sSUFBSSxTQUFTLE1BQUssT0FBTyxXQUFXLElBQUcsTUFBSyxPQUFPLFdBQVcsSUFBRyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQzlGLFNBQU8sU0FBUyxPQUFPLE9BQU8sS0FBSyxPQUFPLEtBQUs7QUFDakQ7QUFFQSxrQkFBa0IsSUFBRyxJQUFHLElBQUksSUFBSSxJQUFJLElBQUk7QUFDdEMsT0FBSyxLQUFLO0FBQ1YsT0FBSyxLQUFLO0FBQ1YsT0FBSyxNQUFNO0FBQ1gsT0FBSyxNQUFNO0FBQ1gsT0FBSyxNQUFNO0FBQ1gsT0FBSyxNQUFNO0FBQ1gsT0FBSyxRQUFRO0FBQ2Y7QUFFQSxtQkFBbUIsTUFBTTtBQUN2QixNQUFJLFFBQU8sRUFBQyxNQUFNLEtBQUssS0FBSSxHQUFHLE9BQU87QUFDckMsU0FBTyxPQUFPLEtBQUs7QUFBTSxXQUFPLEtBQUssT0FBTyxFQUFDLE1BQU0sS0FBSyxLQUFJO0FBQzVELFNBQU87QUFDVDtBQUVBLElBQUksWUFBWSxTQUFTLFlBQVksU0FBUztBQUU5QyxVQUFVLE9BQU8sV0FBVztBQUMxQixNQUFJLFFBQU8sSUFBSSxTQUFTLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLEdBQzVFLE9BQU8sS0FBSyxPQUNaLE9BQ0E7QUFFSixNQUFJLENBQUM7QUFBTSxXQUFPO0FBRWxCLE1BQUksQ0FBQyxLQUFLO0FBQVEsV0FBTyxNQUFLLFFBQVEsVUFBVSxJQUFJLEdBQUc7QUFFdkQsVUFBUSxDQUFDLEVBQUMsUUFBUSxNQUFNLFFBQVEsTUFBSyxRQUFRLElBQUksTUFBTSxDQUFDLEVBQUMsQ0FBQztBQUMxRCxTQUFPLE9BQU8sTUFBTSxJQUFJLEdBQUc7QUFDekIsYUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUMxQixVQUFJLFFBQVEsS0FBSyxPQUFPLElBQUk7QUFDMUIsWUFBSSxNQUFNO0FBQVEsZ0JBQU0sS0FBSyxFQUFDLFFBQVEsT0FBTyxRQUFRLEtBQUssT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDLEVBQUMsQ0FBQztBQUFBO0FBQzlFLGVBQUssT0FBTyxLQUFLLFVBQVUsS0FBSztBQUFBLE1BQ3ZDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxVQUFVLE1BQU07QUFDaEIsVUFBVSxTQUFTO0FBQ25CLFVBQVUsUUFBUTtBQUNsQixVQUFVLE9BQU87QUFDakIsVUFBVSxTQUFTO0FBQ25CLFVBQVUsT0FBTztBQUNqQixVQUFVLFNBQVM7QUFDbkIsVUFBVSxZQUFZO0FBQ3RCLFVBQVUsT0FBTztBQUNqQixVQUFVLE9BQU87QUFDakIsVUFBVSxRQUFRO0FBQ2xCLFVBQVUsYUFBYTtBQUN2QixVQUFVLElBQUk7QUFDZCxVQUFVLElBQUk7OztBQ3hFQywyQkFBUyxJQUFHO0FBQ3pCLFNBQU8sV0FBVztBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNKZSx3QkFBUyxRQUFRO0FBQzlCLFNBQVEsUUFBTyxJQUFJLE9BQU87QUFDNUI7OztBQ0VBLFdBQVcsR0FBRztBQUNaLFNBQU8sRUFBRSxJQUFJLEVBQUU7QUFDakI7QUFFQSxXQUFXLEdBQUc7QUFDWixTQUFPLEVBQUUsSUFBSSxFQUFFO0FBQ2pCO0FBRWUseUJBQVMsUUFBUTtBQUM5QixNQUFJLE9BQ0EsT0FDQSxRQUNBLFdBQVcsR0FDWCxhQUFhO0FBRWpCLE1BQUksT0FBTyxXQUFXO0FBQVksYUFBUyxrQkFBUyxVQUFVLE9BQU8sSUFBSSxDQUFDLE1BQU07QUFFaEYsbUJBQWlCO0FBQ2YsUUFBSSxHQUFHLElBQUksTUFBTSxRQUNiLE1BQ0EsTUFDQSxJQUNBLElBQ0EsSUFDQTtBQUVKLGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxFQUFFLEdBQUc7QUFDbkMsYUFBTyxTQUFTLE9BQU8sR0FBRyxDQUFDLEVBQUUsV0FBVyxPQUFPO0FBQy9DLFdBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEIsZUFBTyxNQUFNO0FBQ2IsYUFBSyxNQUFNLEtBQUssUUFBUSxNQUFNLEtBQUs7QUFDbkMsYUFBSyxLQUFLLElBQUksS0FBSztBQUNuQixhQUFLLEtBQUssSUFBSSxLQUFLO0FBQ25CLGFBQUssTUFBTSxLQUFLO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBRUEsbUJBQWUsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQ25DLFVBQUksT0FBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLEdBQUcsSUFBSSxLQUFLO0FBQzVDLFVBQUksTUFBTTtBQUNSLFlBQUksS0FBSyxRQUFRLEtBQUssT0FBTztBQUMzQixjQUFJLEtBQUksS0FBSyxLQUFLLElBQUksS0FBSyxJQUN2QixLQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssSUFDdkIsSUFBSSxLQUFJLEtBQUksS0FBSTtBQUNwQixjQUFJLElBQUksSUFBSSxHQUFHO0FBQ2IsZ0JBQUksT0FBTTtBQUFHLG1CQUFJLGVBQU8sTUFBTSxHQUFHLEtBQUssS0FBSTtBQUMxQyxnQkFBSSxPQUFNO0FBQUcsbUJBQUksZUFBTyxNQUFNLEdBQUcsS0FBSyxLQUFJO0FBQzFDLGdCQUFLLEtBQUssS0FBSSxLQUFLLEtBQUssQ0FBQyxNQUFNLElBQUk7QUFDbkMsaUJBQUssTUFBTyxPQUFLLEtBQU0sS0FBSyxPQUFNLE1BQU8sT0FBTTtBQUMvQyxpQkFBSyxNQUFPLE9BQUssS0FBSztBQUN0QixpQkFBSyxNQUFNLEtBQUssS0FBSSxJQUFJO0FBQ3hCLGlCQUFLLE1BQU0sS0FBSTtBQUFBLFVBQ2pCO0FBQUEsUUFDRjtBQUNBO0FBQUEsTUFDRjtBQUNBLGFBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQUEsSUFDaEU7QUFBQSxFQUNGO0FBRUEsbUJBQWlCLE1BQU07QUFDckIsUUFBSSxLQUFLO0FBQU0sYUFBTyxLQUFLLElBQUksTUFBTSxLQUFLLEtBQUs7QUFDL0MsYUFBUyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDbkMsVUFBSSxLQUFLLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHO0FBQ2pDLGFBQUssSUFBSSxLQUFLLEdBQUc7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsd0JBQXNCO0FBQ3BCLFFBQUksQ0FBQztBQUFPO0FBQ1osUUFBSSxHQUFHLElBQUksTUFBTSxRQUFRO0FBQ3pCLFlBQVEsSUFBSSxNQUFNLENBQUM7QUFDbkIsU0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7QUFBRyxhQUFPLE1BQU0sSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sTUFBTSxHQUFHLEtBQUs7QUFBQSxFQUNyRjtBQUVBLFFBQU0sYUFBYSxTQUFTLFFBQVEsU0FBUztBQUMzQyxZQUFRO0FBQ1IsYUFBUztBQUNULGVBQVc7QUFBQSxFQUNiO0FBRUEsUUFBTSxhQUFhLFNBQVMsR0FBRztBQUM3QixXQUFPLFVBQVUsU0FBVSxjQUFhLENBQUMsR0FBRyxTQUFTO0FBQUEsRUFDdkQ7QUFFQSxRQUFNLFdBQVcsU0FBUyxHQUFHO0FBQzNCLFdBQU8sVUFBVSxTQUFVLFlBQVcsQ0FBQyxHQUFHLFNBQVM7QUFBQSxFQUNyRDtBQUVBLFFBQU0sU0FBUyxTQUFTLEdBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsVUFBUyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxTQUFTO0FBQUEsRUFDekc7QUFFQSxTQUFPO0FBQ1Q7OztBQ2hHQSxlQUFlLEdBQUc7QUFDaEIsU0FBTyxFQUFFO0FBQ1g7QUFFQSxlQUFjLFVBQVUsUUFBUTtBQUM5QixNQUFJLE9BQU8sU0FBUyxJQUFJLE1BQU07QUFDOUIsTUFBSSxDQUFDO0FBQU0sVUFBTSxJQUFJLE1BQU0scUJBQXFCLE1BQU07QUFDdEQsU0FBTztBQUNUO0FBRWUsc0JBQVMsT0FBTztBQUM3QixNQUFJLE1BQUssT0FDTCxXQUFXLGlCQUNYLFdBQ0EsV0FBVyxrQkFBUyxFQUFFLEdBQ3RCLFdBQ0EsT0FDQSxRQUNBLE1BQ0EsUUFDQSxhQUFhO0FBRWpCLE1BQUksU0FBUztBQUFNLFlBQVEsQ0FBQztBQUU1QiwyQkFBeUIsT0FBTTtBQUM3QixXQUFPLElBQUksS0FBSyxJQUFJLE9BQU0sTUFBSyxPQUFPLFFBQVEsT0FBTSxNQUFLLE9BQU8sTUFBTTtBQUFBLEVBQ3hFO0FBRUEsaUJBQWUsT0FBTztBQUNwQixhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxJQUFJLFlBQVksRUFBRSxHQUFHO0FBQ3JELGVBQVMsSUFBSSxHQUFHLE9BQU0sUUFBUSxRQUFRLElBQUcsSUFBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUM1RCxnQkFBTyxNQUFNLElBQUksU0FBUyxNQUFLLFFBQVEsU0FBUyxNQUFLO0FBQ3JELGFBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxPQUFPLElBQUksT0FBTyxNQUFNLGVBQU8sTUFBTTtBQUNoRSxhQUFJLE9BQU8sSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLE9BQU8sTUFBTSxlQUFPLE1BQU07QUFDaEUsWUFBSSxLQUFLLEtBQUssS0FBSSxLQUFJLEtBQUksRUFBQztBQUMzQixZQUFLLEtBQUksVUFBVSxNQUFNLElBQUksUUFBUSxVQUFVO0FBQy9DLGNBQUssR0FBRyxNQUFLO0FBQ2IsZUFBTyxNQUFNLEtBQUssS0FBSSxLQUFLO0FBQzNCLGVBQU8sTUFBTSxLQUFJO0FBQ2pCLGVBQU8sTUFBTSxLQUFLLEtBQUksSUFBSTtBQUMxQixlQUFPLE1BQU0sS0FBSTtBQUFBLE1BQ25CO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSx3QkFBc0I7QUFDcEIsUUFBSSxDQUFDO0FBQU87QUFFWixRQUFJLEdBQ0EsSUFBSSxNQUFNLFFBQ1YsS0FBSSxNQUFNLFFBQ1YsV0FBVyxJQUFJLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxPQUFNLENBQUMsSUFBRyxHQUFHLElBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQzVEO0FBRUosU0FBSyxJQUFJLEdBQUcsU0FBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBRyxFQUFFLEdBQUc7QUFDNUMsY0FBTyxNQUFNLElBQUksTUFBSyxRQUFRO0FBQzlCLFVBQUksT0FBTyxNQUFLLFdBQVc7QUFBVSxjQUFLLFNBQVMsTUFBSyxVQUFVLE1BQUssTUFBTTtBQUM3RSxVQUFJLE9BQU8sTUFBSyxXQUFXO0FBQVUsY0FBSyxTQUFTLE1BQUssVUFBVSxNQUFLLE1BQU07QUFDN0UsYUFBTSxNQUFLLE9BQU8sU0FBVSxRQUFNLE1BQUssT0FBTyxVQUFVLEtBQUs7QUFDN0QsYUFBTSxNQUFLLE9BQU8sU0FBVSxRQUFNLE1BQUssT0FBTyxVQUFVLEtBQUs7QUFBQSxJQUMvRDtBQUVBLFNBQUssSUFBSSxHQUFHLE9BQU8sSUFBSSxNQUFNLEVBQUMsR0FBRyxJQUFJLElBQUcsRUFBRSxHQUFHO0FBQzNDLGNBQU8sTUFBTSxJQUFJLEtBQUssS0FBSyxPQUFNLE1BQUssT0FBTyxTQUFVLFFBQU0sTUFBSyxPQUFPLFNBQVMsT0FBTSxNQUFLLE9BQU87QUFBQSxJQUN0RztBQUVBLGdCQUFZLElBQUksTUFBTSxFQUFDLEdBQUcsbUJBQW1CO0FBQzdDLGdCQUFZLElBQUksTUFBTSxFQUFDLEdBQUcsbUJBQW1CO0FBQUEsRUFDL0M7QUFFQSxnQ0FBOEI7QUFDNUIsUUFBSSxDQUFDO0FBQU87QUFFWixhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQzVDLGdCQUFVLEtBQUssQ0FBQyxTQUFTLE1BQU0sSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFFQSxnQ0FBOEI7QUFDNUIsUUFBSSxDQUFDO0FBQU87QUFFWixhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQzVDLGdCQUFVLEtBQUssQ0FBQyxTQUFTLE1BQU0sSUFBSSxHQUFHLEtBQUs7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQWEsU0FBUyxRQUFRLFNBQVM7QUFDM0MsWUFBUTtBQUNSLGFBQVM7QUFDVCxlQUFXO0FBQUEsRUFDYjtBQUVBLFFBQU0sUUFBUSxTQUFTLEdBQUc7QUFDeEIsV0FBTyxVQUFVLFNBQVUsU0FBUSxHQUFHLFdBQVcsR0FBRyxTQUFTO0FBQUEsRUFDL0Q7QUFFQSxRQUFNLEtBQUssU0FBUyxHQUFHO0FBQ3JCLFdBQU8sVUFBVSxTQUFVLE9BQUssR0FBRyxTQUFTO0FBQUEsRUFDOUM7QUFFQSxRQUFNLGFBQWEsU0FBUyxHQUFHO0FBQzdCLFdBQU8sVUFBVSxTQUFVLGNBQWEsQ0FBQyxHQUFHLFNBQVM7QUFBQSxFQUN2RDtBQUVBLFFBQU0sV0FBVyxTQUFTLEdBQUc7QUFDM0IsV0FBTyxVQUFVLFNBQVUsWUFBVyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixHQUFHLFNBQVM7QUFBQSxFQUNuSDtBQUVBLFFBQU0sV0FBVyxTQUFTLEdBQUc7QUFDM0IsV0FBTyxVQUFVLFNBQVUsWUFBVyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixHQUFHLFNBQVM7QUFBQSxFQUNuSDtBQUVBLFNBQU87QUFDVDs7O0FDbkhBLElBQU0sSUFBSTtBQUNWLElBQU0sSUFBSTtBQUNWLElBQU0sSUFBSTtBQUVLLHVCQUFXO0FBQ3hCLE1BQUksSUFBSTtBQUNSLFNBQU8sTUFBTyxLQUFLLEtBQUksSUFBSSxLQUFLLEtBQUs7QUFDdkM7OztBQ0pPLFlBQVcsR0FBRztBQUNuQixTQUFPLEVBQUU7QUFDWDtBQUVPLFlBQVcsR0FBRztBQUNuQixTQUFPLEVBQUU7QUFDWDtBQUVBLElBQUksZ0JBQWdCO0FBQXBCLElBQ0ksZUFBZSxLQUFLLEtBQU0sS0FBSSxLQUFLLEtBQUssQ0FBQztBQUU5Qiw0QkFBUyxPQUFPO0FBQzdCLE1BQUksWUFDQSxRQUFRLEdBQ1IsV0FBVyxNQUNYLGFBQWEsSUFBSSxLQUFLLElBQUksVUFBVSxJQUFJLEdBQUcsR0FDM0MsY0FBYyxHQUNkLGdCQUFnQixLQUNoQixTQUFTLG9CQUFJLElBQUksR0FDakIsVUFBVSxNQUFNLElBQUksR0FDcEIsUUFBUSxpQkFBUyxRQUFRLEtBQUssR0FDOUIsU0FBUyxZQUFJO0FBRWpCLE1BQUksU0FBUztBQUFNLFlBQVEsQ0FBQztBQUU1QixrQkFBZ0I7QUFDZCxVQUFLO0FBQ0wsVUFBTSxLQUFLLFFBQVEsVUFBVTtBQUM3QixRQUFJLFFBQVEsVUFBVTtBQUNwQixjQUFRLEtBQUs7QUFDYixZQUFNLEtBQUssT0FBTyxVQUFVO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBRUEsaUJBQWMsWUFBWTtBQUN4QixRQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVE7QUFFekIsUUFBSSxlQUFlO0FBQVcsbUJBQWE7QUFFM0MsYUFBUyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsR0FBRztBQUNuQyxlQUFVLGVBQWMsU0FBUztBQUVqQyxhQUFPLFFBQVEsU0FBUyxPQUFPO0FBQzdCLGNBQU0sS0FBSztBQUFBLE1BQ2IsQ0FBQztBQUVELFdBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEIsZUFBTyxNQUFNO0FBQ2IsWUFBSSxLQUFLLE1BQU07QUFBTSxlQUFLLEtBQUssS0FBSyxNQUFNO0FBQUE7QUFDckMsZUFBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFDakMsWUFBSSxLQUFLLE1BQU07QUFBTSxlQUFLLEtBQUssS0FBSyxNQUFNO0FBQUE7QUFDckMsZUFBSyxJQUFJLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLDZCQUEyQjtBQUN6QixhQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDbEQsYUFBTyxNQUFNLElBQUksS0FBSyxRQUFRO0FBQzlCLFVBQUksS0FBSyxNQUFNO0FBQU0sYUFBSyxJQUFJLEtBQUs7QUFDbkMsVUFBSSxLQUFLLE1BQU07QUFBTSxhQUFLLElBQUksS0FBSztBQUNuQyxVQUFJLE1BQU0sS0FBSyxDQUFDLEtBQUssTUFBTSxLQUFLLENBQUMsR0FBRztBQUNsQyxZQUFJLFNBQVMsZ0JBQWdCLEtBQUssS0FBSyxNQUFNLENBQUMsR0FBRyxRQUFRLElBQUk7QUFDN0QsYUFBSyxJQUFJLFNBQVMsS0FBSyxJQUFJLEtBQUs7QUFDaEMsYUFBSyxJQUFJLFNBQVMsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUNsQztBQUNBLFVBQUksTUFBTSxLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxHQUFHO0FBQ3BDLGFBQUssS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUN0QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsMkJBQXlCLE9BQU87QUFDOUIsUUFBSSxNQUFNO0FBQVksWUFBTSxXQUFXLE9BQU8sTUFBTTtBQUNwRCxXQUFPO0FBQUEsRUFDVDtBQUVBLGtCQUFnQjtBQUVoQixTQUFPLGFBQWE7QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFFTixTQUFTLFdBQVc7QUFDbEIsYUFBTyxRQUFRLFFBQVEsSUFBSSxHQUFHO0FBQUEsSUFDaEM7QUFBQSxJQUVBLE1BQU0sV0FBVztBQUNmLGFBQU8sUUFBUSxLQUFLLEdBQUc7QUFBQSxJQUN6QjtBQUFBLElBRUEsT0FBTyxTQUFTLEdBQUc7QUFDakIsYUFBTyxVQUFVLFNBQVUsU0FBUSxHQUFHLGdCQUFnQixHQUFHLE9BQU8sUUFBUSxlQUFlLEdBQUcsY0FBYztBQUFBLElBQzFHO0FBQUEsSUFFQSxPQUFPLFNBQVMsR0FBRztBQUNqQixhQUFPLFVBQVUsU0FBVSxTQUFRLENBQUMsR0FBRyxjQUFjO0FBQUEsSUFDdkQ7QUFBQSxJQUVBLFVBQVUsU0FBUyxHQUFHO0FBQ3BCLGFBQU8sVUFBVSxTQUFVLFlBQVcsQ0FBQyxHQUFHLGNBQWM7QUFBQSxJQUMxRDtBQUFBLElBRUEsWUFBWSxTQUFTLEdBQUc7QUFDdEIsYUFBTyxVQUFVLFNBQVUsY0FBYSxDQUFDLEdBQUcsY0FBYyxDQUFDO0FBQUEsSUFDN0Q7QUFBQSxJQUVBLGFBQWEsU0FBUyxHQUFHO0FBQ3ZCLGFBQU8sVUFBVSxTQUFVLGVBQWMsQ0FBQyxHQUFHLGNBQWM7QUFBQSxJQUM3RDtBQUFBLElBRUEsZUFBZSxTQUFTLEdBQUc7QUFDekIsYUFBTyxVQUFVLFNBQVUsaUJBQWdCLElBQUksR0FBRyxjQUFjLElBQUk7QUFBQSxJQUN0RTtBQUFBLElBRUEsY0FBYyxTQUFTLEdBQUc7QUFDeEIsYUFBTyxVQUFVLFNBQVUsVUFBUyxHQUFHLE9BQU8sUUFBUSxlQUFlLEdBQUcsY0FBYztBQUFBLElBQ3hGO0FBQUEsSUFFQSxPQUFPLFNBQVMsTUFBTSxHQUFHO0FBQ3ZCLGFBQU8sVUFBVSxTQUFTLElBQU0sTUFBSyxPQUFPLE9BQU8sT0FBTyxJQUFJLElBQUksT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUMsQ0FBQyxHQUFJLGNBQWMsT0FBTyxJQUFJLElBQUk7QUFBQSxJQUN4STtBQUFBLElBRUEsTUFBTSxTQUFTLElBQUcsSUFBRyxRQUFRO0FBQzNCLFVBQUksSUFBSSxHQUNKLElBQUksTUFBTSxRQUNWLElBQ0EsSUFDQSxJQUNBLE1BQ0E7QUFFSixVQUFJLFVBQVU7QUFBTSxpQkFBUztBQUFBO0FBQ3hCLGtCQUFVO0FBRWYsV0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUN0QixlQUFPLE1BQU07QUFDYixhQUFLLEtBQUksS0FBSztBQUNkLGFBQUssS0FBSSxLQUFLO0FBQ2QsYUFBSyxLQUFLLEtBQUssS0FBSztBQUNwQixZQUFJLEtBQUs7QUFBUSxvQkFBVSxNQUFNLFNBQVM7QUFBQSxNQUM1QztBQUVBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLFNBQVMsTUFBTSxHQUFHO0FBQ3BCLGFBQU8sVUFBVSxTQUFTLElBQUssT0FBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLGNBQWMsTUFBTSxHQUFHLElBQUk7QUFBQSxJQUMvRTtBQUFBLEVBQ0Y7QUFDRjs7O0FDdEplLDRCQUFXO0FBQ3hCLE1BQUksT0FDQSxNQUNBLFFBQ0EsT0FDQSxXQUFXLGtCQUFTLEdBQUcsR0FDdkIsV0FDQSxlQUFlLEdBQ2YsZUFBZSxVQUNmLFNBQVM7QUFFYixpQkFBZSxHQUFHO0FBQ2hCLFFBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxPQUFPLFNBQVMsT0FBTyxJQUFHLEVBQUMsRUFBRSxXQUFXLFVBQVU7QUFDM0UsU0FBSyxRQUFRLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO0FBQUcsYUFBTyxNQUFNLElBQUksS0FBSyxNQUFNLEtBQUs7QUFBQSxFQUN0RTtBQUVBLHdCQUFzQjtBQUNwQixRQUFJLENBQUM7QUFBTztBQUNaLFFBQUksR0FBRyxJQUFJLE1BQU0sUUFBUTtBQUN6QixnQkFBWSxJQUFJLE1BQU0sQ0FBQztBQUN2QixTQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRTtBQUFHLGNBQU8sTUFBTSxJQUFJLFVBQVUsTUFBSyxTQUFTLENBQUMsU0FBUyxPQUFNLEdBQUcsS0FBSztBQUFBLEVBQzNGO0FBRUEsc0JBQW9CLE1BQU07QUFDeEIsUUFBSSxZQUFXLEdBQUcsR0FBRyxJQUFHLFNBQVMsR0FBRyxJQUFHLElBQUc7QUFHMUMsUUFBSSxLQUFLLFFBQVE7QUFDZixXQUFLLEtBQUksS0FBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUM5QixZQUFLLEtBQUksS0FBSyxPQUFRLE1BQUksS0FBSyxJQUFJLEVBQUUsS0FBSyxJQUFJO0FBQzVDLHVCQUFZLEVBQUUsT0FBTyxVQUFVLElBQUcsTUFBSyxLQUFJLEVBQUUsR0FBRyxNQUFLLEtBQUksRUFBRTtBQUFBLFFBQzdEO0FBQUEsTUFDRjtBQUNBLFdBQUssSUFBSSxLQUFJO0FBQ2IsV0FBSyxJQUFJLEtBQUk7QUFBQSxJQUNmLE9BR0s7QUFDSCxVQUFJO0FBQ0osUUFBRSxJQUFJLEVBQUUsS0FBSztBQUNiLFFBQUUsSUFBSSxFQUFFLEtBQUs7QUFDYjtBQUFHLHFCQUFZLFVBQVUsRUFBRSxLQUFLO0FBQUEsYUFDekIsSUFBSSxFQUFFO0FBQUEsSUFDZjtBQUVBLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxNQUFNLElBQUksR0FBRyxLQUFJO0FBQzlCLFFBQUksQ0FBQyxLQUFLO0FBQU8sYUFBTztBQUV4QixRQUFJLEtBQUksS0FBSyxJQUFJLEtBQUssR0FDbEIsS0FBSSxLQUFLLElBQUksS0FBSyxHQUNsQixJQUFJLE1BQUssSUFDVCxJQUFJLEtBQUksS0FBSSxLQUFJO0FBSXBCLFFBQUksSUFBSSxJQUFJLFNBQVMsR0FBRztBQUN0QixVQUFJLElBQUksY0FBYztBQUNwQixZQUFJLE9BQU07QUFBRyxlQUFJLGVBQU8sTUFBTSxHQUFHLEtBQUssS0FBSTtBQUMxQyxZQUFJLE9BQU07QUFBRyxlQUFJLGVBQU8sTUFBTSxHQUFHLEtBQUssS0FBSTtBQUMxQyxZQUFJLElBQUk7QUFBYyxjQUFJLEtBQUssS0FBSyxlQUFlLENBQUM7QUFDcEQsYUFBSyxNQUFNLEtBQUksS0FBSyxRQUFRLFFBQVE7QUFDcEMsYUFBSyxNQUFNLEtBQUksS0FBSyxRQUFRLFFBQVE7QUFBQSxNQUN0QztBQUNBLGFBQU87QUFBQSxJQUNULFdBR1MsS0FBSyxVQUFVLEtBQUs7QUFBYztBQUczQyxRQUFJLEtBQUssU0FBUyxRQUFRLEtBQUssTUFBTTtBQUNuQyxVQUFJLE9BQU07QUFBRyxhQUFJLGVBQU8sTUFBTSxHQUFHLEtBQUssS0FBSTtBQUMxQyxVQUFJLE9BQU07QUFBRyxhQUFJLGVBQU8sTUFBTSxHQUFHLEtBQUssS0FBSTtBQUMxQyxVQUFJLElBQUk7QUFBYyxZQUFJLEtBQUssS0FBSyxlQUFlLENBQUM7QUFBQSxJQUN0RDtBQUVBO0FBQUcsVUFBSSxLQUFLLFNBQVMsTUFBTTtBQUN6QixZQUFJLFVBQVUsS0FBSyxLQUFLLFNBQVMsUUFBUTtBQUN6QyxhQUFLLE1BQU0sS0FBSTtBQUNmLGFBQUssTUFBTSxLQUFJO0FBQUEsTUFDakI7QUFBQSxXQUFTLE9BQU8sS0FBSztBQUFBLEVBQ3ZCO0FBRUEsUUFBTSxhQUFhLFNBQVMsUUFBUSxTQUFTO0FBQzNDLFlBQVE7QUFDUixhQUFTO0FBQ1QsZUFBVztBQUFBLEVBQ2I7QUFFQSxRQUFNLFdBQVcsU0FBUyxHQUFHO0FBQzNCLFdBQU8sVUFBVSxTQUFVLFlBQVcsT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsU0FBUztBQUFBLEVBQzNHO0FBRUEsUUFBTSxjQUFjLFNBQVMsR0FBRztBQUM5QixXQUFPLFVBQVUsU0FBVSxnQkFBZSxJQUFJLEdBQUcsU0FBUyxLQUFLLEtBQUssWUFBWTtBQUFBLEVBQ2xGO0FBRUEsUUFBTSxjQUFjLFNBQVMsR0FBRztBQUM5QixXQUFPLFVBQVUsU0FBVSxnQkFBZSxJQUFJLEdBQUcsU0FBUyxLQUFLLEtBQUssWUFBWTtBQUFBLEVBQ2xGO0FBRUEsUUFBTSxRQUFRLFNBQVMsR0FBRztBQUN4QixXQUFPLFVBQVUsU0FBVSxVQUFTLElBQUksR0FBRyxTQUFTLEtBQUssS0FBSyxNQUFNO0FBQUEsRUFDdEU7QUFFQSxTQUFPO0FBQ1Q7OztBQ25IZSwrQkFBUyxJQUFHO0FBQ3pCLFNBQU8sS0FBSyxJQUFJLEtBQUksS0FBSyxNQUFNLEVBQUMsQ0FBQyxLQUFLLE9BQ2hDLEdBQUUsZUFBZSxJQUFJLEVBQUUsUUFBUSxNQUFNLEVBQUUsSUFDdkMsR0FBRSxTQUFTLEVBQUU7QUFDckI7QUFLTyw0QkFBNEIsSUFBRyxHQUFHO0FBQ3ZDLE1BQUssS0FBSyxNQUFJLElBQUksR0FBRSxjQUFjLElBQUksQ0FBQyxJQUFJLEdBQUUsY0FBYyxHQUFHLFFBQVEsR0FBRyxLQUFLO0FBQUcsV0FBTztBQUN4RixNQUFJLEdBQUcsY0FBYyxHQUFFLE1BQU0sR0FBRyxDQUFDO0FBSWpDLFNBQU87QUFBQSxJQUNMLFlBQVksU0FBUyxJQUFJLFlBQVksS0FBSyxZQUFZLE1BQU0sQ0FBQyxJQUFJO0FBQUEsSUFDakUsQ0FBQyxHQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDaEI7QUFDRjs7O0FDakJlLDBCQUFTLElBQUc7QUFDekIsU0FBTyxLQUFJLG1CQUFtQixLQUFLLElBQUksRUFBQyxDQUFDLEdBQUcsS0FBSSxHQUFFLEtBQUs7QUFDekQ7OztBQ0plLDZCQUFTLFVBQVUsV0FBVztBQUMzQyxTQUFPLFNBQVMsT0FBTyxPQUFPO0FBQzVCLFFBQUksSUFBSSxNQUFNLFFBQ1YsSUFBSSxDQUFDLEdBQ0wsSUFBSSxHQUNKLElBQUksU0FBUyxJQUNiLFNBQVM7QUFFYixXQUFPLElBQUksS0FBSyxJQUFJLEdBQUc7QUFDckIsVUFBSSxTQUFTLElBQUksSUFBSTtBQUFPLFlBQUksS0FBSyxJQUFJLEdBQUcsUUFBUSxNQUFNO0FBQzFELFFBQUUsS0FBSyxNQUFNLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JDLFVBQUssV0FBVSxJQUFJLEtBQUs7QUFBTztBQUMvQixVQUFJLFNBQVMsSUFBSyxLQUFJLEtBQUssU0FBUztBQUFBLElBQ3RDO0FBRUEsV0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLFNBQVM7QUFBQSxFQUNuQztBQUNGOzs7QUNqQmUsZ0NBQVMsVUFBVTtBQUNoQyxTQUFPLFNBQVMsT0FBTztBQUNyQixXQUFPLE1BQU0sUUFBUSxVQUFVLFNBQVMsR0FBRztBQUN6QyxhQUFPLFNBQVMsQ0FBQztBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNIO0FBQ0Y7OztBQ0xBLElBQUksS0FBSztBQUVNLHlCQUF5QixXQUFXO0FBQ2pELE1BQUksQ0FBRSxTQUFRLEdBQUcsS0FBSyxTQUFTO0FBQUksVUFBTSxJQUFJLE1BQU0scUJBQXFCLFNBQVM7QUFDakYsTUFBSTtBQUNKLFNBQU8sSUFBSSxnQkFBZ0I7QUFBQSxJQUN6QixNQUFNLE1BQU07QUFBQSxJQUNaLE9BQU8sTUFBTTtBQUFBLElBQ2IsTUFBTSxNQUFNO0FBQUEsSUFDWixRQUFRLE1BQU07QUFBQSxJQUNkLE1BQU0sTUFBTTtBQUFBLElBQ1osT0FBTyxNQUFNO0FBQUEsSUFDYixPQUFPLE1BQU07QUFBQSxJQUNiLFdBQVcsTUFBTSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFBQSxJQUN2QyxNQUFNLE1BQU07QUFBQSxJQUNaLE1BQU0sTUFBTTtBQUFBLEVBQ2QsQ0FBQztBQUNIO0FBRUEsZ0JBQWdCLFlBQVksZ0JBQWdCO0FBRXJDLHlCQUF5QixXQUFXO0FBQ3pDLE9BQUssT0FBTyxVQUFVLFNBQVMsU0FBWSxNQUFNLFVBQVUsT0FBTztBQUNsRSxPQUFLLFFBQVEsVUFBVSxVQUFVLFNBQVksTUFBTSxVQUFVLFFBQVE7QUFDckUsT0FBSyxPQUFPLFVBQVUsU0FBUyxTQUFZLE1BQU0sVUFBVSxPQUFPO0FBQ2xFLE9BQUssU0FBUyxVQUFVLFdBQVcsU0FBWSxLQUFLLFVBQVUsU0FBUztBQUN2RSxPQUFLLE9BQU8sQ0FBQyxDQUFDLFVBQVU7QUFDeEIsT0FBSyxRQUFRLFVBQVUsVUFBVSxTQUFZLFNBQVksQ0FBQyxVQUFVO0FBQ3BFLE9BQUssUUFBUSxDQUFDLENBQUMsVUFBVTtBQUN6QixPQUFLLFlBQVksVUFBVSxjQUFjLFNBQVksU0FBWSxDQUFDLFVBQVU7QUFDNUUsT0FBSyxPQUFPLENBQUMsQ0FBQyxVQUFVO0FBQ3hCLE9BQUssT0FBTyxVQUFVLFNBQVMsU0FBWSxLQUFLLFVBQVUsT0FBTztBQUNuRTtBQUVBLGdCQUFnQixVQUFVLFdBQVcsV0FBVztBQUM5QyxTQUFPLEtBQUssT0FDTixLQUFLLFFBQ0wsS0FBSyxPQUNMLEtBQUssU0FDSixNQUFLLE9BQU8sTUFBTSxNQUNsQixNQUFLLFVBQVUsU0FBWSxLQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssUUFBUSxDQUFDLEtBQzFELE1BQUssUUFBUSxNQUFNLE1BQ25CLE1BQUssY0FBYyxTQUFZLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxLQUFLLFlBQVksQ0FBQyxLQUN4RSxNQUFLLE9BQU8sTUFBTSxNQUNuQixLQUFLO0FBQ2I7OztBQzdDZSw0QkFBUyxHQUFHO0FBQ3pCO0FBQUssYUFBUyxJQUFJLEVBQUUsUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRztBQUMxRCxjQUFRLEVBQUU7QUFBQSxhQUNIO0FBQUssZUFBSyxLQUFLO0FBQUc7QUFBQSxhQUNsQjtBQUFLLGNBQUksT0FBTztBQUFHLGlCQUFLO0FBQUcsZUFBSztBQUFHO0FBQUE7QUFDL0IsY0FBSSxDQUFDLENBQUMsRUFBRTtBQUFJO0FBQVcsY0FBSSxLQUFLO0FBQUcsaUJBQUs7QUFBRztBQUFBO0FBQUEsSUFFeEQ7QUFDQSxTQUFPLEtBQUssSUFBSSxFQUFFLE1BQU0sR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEtBQUssQ0FBQyxJQUFJO0FBQ3JEOzs7QUNSTyxJQUFJO0FBRUksa0NBQVMsSUFBRyxHQUFHO0FBQzVCLE1BQUksSUFBSSxtQkFBbUIsSUFBRyxDQUFDO0FBQy9CLE1BQUksQ0FBQztBQUFHLFdBQU8sS0FBSTtBQUNuQixNQUFJLGNBQWMsRUFBRSxJQUNoQixXQUFXLEVBQUUsSUFDYixJQUFJLFdBQVksa0JBQWlCLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEtBQUssTUFBTSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUM1RixJQUFJLFlBQVk7QUFDcEIsU0FBTyxNQUFNLElBQUksY0FDWCxJQUFJLElBQUksY0FBYyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFDbkQsSUFBSSxJQUFJLFlBQVksTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLFlBQVksTUFBTSxDQUFDLElBQzNELE9BQU8sSUFBSSxNQUFNLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLG1CQUFtQixJQUFHLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRTtBQUMxRjs7O0FDYmUsK0JBQVMsSUFBRyxHQUFHO0FBQzVCLE1BQUksSUFBSSxtQkFBbUIsSUFBRyxDQUFDO0FBQy9CLE1BQUksQ0FBQztBQUFHLFdBQU8sS0FBSTtBQUNuQixNQUFJLGNBQWMsRUFBRSxJQUNoQixXQUFXLEVBQUU7QUFDakIsU0FBTyxXQUFXLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLElBQUksY0FDeEQsWUFBWSxTQUFTLFdBQVcsSUFBSSxZQUFZLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxNQUFNLFlBQVksTUFBTSxXQUFXLENBQUMsSUFDN0csY0FBYyxJQUFJLE1BQU0sV0FBVyxZQUFZLFNBQVMsQ0FBQyxFQUFFLEtBQUssR0FBRztBQUMzRTs7O0FDTkEsSUFBTyxzQkFBUTtBQUFBLEVBQ2IsS0FBSyxDQUFDLElBQUcsTUFBTyxNQUFJLEtBQUssUUFBUSxDQUFDO0FBQUEsRUFDbEMsS0FBSyxDQUFDLE9BQU0sS0FBSyxNQUFNLEVBQUMsRUFBRSxTQUFTLENBQUM7QUFBQSxFQUNwQyxLQUFLLENBQUMsT0FBTSxLQUFJO0FBQUEsRUFDaEIsS0FBSztBQUFBLEVBQ0wsS0FBSyxDQUFDLElBQUcsTUFBTSxHQUFFLGNBQWMsQ0FBQztBQUFBLEVBQ2hDLEtBQUssQ0FBQyxJQUFHLE1BQU0sR0FBRSxRQUFRLENBQUM7QUFBQSxFQUMxQixLQUFLLENBQUMsSUFBRyxNQUFNLEdBQUUsWUFBWSxDQUFDO0FBQUEsRUFDOUIsS0FBSyxDQUFDLE9BQU0sS0FBSyxNQUFNLEVBQUMsRUFBRSxTQUFTLENBQUM7QUFBQSxFQUNwQyxLQUFLLENBQUMsSUFBRyxNQUFNLHNCQUFjLEtBQUksS0FBSyxDQUFDO0FBQUEsRUFDdkMsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSyxDQUFDLE9BQU0sS0FBSyxNQUFNLEVBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxZQUFZO0FBQUEsRUFDbkQsS0FBSyxDQUFDLE9BQU0sS0FBSyxNQUFNLEVBQUMsRUFBRSxTQUFTLEVBQUU7QUFDdkM7OztBQ2xCZSwwQkFBUyxJQUFHO0FBQ3pCLFNBQU87QUFDVDs7O0FDT0EsSUFBSSxNQUFNLE1BQU0sVUFBVTtBQUExQixJQUNJLFdBQVcsQ0FBQyxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxRQUFJLEtBQUksSUFBRyxLQUFJLEtBQUksS0FBSSxLQUFJLEtBQUksS0FBSSxLQUFJLEdBQUc7QUFFbkUsd0JBQVMsU0FBUTtBQUM5QixNQUFJLFFBQVEsUUFBTyxhQUFhLFVBQWEsUUFBTyxjQUFjLFNBQVksbUJBQVcsb0JBQVksSUFBSSxLQUFLLFFBQU8sVUFBVSxNQUFNLEdBQUcsUUFBTyxZQUFZLEVBQUUsR0FDekosaUJBQWlCLFFBQU8sYUFBYSxTQUFZLEtBQUssUUFBTyxTQUFTLEtBQUssSUFDM0UsaUJBQWlCLFFBQU8sYUFBYSxTQUFZLEtBQUssUUFBTyxTQUFTLEtBQUssSUFDM0UsVUFBVSxRQUFPLFlBQVksU0FBWSxNQUFNLFFBQU8sVUFBVSxJQUNoRSxXQUFXLFFBQU8sYUFBYSxTQUFZLG1CQUFXLHVCQUFlLElBQUksS0FBSyxRQUFPLFVBQVUsTUFBTSxDQUFDLEdBQ3RHLFVBQVUsUUFBTyxZQUFZLFNBQVksTUFBTSxRQUFPLFVBQVUsSUFDaEUsUUFBUSxRQUFPLFVBQVUsU0FBWSxXQUFNLFFBQU8sUUFBUSxJQUMxRCxNQUFNLFFBQU8sUUFBUSxTQUFZLFFBQVEsUUFBTyxNQUFNO0FBRTFELHFCQUFtQixXQUFXO0FBQzVCLGdCQUFZLGdCQUFnQixTQUFTO0FBRXJDLFFBQUksT0FBTyxVQUFVLE1BQ2pCLFFBQVEsVUFBVSxPQUNsQixPQUFPLFVBQVUsTUFDakIsU0FBUyxVQUFVLFFBQ25CLFFBQU8sVUFBVSxNQUNqQixRQUFRLFVBQVUsT0FDbEIsUUFBUSxVQUFVLE9BQ2xCLFlBQVksVUFBVSxXQUN0QixPQUFPLFVBQVUsTUFDakIsUUFBTyxVQUFVO0FBR3JCLFFBQUksVUFBUztBQUFLLGNBQVEsTUFBTSxRQUFPO0FBQUEsYUFHOUIsQ0FBQyxvQkFBWTtBQUFPLG9CQUFjLFVBQWMsYUFBWSxLQUFLLE9BQU8sTUFBTSxRQUFPO0FBRzlGLFFBQUksU0FBUyxTQUFTLE9BQU8sVUFBVTtBQUFNLGNBQU8sTUFBTSxPQUFPLEtBQUssUUFBUTtBQUk5RSxRQUFJLFNBQVMsV0FBVyxNQUFNLGlCQUFpQixXQUFXLE9BQU8sU0FBUyxLQUFLLEtBQUksSUFBSSxNQUFNLE1BQUssWUFBWSxJQUFJLElBQzlHLFNBQVMsV0FBVyxNQUFNLGlCQUFpQixPQUFPLEtBQUssS0FBSSxJQUFJLFVBQVU7QUFLN0UsUUFBSSxhQUFhLG9CQUFZLFFBQ3pCLGNBQWMsYUFBYSxLQUFLLEtBQUk7QUFNeEMsZ0JBQVksY0FBYyxTQUFZLElBQ2hDLFNBQVMsS0FBSyxLQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLElBQ3pELEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQztBQUV6QyxxQkFBZ0IsT0FBTztBQUNyQixVQUFJLGNBQWMsUUFDZCxjQUFjLFFBQ2QsR0FBRyxHQUFHO0FBRVYsVUFBSSxVQUFTLEtBQUs7QUFDaEIsc0JBQWMsV0FBVyxLQUFLLElBQUk7QUFDbEMsZ0JBQVE7QUFBQSxNQUNWLE9BQU87QUFDTCxnQkFBUSxDQUFDO0FBR1QsWUFBSSxnQkFBZ0IsUUFBUSxLQUFLLElBQUksUUFBUTtBQUc3QyxnQkFBUSxNQUFNLEtBQUssSUFBSSxNQUFNLFdBQVcsS0FBSyxJQUFJLEtBQUssR0FBRyxTQUFTO0FBR2xFLFlBQUk7QUFBTSxrQkFBUSxtQkFBVyxLQUFLO0FBR2xDLFlBQUksaUJBQWlCLENBQUMsVUFBVSxLQUFLLFNBQVM7QUFBSywwQkFBZ0I7QUFHbkUsc0JBQWUsaUJBQWlCLFNBQVMsTUFBTSxPQUFPLFFBQVMsU0FBUyxPQUFPLFNBQVMsTUFBTSxLQUFLLFFBQVE7QUFDM0csc0JBQWUsV0FBUyxNQUFNLFNBQVMsSUFBSSxpQkFBaUIsS0FBSyxNQUFNLGNBQWUsa0JBQWlCLFNBQVMsTUFBTSxNQUFNO0FBSTVILFlBQUksYUFBYTtBQUNmLGNBQUksSUFBSSxJQUFJLE1BQU07QUFDbEIsaUJBQU8sRUFBRSxJQUFJLEdBQUc7QUFDZCxnQkFBSSxLQUFJLE1BQU0sV0FBVyxDQUFDLEdBQUcsS0FBSyxNQUFLLEtBQUksSUFBSTtBQUM3Qyw0QkFBZSxRQUFNLEtBQUssVUFBVSxNQUFNLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxNQUFNLENBQUMsS0FBSztBQUMzRSxzQkFBUSxNQUFNLE1BQU0sR0FBRyxDQUFDO0FBQ3hCO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUdBLFVBQUksU0FBUyxDQUFDO0FBQU0sZ0JBQVEsTUFBTSxPQUFPLFFBQVE7QUFHakQsVUFBSSxTQUFTLFlBQVksU0FBUyxNQUFNLFNBQVMsWUFBWSxRQUN6RCxVQUFVLFNBQVMsUUFBUSxJQUFJLE1BQU0sUUFBUSxTQUFTLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSTtBQUcxRSxVQUFJLFNBQVM7QUFBTSxnQkFBUSxNQUFNLFVBQVUsT0FBTyxRQUFRLFNBQVMsUUFBUSxZQUFZLFNBQVMsUUFBUSxHQUFHLFVBQVU7QUFHckgsY0FBUTtBQUFBLGFBQ0Q7QUFBSyxrQkFBUSxjQUFjLFFBQVEsY0FBYztBQUFTO0FBQUEsYUFDMUQ7QUFBSyxrQkFBUSxjQUFjLFVBQVUsUUFBUTtBQUFhO0FBQUEsYUFDMUQ7QUFBSyxrQkFBUSxRQUFRLE1BQU0sR0FBRyxTQUFTLFFBQVEsVUFBVSxDQUFDLElBQUksY0FBYyxRQUFRLGNBQWMsUUFBUSxNQUFNLE1BQU07QUFBRztBQUFBO0FBQ3JILGtCQUFRLFVBQVUsY0FBYyxRQUFRO0FBQWE7QUFBQTtBQUdoRSxhQUFPLFNBQVMsS0FBSztBQUFBLElBQ3ZCO0FBRUEsWUFBTyxXQUFXLFdBQVc7QUFDM0IsYUFBTyxZQUFZO0FBQUEsSUFDckI7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLHlCQUFzQixXQUFXLE9BQU87QUFDdEMsUUFBSSxJQUFJLFVBQVcsYUFBWSxnQkFBZ0IsU0FBUyxHQUFHLFVBQVUsT0FBTyxLQUFLLFVBQVUsR0FDdkYsSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLE1BQU0saUJBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FDakUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsR0FDbkIsU0FBUyxTQUFTLElBQUksSUFBSTtBQUM5QixXQUFPLFNBQVMsUUFBTztBQUNyQixhQUFPLEVBQUUsSUFBSSxNQUFLLElBQUk7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxRQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEI7QUFDRjs7O0FDakpBLElBQUk7QUFDRyxJQUFJO0FBQ0osSUFBSTtBQUVYLGNBQWM7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLFVBQVUsQ0FBQyxDQUFDO0FBQUEsRUFDWixVQUFVLENBQUMsS0FBSyxFQUFFO0FBQ3BCLENBQUM7QUFFYyx1QkFBdUIsWUFBWTtBQUNoRCxXQUFTLGVBQWEsVUFBVTtBQUNoQyxXQUFTLE9BQU87QUFDaEIsaUJBQWUsT0FBTztBQUN0QixTQUFPO0FBQ1Q7OztBQ2ZlLGdDQUFTLE1BQU07QUFDNUIsU0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLGlCQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM5Qzs7O0FDRmUsaUNBQVMsTUFBTSxPQUFPO0FBQ25DLFNBQU8sS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxNQUFNLGlCQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksaUJBQVMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQzlHOzs7QUNGZSxnQ0FBUyxNQUFNLE1BQUs7QUFDakMsU0FBTyxLQUFLLElBQUksSUFBSSxHQUFHLE9BQU0sS0FBSyxJQUFJLElBQUcsSUFBSTtBQUM3QyxTQUFPLEtBQUssSUFBSSxHQUFHLGlCQUFTLElBQUcsSUFBSSxpQkFBUyxJQUFJLENBQUMsSUFBSTtBQUN2RDs7O0FDTEEsMkJBQTJCLElBQUcsR0FBRztBQUMvQixTQUFPLEdBQUUsV0FBVyxFQUFFLFNBQVMsSUFBSTtBQUNyQztBQUVBLGVBQWUsV0FBVTtBQUN2QixTQUFPLFVBQVMsT0FBTyxhQUFhLENBQUMsSUFBSSxVQUFTO0FBQ3BEO0FBRUEscUJBQXFCLElBQUcsSUFBRztBQUN6QixTQUFPLEtBQUksR0FBRTtBQUNmO0FBRUEsY0FBYyxXQUFVO0FBQ3RCLFNBQU8sSUFBSSxVQUFTLE9BQU8sWUFBWSxDQUFDO0FBQzFDO0FBRUEsb0JBQW9CLElBQUcsSUFBRztBQUN4QixTQUFPLEtBQUssSUFBSSxJQUFHLEdBQUUsQ0FBQztBQUN4QjtBQUVBLGtCQUFrQixNQUFNO0FBQ3RCLE1BQUk7QUFDSixTQUFPLFlBQVcsS0FBSztBQUFVLFdBQU8sVUFBUztBQUNqRCxTQUFPO0FBQ1Q7QUFFQSxtQkFBbUIsTUFBTTtBQUN2QixNQUFJO0FBQ0osU0FBTyxZQUFXLEtBQUs7QUFBVSxXQUFPLFVBQVMsVUFBUyxTQUFTO0FBQ25FLFNBQU87QUFDVDtBQUVlLDJCQUFXO0FBQ3hCLE1BQUksYUFBYSxtQkFDYixLQUFLLEdBQ0wsS0FBSyxHQUNMLFdBQVc7QUFFZixtQkFBaUIsT0FBTTtBQUNyQixRQUFJLGNBQ0EsS0FBSTtBQUdSLFVBQUssVUFBVSxTQUFTLE1BQU07QUFDNUIsVUFBSSxZQUFXLEtBQUs7QUFDcEIsVUFBSSxXQUFVO0FBQ1osYUFBSyxJQUFJLE1BQU0sU0FBUTtBQUN2QixhQUFLLElBQUksS0FBSyxTQUFRO0FBQUEsTUFDeEIsT0FBTztBQUNMLGFBQUssSUFBSSxlQUFlLE1BQUssV0FBVyxNQUFNLFlBQVksSUFBSTtBQUM5RCxhQUFLLElBQUk7QUFDVCx1QkFBZTtBQUFBLE1BQ2pCO0FBQUEsSUFDRixDQUFDO0FBRUQsUUFBSSxPQUFPLFNBQVMsS0FBSSxHQUNwQixRQUFRLFVBQVUsS0FBSSxHQUN0QixLQUFLLEtBQUssSUFBSSxXQUFXLE1BQU0sS0FBSyxJQUFJLEdBQ3hDLEtBQUssTUFBTSxJQUFJLFdBQVcsT0FBTyxJQUFJLElBQUk7QUFHN0MsV0FBTyxNQUFLLFVBQVUsV0FBVyxTQUFTLE1BQU07QUFDOUMsV0FBSyxJQUFLLE1BQUssSUFBSSxNQUFLLEtBQUs7QUFDN0IsV0FBSyxJQUFLLE9BQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxJQUMvQixJQUFJLFNBQVMsTUFBTTtBQUNqQixXQUFLLElBQUssTUFBSyxJQUFJLE1BQU8sTUFBSyxNQUFNO0FBQ3JDLFdBQUssSUFBSyxLQUFLLE9BQUssSUFBSSxLQUFLLElBQUksTUFBSyxJQUFJLE1BQU07QUFBQSxJQUNsRCxDQUFDO0FBQUEsRUFDSDtBQUVBLFVBQVEsYUFBYSxTQUFTLElBQUc7QUFDL0IsV0FBTyxVQUFVLFNBQVUsY0FBYSxJQUFHLFdBQVc7QUFBQSxFQUN4RDtBQUVBLFVBQVEsT0FBTyxTQUFTLElBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsWUFBVyxPQUFPLEtBQUssQ0FBQyxHQUFFLElBQUksS0FBSyxDQUFDLEdBQUUsSUFBSSxXQUFZLFdBQVcsT0FBTyxDQUFDLElBQUksRUFBRTtBQUFBLEVBQzVHO0FBRUEsVUFBUSxXQUFXLFNBQVMsSUFBRztBQUM3QixXQUFPLFVBQVUsU0FBVSxZQUFXLE1BQU0sS0FBSyxDQUFDLEdBQUUsSUFBSSxLQUFLLENBQUMsR0FBRSxJQUFJLFdBQVksV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJO0FBQUEsRUFDeEc7QUFFQSxTQUFPO0FBQ1Q7OztBQ25GQSxlQUFlLE1BQU07QUFDbkIsTUFBSSxNQUFNLEdBQ04sWUFBVyxLQUFLLFVBQ2hCLElBQUksYUFBWSxVQUFTO0FBQzdCLE1BQUksQ0FBQztBQUFHLFVBQU07QUFBQTtBQUNULFdBQU8sRUFBRSxLQUFLO0FBQUcsYUFBTyxVQUFTLEdBQUc7QUFDekMsT0FBSyxRQUFRO0FBQ2Y7QUFFZSx5QkFBVztBQUN4QixTQUFPLEtBQUssVUFBVSxLQUFLO0FBQzdCOzs7QUNYZSx1QkFBUyxVQUFVLE1BQU07QUFDdEMsTUFBSSxTQUFRO0FBQ1osYUFBVyxRQUFRLE1BQU07QUFDdkIsYUFBUyxLQUFLLE1BQU0sTUFBTSxFQUFFLFFBQU8sSUFBSTtBQUFBLEVBQ3pDO0FBQ0EsU0FBTztBQUNUOzs7QUNOZSw0QkFBUyxVQUFVLE1BQU07QUFDdEMsTUFBSSxPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksR0FBRyxXQUFVLEdBQUcsU0FBUTtBQUN0RCxTQUFPLE9BQU8sTUFBTSxJQUFJLEdBQUc7QUFDekIsYUFBUyxLQUFLLE1BQU0sTUFBTSxFQUFFLFFBQU8sSUFBSTtBQUN2QyxRQUFJLFlBQVcsS0FBSyxVQUFVO0FBQzVCLFdBQUssSUFBSSxVQUFTLFNBQVMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHO0FBQ3pDLGNBQU0sS0FBSyxVQUFTLEVBQUU7QUFBQSxNQUN4QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOzs7QUNYZSwyQkFBUyxVQUFVLE1BQU07QUFDdEMsTUFBSSxPQUFPLE1BQU0sUUFBUSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxXQUFVLEdBQUcsR0FBRyxTQUFRO0FBQ3BFLFNBQU8sT0FBTyxNQUFNLElBQUksR0FBRztBQUN6QixTQUFLLEtBQUssSUFBSTtBQUNkLFFBQUksWUFBVyxLQUFLLFVBQVU7QUFDNUIsV0FBSyxJQUFJLEdBQUcsSUFBSSxVQUFTLFFBQVEsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUMzQyxjQUFNLEtBQUssVUFBUyxFQUFFO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLFNBQU8sT0FBTyxLQUFLLElBQUksR0FBRztBQUN4QixhQUFTLEtBQUssTUFBTSxNQUFNLEVBQUUsUUFBTyxJQUFJO0FBQUEsRUFDekM7QUFDQSxTQUFPO0FBQ1Q7OztBQ2RlLHVCQUFTLFVBQVUsTUFBTTtBQUN0QyxNQUFJLFNBQVE7QUFDWixhQUFXLFFBQVEsTUFBTTtBQUN2QixRQUFJLFNBQVMsS0FBSyxNQUFNLE1BQU0sRUFBRSxRQUFPLElBQUksR0FBRztBQUM1QyxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDRjs7O0FDUGUscUJBQVMsT0FBTztBQUM3QixTQUFPLEtBQUssVUFBVSxTQUFTLE1BQU07QUFDbkMsUUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksS0FBSyxHQUMzQixZQUFXLEtBQUssVUFDaEIsSUFBSSxhQUFZLFVBQVM7QUFDN0IsV0FBTyxFQUFFLEtBQUs7QUFBRyxhQUFPLFVBQVMsR0FBRztBQUNwQyxTQUFLLFFBQVE7QUFBQSxFQUNmLENBQUM7QUFDSDs7O0FDUmUsdUJBQVMsU0FBUztBQUMvQixTQUFPLEtBQUssV0FBVyxTQUFTLE1BQU07QUFDcEMsUUFBSSxLQUFLLFVBQVU7QUFDakIsV0FBSyxTQUFTLEtBQUssT0FBTztBQUFBLElBQzVCO0FBQUEsRUFDRixDQUFDO0FBQ0g7OztBQ05lLHVCQUFTLEtBQUs7QUFDM0IsTUFBSSxTQUFRLE1BQ1IsV0FBVyxvQkFBb0IsUUFBTyxHQUFHLEdBQ3pDLFFBQVEsQ0FBQyxNQUFLO0FBQ2xCLFNBQU8sV0FBVSxVQUFVO0FBQ3pCLGFBQVEsT0FBTTtBQUNkLFVBQU0sS0FBSyxNQUFLO0FBQUEsRUFDbEI7QUFDQSxNQUFJLElBQUksTUFBTTtBQUNkLFNBQU8sUUFBUSxVQUFVO0FBQ3ZCLFVBQU0sT0FBTyxHQUFHLEdBQUcsR0FBRztBQUN0QixVQUFNLElBQUk7QUFBQSxFQUNaO0FBQ0EsU0FBTztBQUNUO0FBRUEsNkJBQTZCLElBQUcsR0FBRztBQUNqQyxNQUFJLE9BQU07QUFBRyxXQUFPO0FBQ3BCLE1BQUksU0FBUyxHQUFFLFVBQVUsR0FDckIsU0FBUyxFQUFFLFVBQVUsR0FDckIsS0FBSTtBQUNSLE9BQUksT0FBTyxJQUFJO0FBQ2YsTUFBSSxPQUFPLElBQUk7QUFDZixTQUFPLE9BQU0sR0FBRztBQUNkLFNBQUk7QUFDSixTQUFJLE9BQU8sSUFBSTtBQUNmLFFBQUksT0FBTyxJQUFJO0FBQUEsRUFDakI7QUFDQSxTQUFPO0FBQ1Q7OztBQzdCZSw2QkFBVztBQUN4QixNQUFJLE9BQU8sTUFBTSxRQUFRLENBQUMsSUFBSTtBQUM5QixTQUFPLE9BQU8sS0FBSyxRQUFRO0FBQ3pCLFVBQU0sS0FBSyxJQUFJO0FBQUEsRUFDakI7QUFDQSxTQUFPO0FBQ1Q7OztBQ05lLCtCQUFXO0FBQ3hCLFNBQU8sTUFBTSxLQUFLLElBQUk7QUFDeEI7OztBQ0ZlLDBCQUFXO0FBQ3hCLE1BQUksU0FBUyxDQUFDO0FBQ2QsT0FBSyxXQUFXLFNBQVMsTUFBTTtBQUM3QixRQUFJLENBQUMsS0FBSyxVQUFVO0FBQ2xCLGFBQU8sS0FBSyxJQUFJO0FBQUEsSUFDbEI7QUFBQSxFQUNGLENBQUM7QUFDRCxTQUFPO0FBQ1Q7OztBQ1JlLHlCQUFXO0FBQ3hCLE1BQUksUUFBTyxNQUFNLFFBQVEsQ0FBQztBQUMxQixRQUFLLEtBQUssU0FBUyxNQUFNO0FBQ3ZCLFFBQUksU0FBUyxPQUFNO0FBQ2pCLFlBQU0sS0FBSyxFQUFDLFFBQVEsS0FBSyxRQUFRLFFBQVEsS0FBSSxDQUFDO0FBQUEsSUFDaEQ7QUFBQSxFQUNGLENBQUM7QUFDRCxTQUFPO0FBQ1Q7OztBQ1JlLDhCQUFZO0FBQ3pCLE1BQUksT0FBTyxNQUFNLFNBQVMsT0FBTyxDQUFDLElBQUksR0FBRyxXQUFVLEdBQUc7QUFDdEQsS0FBRztBQUNELGNBQVUsS0FBSyxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBQ2xDLFdBQU8sT0FBTyxRQUFRLElBQUksR0FBRztBQUMzQixZQUFNO0FBQ04sVUFBSSxZQUFXLEtBQUssVUFBVTtBQUM1QixhQUFLLElBQUksR0FBRyxJQUFJLFVBQVMsUUFBUSxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQzNDLGVBQUssS0FBSyxVQUFTLEVBQUU7QUFBQSxRQUN2QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRixTQUFTLEtBQUs7QUFDaEI7OztBQ0NlLG1CQUFtQixNQUFNLFdBQVU7QUFDaEQsTUFBSSxnQkFBZ0IsS0FBSztBQUN2QixXQUFPLENBQUMsUUFBVyxJQUFJO0FBQ3ZCLFFBQUksY0FBYTtBQUFXLGtCQUFXO0FBQUEsRUFDekMsV0FBVyxjQUFhLFFBQVc7QUFDakMsZ0JBQVc7QUFBQSxFQUNiO0FBRUEsTUFBSSxRQUFPLElBQUksS0FBSyxJQUFJLEdBQ3BCLE1BQ0EsUUFBUSxDQUFDLEtBQUksR0FDYixPQUNBLFFBQ0EsR0FDQTtBQUVKLFNBQU8sT0FBTyxNQUFNLElBQUksR0FBRztBQUN6QixRQUFLLFVBQVMsVUFBUyxLQUFLLElBQUksTUFBTyxLQUFLLFVBQVMsTUFBTSxLQUFLLE1BQU0sR0FBRyxTQUFTO0FBQ2hGLFdBQUssV0FBVztBQUNoQixXQUFLLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUc7QUFDM0IsY0FBTSxLQUFLLFFBQVEsT0FBTyxLQUFLLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztBQUNsRCxjQUFNLFNBQVM7QUFDZixjQUFNLFFBQVEsS0FBSyxRQUFRO0FBQUEsTUFDN0I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sTUFBSyxXQUFXLGFBQWE7QUFDdEM7QUFFQSxxQkFBcUI7QUFDbkIsU0FBTyxVQUFVLElBQUksRUFBRSxXQUFXLFFBQVE7QUFDNUM7QUFFQSx3QkFBd0IsR0FBRztBQUN6QixTQUFPLEVBQUU7QUFDWDtBQUVBLHFCQUFxQixHQUFHO0FBQ3RCLFNBQU8sTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUs7QUFDbkM7QUFFQSxrQkFBa0IsTUFBTTtBQUN0QixNQUFJLEtBQUssS0FBSyxVQUFVO0FBQVcsU0FBSyxRQUFRLEtBQUssS0FBSztBQUMxRCxPQUFLLE9BQU8sS0FBSyxLQUFLO0FBQ3hCO0FBRU8sdUJBQXVCLE1BQU07QUFDbEMsTUFBSSxTQUFTO0FBQ2I7QUFBRyxTQUFLLFNBQVM7QUFBQSxTQUNULFFBQU8sS0FBSyxXQUFZLEtBQUssU0FBUyxFQUFFO0FBQ2xEO0FBRU8sY0FBYyxNQUFNO0FBQ3pCLE9BQUssT0FBTztBQUNaLE9BQUssUUFDTCxLQUFLLFNBQVM7QUFDZCxPQUFLLFNBQVM7QUFDaEI7QUFFQSxLQUFLLFlBQVksVUFBVSxZQUFZO0FBQUEsRUFDckMsYUFBYTtBQUFBLEVBQ2IsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUFBLEVBQ2IsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sQ0FBQyxPQUFPLFdBQVc7QUFDckI7OztBQ3RGTyxrQkFBa0IsR0FBRztBQUMxQixNQUFJLE9BQU8sTUFBTTtBQUFZLFVBQU0sSUFBSTtBQUN2QyxTQUFPO0FBQ1Q7OztBQ1BPLHdCQUF3QjtBQUM3QixTQUFPO0FBQ1Q7QUFFZSwyQkFBUyxJQUFHO0FBQ3pCLFNBQU8sV0FBVztBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNSZSx3QkFBUyxNQUFNO0FBQzVCLE9BQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxFQUFFO0FBQzVCLE9BQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxFQUFFO0FBQzVCLE9BQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxFQUFFO0FBQzVCLE9BQUssS0FBSyxLQUFLLE1BQU0sS0FBSyxFQUFFO0FBQzlCOzs7QUNMZSxzQkFBUyxRQUFRLElBQUksSUFBSSxJQUFJLElBQUk7QUFDOUMsTUFBSSxRQUFRLE9BQU8sVUFDZixNQUNBLElBQUksSUFDSixJQUFJLE1BQU0sUUFDVixJQUFJLE9BQU8sU0FBVSxNQUFLLE1BQU0sT0FBTztBQUUzQyxTQUFPLEVBQUUsSUFBSSxHQUFHO0FBQ2QsV0FBTyxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLO0FBQ3pDLFNBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxNQUFNLEtBQUssUUFBUTtBQUFBLEVBQzdDO0FBQ0Y7OztBQ1JlLDZCQUFXO0FBQ3hCLE1BQUksS0FBSyxHQUNMLEtBQUssR0FDTCxVQUFVLEdBQ1YsUUFBUTtBQUVaLHFCQUFtQixPQUFNO0FBQ3ZCLFFBQUksSUFBSSxNQUFLLFNBQVM7QUFDdEIsVUFBSyxLQUNMLE1BQUssS0FBSztBQUNWLFVBQUssS0FBSztBQUNWLFVBQUssS0FBSyxLQUFLO0FBQ2YsVUFBSyxXQUFXLGFBQWEsSUFBSSxDQUFDLENBQUM7QUFDbkMsUUFBSTtBQUFPLFlBQUssV0FBVyxjQUFTO0FBQ3BDLFdBQU87QUFBQSxFQUNUO0FBRUEsd0JBQXNCLEtBQUksR0FBRztBQUMzQixXQUFPLFNBQVMsTUFBTTtBQUNwQixVQUFJLEtBQUssVUFBVTtBQUNqQixxQkFBWSxNQUFNLEtBQUssSUFBSSxNQUFNLE1BQUssUUFBUSxLQUFLLEdBQUcsS0FBSyxJQUFJLE1BQU0sTUFBSyxRQUFRLEtBQUssQ0FBQztBQUFBLE1BQzFGO0FBQ0EsVUFBSSxLQUFLLEtBQUssSUFDVixLQUFLLEtBQUssSUFDVixLQUFLLEtBQUssS0FBSyxTQUNmLEtBQUssS0FBSyxLQUFLO0FBQ25CLFVBQUksS0FBSztBQUFJLGFBQUssS0FBTSxNQUFLLE1BQU07QUFDbkMsVUFBSSxLQUFLO0FBQUksYUFBSyxLQUFNLE1BQUssTUFBTTtBQUNuQyxXQUFLLEtBQUs7QUFDVixXQUFLLEtBQUs7QUFDVixXQUFLLEtBQUs7QUFDVixXQUFLLEtBQUs7QUFBQSxJQUNaO0FBQUEsRUFDRjtBQUVBLFlBQVUsUUFBUSxTQUFTLElBQUc7QUFDNUIsV0FBTyxVQUFVLFNBQVUsU0FBUSxDQUFDLENBQUMsSUFBRyxhQUFhO0FBQUEsRUFDdkQ7QUFFQSxZQUFVLE9BQU8sU0FBUyxJQUFHO0FBQzNCLFdBQU8sVUFBVSxTQUFVLE1BQUssQ0FBQyxHQUFFLElBQUksS0FBSyxDQUFDLEdBQUUsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFO0FBQUEsRUFDekU7QUFFQSxZQUFVLFVBQVUsU0FBUyxJQUFHO0FBQzlCLFdBQU8sVUFBVSxTQUFVLFdBQVUsQ0FBQyxJQUFHLGFBQWE7QUFBQSxFQUN4RDtBQUVBLFNBQU87QUFDVDs7O0FDaERBLElBQUksVUFBVSxFQUFDLE9BQU8sR0FBRTtBQUF4QixJQUNJLFlBQVksQ0FBQztBQUVqQixtQkFBbUIsR0FBRztBQUNwQixTQUFPLEVBQUU7QUFDWDtBQUVBLHlCQUF5QixHQUFHO0FBQzFCLFNBQU8sRUFBRTtBQUNYO0FBRWUsNEJBQVc7QUFDeEIsTUFBSSxNQUFLLFdBQ0wsV0FBVztBQUVmLHFCQUFrQixNQUFNO0FBQ3RCLFFBQUksUUFBUSxNQUFNLEtBQUssSUFBSSxHQUN2QixJQUFJLE1BQU0sUUFDVixHQUNBLEdBQ0EsT0FDQSxRQUNBLE1BQ0EsUUFDQSxTQUNBLFlBQVksb0JBQUk7QUFFcEIsU0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUN0QixVQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQztBQUMxQyxVQUFLLFVBQVMsSUFBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLFFBQVMsV0FBVSxLQUFLO0FBQ3ZELGtCQUFVLEtBQUssS0FBSztBQUNwQixrQkFBVSxJQUFJLFNBQVMsVUFBVSxJQUFJLE9BQU8sSUFBSSxZQUFZLElBQUk7QUFBQSxNQUNsRTtBQUNBLFVBQUssVUFBUyxTQUFTLEdBQUcsR0FBRyxJQUFJLE1BQU0sUUFBUyxXQUFVLEtBQUs7QUFDN0QsYUFBSyxTQUFTO0FBQUEsTUFDaEI7QUFBQSxJQUNGO0FBRUEsU0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUN0QixhQUFPLE1BQU07QUFDYixVQUFJLFNBQVMsS0FBSyxRQUFRO0FBQ3hCLGlCQUFTLFVBQVUsSUFBSSxNQUFNO0FBQzdCLFlBQUksQ0FBQztBQUFRLGdCQUFNLElBQUksTUFBTSxjQUFjLE1BQU07QUFDakQsWUFBSSxXQUFXO0FBQVcsZ0JBQU0sSUFBSSxNQUFNLGdCQUFnQixNQUFNO0FBQ2hFLFlBQUksT0FBTztBQUFVLGlCQUFPLFNBQVMsS0FBSyxJQUFJO0FBQUE7QUFDekMsaUJBQU8sV0FBVyxDQUFDLElBQUk7QUFDNUIsYUFBSyxTQUFTO0FBQUEsTUFDaEIsT0FBTztBQUNMLFlBQUk7QUFBTSxnQkFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQzFDLGdCQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUM7QUFBTSxZQUFNLElBQUksTUFBTSxTQUFTO0FBQ3BDLFVBQUssU0FBUztBQUNkLFVBQUssV0FBVyxTQUFTLE9BQU07QUFBRSxZQUFLLFFBQVEsTUFBSyxPQUFPLFFBQVE7QUFBRyxRQUFFO0FBQUEsSUFBRyxDQUFDLEVBQUUsV0FBVyxhQUFhO0FBQ3JHLFVBQUssU0FBUztBQUNkLFFBQUksSUFBSTtBQUFHLFlBQU0sSUFBSSxNQUFNLE9BQU87QUFFbEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxZQUFTLEtBQUssU0FBUyxJQUFHO0FBQ3hCLFdBQU8sVUFBVSxTQUFVLE9BQUssU0FBUyxFQUFDLEdBQUcsYUFBWTtBQUFBLEVBQzNEO0FBRUEsWUFBUyxXQUFXLFNBQVMsSUFBRztBQUM5QixXQUFPLFVBQVUsU0FBVSxZQUFXLFNBQVMsRUFBQyxHQUFHLGFBQVk7QUFBQSxFQUNqRTtBQUVBLFNBQU87QUFDVDs7O0FDeEVBLDRCQUEyQixJQUFHLEdBQUc7QUFDL0IsU0FBTyxHQUFFLFdBQVcsRUFBRSxTQUFTLElBQUk7QUFDckM7QUFVQSxrQkFBa0IsR0FBRztBQUNuQixNQUFJLFlBQVcsRUFBRTtBQUNqQixTQUFPLFlBQVcsVUFBUyxLQUFLLEVBQUU7QUFDcEM7QUFHQSxtQkFBbUIsR0FBRztBQUNwQixNQUFJLFlBQVcsRUFBRTtBQUNqQixTQUFPLFlBQVcsVUFBUyxVQUFTLFNBQVMsS0FBSyxFQUFFO0FBQ3REO0FBSUEscUJBQXFCLElBQUksSUFBSSxPQUFPO0FBQ2xDLE1BQUksU0FBUyxRQUFTLElBQUcsSUFBSSxHQUFHO0FBQ2hDLEtBQUcsS0FBSztBQUNSLEtBQUcsS0FBSztBQUNSLEtBQUcsS0FBSztBQUNSLEtBQUcsS0FBSztBQUNSLEtBQUcsS0FBSztBQUNWO0FBS0EsdUJBQXVCLEdBQUc7QUFDeEIsTUFBSSxRQUFRLEdBQ1IsU0FBUyxHQUNULFlBQVcsRUFBRSxVQUNiLElBQUksVUFBUyxRQUNiO0FBQ0osU0FBTyxFQUFFLEtBQUssR0FBRztBQUNmLFFBQUksVUFBUztBQUNiLE1BQUUsS0FBSztBQUNQLE1BQUUsS0FBSztBQUNQLGFBQVMsRUFBRSxJQUFLLFdBQVUsRUFBRTtBQUFBLEVBQzlCO0FBQ0Y7QUFJQSxzQkFBc0IsS0FBSyxHQUFHLFVBQVU7QUFDdEMsU0FBTyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsSUFBSSxJQUFJO0FBQzdDO0FBRUEsa0JBQWtCLE1BQU0sR0FBRztBQUN6QixPQUFLLElBQUk7QUFDVCxPQUFLLFNBQVM7QUFDZCxPQUFLLFdBQVc7QUFDaEIsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1g7QUFFQSxTQUFTLFlBQVksT0FBTyxPQUFPLEtBQUssU0FBUztBQUVqRCxrQkFBa0IsT0FBTTtBQUN0QixNQUFJLE9BQU8sSUFBSSxTQUFTLE9BQU0sQ0FBQyxHQUMzQixNQUNBLFFBQVEsQ0FBQyxJQUFJLEdBQ2IsT0FDQSxXQUNBLEdBQ0E7QUFFSixTQUFPLE9BQU8sTUFBTSxJQUFJLEdBQUc7QUFDekIsUUFBSSxZQUFXLEtBQUssRUFBRSxVQUFVO0FBQzlCLFdBQUssV0FBVyxJQUFJLE1BQU0sSUFBSSxVQUFTLE1BQU07QUFDN0MsV0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHO0FBQzNCLGNBQU0sS0FBSyxRQUFRLEtBQUssU0FBUyxLQUFLLElBQUksU0FBUyxVQUFTLElBQUksQ0FBQyxDQUFDO0FBQ2xFLGNBQU0sU0FBUztBQUFBLE1BQ2pCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxFQUFDLE1BQUssU0FBUyxJQUFJLFNBQVMsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUk7QUFDdEQsU0FBTztBQUNUO0FBR2Usd0JBQVc7QUFDeEIsTUFBSSxhQUFhLG9CQUNiLEtBQUssR0FDTCxLQUFLLEdBQ0wsV0FBVztBQUVmLGdCQUFjLE9BQU07QUFDbEIsUUFBSSxJQUFJLFNBQVMsS0FBSTtBQUdyQixNQUFFLFVBQVUsU0FBUyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRTtBQUN4QyxNQUFFLFdBQVcsVUFBVTtBQUd2QixRQUFJO0FBQVUsWUFBSyxXQUFXLFFBQVE7QUFBQSxTQUlqQztBQUNILFVBQUksT0FBTyxPQUNQLFFBQVEsT0FDUixTQUFTO0FBQ2IsWUFBSyxXQUFXLFNBQVMsTUFBTTtBQUM3QixZQUFJLEtBQUssSUFBSSxLQUFLO0FBQUcsaUJBQU87QUFDNUIsWUFBSSxLQUFLLElBQUksTUFBTTtBQUFHLGtCQUFRO0FBQzlCLFlBQUksS0FBSyxRQUFRLE9BQU87QUFBTyxtQkFBUztBQUFBLE1BQzFDLENBQUM7QUFDRCxVQUFJLElBQUksU0FBUyxRQUFRLElBQUksV0FBVyxNQUFNLEtBQUssSUFBSSxHQUNuRCxLQUFLLElBQUksS0FBSyxHQUNkLEtBQUssS0FBTSxPQUFNLElBQUksSUFBSSxLQUN6QixLQUFLLEtBQU0sUUFBTyxTQUFTO0FBQy9CLFlBQUssV0FBVyxTQUFTLE1BQU07QUFDN0IsYUFBSyxJQUFLLE1BQUssSUFBSSxNQUFNO0FBQ3pCLGFBQUssSUFBSSxLQUFLLFFBQVE7QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSDtBQUVBLFdBQU87QUFBQSxFQUNUO0FBTUEscUJBQW1CLEdBQUc7QUFDcEIsUUFBSSxZQUFXLEVBQUUsVUFDYixXQUFXLEVBQUUsT0FBTyxVQUNwQixJQUFJLEVBQUUsSUFBSSxTQUFTLEVBQUUsSUFBSSxLQUFLO0FBQ2xDLFFBQUksV0FBVTtBQUNaLG9CQUFjLENBQUM7QUFDZixVQUFJLFdBQVksV0FBUyxHQUFHLElBQUksVUFBUyxVQUFTLFNBQVMsR0FBRyxLQUFLO0FBQ25FLFVBQUksR0FBRztBQUNMLFVBQUUsSUFBSSxFQUFFLElBQUksV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQy9CLFVBQUUsSUFBSSxFQUFFLElBQUk7QUFBQSxNQUNkLE9BQU87QUFDTCxVQUFFLElBQUk7QUFBQSxNQUNSO0FBQUEsSUFDRixXQUFXLEdBQUc7QUFDWixRQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUFBLElBQ2pDO0FBQ0EsTUFBRSxPQUFPLElBQUksVUFBVSxHQUFHLEdBQUcsRUFBRSxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQUEsRUFDeEQ7QUFHQSxzQkFBb0IsR0FBRztBQUNyQixNQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPO0FBQ3ZCLE1BQUUsS0FBSyxFQUFFLE9BQU87QUFBQSxFQUNsQjtBQWFBLHFCQUFtQixHQUFHLEdBQUcsVUFBVTtBQUNqQyxRQUFJLEdBQUc7QUFDTCxVQUFJLE1BQU0sR0FDTixNQUFNLEdBQ04sTUFBTSxHQUNOLE1BQU0sSUFBSSxPQUFPLFNBQVMsSUFDMUIsTUFBTSxJQUFJLEdBQ1YsTUFBTSxJQUFJLEdBQ1YsTUFBTSxJQUFJLEdBQ1YsTUFBTSxJQUFJLEdBQ1Y7QUFDSixhQUFPLE1BQU0sVUFBVSxHQUFHLEdBQUcsTUFBTSxTQUFTLEdBQUcsR0FBRyxPQUFPLEtBQUs7QUFDNUQsY0FBTSxTQUFTLEdBQUc7QUFDbEIsY0FBTSxVQUFVLEdBQUc7QUFDbkIsWUFBSSxJQUFJO0FBQ1IsZ0JBQVEsSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLE1BQU0sV0FBVyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzNELFlBQUksUUFBUSxHQUFHO0FBQ2Isc0JBQVksYUFBYSxLQUFLLEdBQUcsUUFBUSxHQUFHLEdBQUcsS0FBSztBQUNwRCxpQkFBTztBQUNQLGlCQUFPO0FBQUEsUUFDVDtBQUNBLGVBQU8sSUFBSTtBQUNYLGVBQU8sSUFBSTtBQUNYLGVBQU8sSUFBSTtBQUNYLGVBQU8sSUFBSTtBQUFBLE1BQ2I7QUFDQSxVQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsR0FBRztBQUMxQixZQUFJLElBQUk7QUFDUixZQUFJLEtBQUssTUFBTTtBQUFBLE1BQ2pCO0FBQ0EsVUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLEdBQUc7QUFDekIsWUFBSSxJQUFJO0FBQ1IsWUFBSSxLQUFLLE1BQU07QUFDZixtQkFBVztBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxvQkFBa0IsTUFBTTtBQUN0QixTQUFLLEtBQUs7QUFDVixTQUFLLElBQUksS0FBSyxRQUFRO0FBQUEsRUFDeEI7QUFFQSxPQUFLLGFBQWEsU0FBUyxJQUFHO0FBQzVCLFdBQU8sVUFBVSxTQUFVLGNBQWEsSUFBRyxRQUFRO0FBQUEsRUFDckQ7QUFFQSxPQUFLLE9BQU8sU0FBUyxJQUFHO0FBQ3RCLFdBQU8sVUFBVSxTQUFVLFlBQVcsT0FBTyxLQUFLLENBQUMsR0FBRSxJQUFJLEtBQUssQ0FBQyxHQUFFLElBQUksUUFBUyxXQUFXLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFBQSxFQUN6RztBQUVBLE9BQUssV0FBVyxTQUFTLElBQUc7QUFDMUIsV0FBTyxVQUFVLFNBQVUsWUFBVyxNQUFNLEtBQUssQ0FBQyxHQUFFLElBQUksS0FBSyxDQUFDLEdBQUUsSUFBSSxRQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSTtBQUFBLEVBQ3JHO0FBRUEsU0FBTztBQUNUOzs7QUM1T2UsdUJBQVMsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQzlDLE1BQUksUUFBUSxPQUFPLFVBQ2YsTUFDQSxJQUFJLElBQ0osSUFBSSxNQUFNLFFBQ1YsSUFBSSxPQUFPLFNBQVUsTUFBSyxNQUFNLE9BQU87QUFFM0MsU0FBTyxFQUFFLElBQUksR0FBRztBQUNkLFdBQU8sTUFBTSxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSztBQUN6QyxTQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTSxLQUFLLFFBQVE7QUFBQSxFQUM3QztBQUNGOzs7QUNSTyxJQUFJLE1BQU8sS0FBSSxLQUFLLEtBQUssQ0FBQyxLQUFLO0FBRS9CLHVCQUF1QixPQUFPLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSTtBQUMzRCxNQUFJLE9BQU8sQ0FBQyxHQUNSLFFBQVEsT0FBTyxVQUNmLEtBQ0EsV0FDQSxLQUFLLEdBQ0wsS0FBSyxHQUNMLElBQUksTUFBTSxRQUNWLElBQUksSUFDSixRQUFRLE9BQU8sT0FDZixVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsT0FDQTtBQUVKLFNBQU8sS0FBSyxHQUFHO0FBQ2IsU0FBSyxLQUFLLElBQUksS0FBSyxLQUFLO0FBR3hCO0FBQUcsaUJBQVcsTUFBTSxNQUFNO0FBQUEsV0FBYyxDQUFDLFlBQVksS0FBSztBQUMxRCxlQUFXLFdBQVc7QUFDdEIsWUFBUSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFLLFNBQVE7QUFDOUMsV0FBTyxXQUFXLFdBQVc7QUFDN0IsZUFBVyxLQUFLLElBQUksV0FBVyxNQUFNLE9BQU8sUUFBUTtBQUdwRCxXQUFPLEtBQUssR0FBRyxFQUFFLElBQUk7QUFDbkIsa0JBQVksWUFBWSxNQUFNLElBQUk7QUFDbEMsVUFBSSxZQUFZO0FBQVUsbUJBQVc7QUFDckMsVUFBSSxZQUFZO0FBQVUsbUJBQVc7QUFDckMsYUFBTyxXQUFXLFdBQVc7QUFDN0IsaUJBQVcsS0FBSyxJQUFJLFdBQVcsTUFBTSxPQUFPLFFBQVE7QUFDcEQsVUFBSSxXQUFXLFVBQVU7QUFBRSxvQkFBWTtBQUFXO0FBQUEsTUFBTztBQUN6RCxpQkFBVztBQUFBLElBQ2I7QUFHQSxTQUFLLEtBQUssTUFBTSxFQUFDLE9BQU8sVUFBVSxNQUFNLEtBQUssSUFBSSxVQUFVLE1BQU0sTUFBTSxJQUFJLEVBQUUsRUFBQyxDQUFDO0FBQy9FLFFBQUksSUFBSTtBQUFNLG1CQUFZLEtBQUssSUFBSSxJQUFJLElBQUksUUFBUSxNQUFNLEtBQUssV0FBVyxRQUFRLEVBQUU7QUFBQTtBQUM5RSxvQkFBYSxLQUFLLElBQUksSUFBSSxRQUFRLE1BQU0sS0FBSyxXQUFXLFFBQVEsSUFBSSxFQUFFO0FBQzNFLGFBQVMsVUFBVSxLQUFLO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxJQUFPLG1CQUFTLGdCQUFnQixPQUFPO0FBRXJDLG9CQUFrQixRQUFRLElBQUksSUFBSSxJQUFJLElBQUk7QUFDeEMsa0JBQWMsT0FBTyxRQUFRLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQSxFQUM3QztBQUVBLFdBQVMsUUFBUSxTQUFTLElBQUc7QUFDM0IsV0FBTyxPQUFRLE1BQUksQ0FBQyxNQUFLLElBQUksS0FBSSxDQUFDO0FBQUEsRUFDcEM7QUFFQSxTQUFPO0FBQ1QsRUFBRyxHQUFHOzs7QUM1RFMsMkJBQVc7QUFDeEIsTUFBSSxPQUFPLGtCQUNQLFFBQVEsT0FDUixLQUFLLEdBQ0wsS0FBSyxHQUNMLGVBQWUsQ0FBQyxDQUFDLEdBQ2pCLGVBQWUsY0FDZixhQUFhLGNBQ2IsZUFBZSxjQUNmLGdCQUFnQixjQUNoQixjQUFjO0FBRWxCLG1CQUFpQixPQUFNO0FBQ3JCLFVBQUssS0FDTCxNQUFLLEtBQUs7QUFDVixVQUFLLEtBQUs7QUFDVixVQUFLLEtBQUs7QUFDVixVQUFLLFdBQVcsWUFBWTtBQUM1QixtQkFBZSxDQUFDLENBQUM7QUFDakIsUUFBSTtBQUFPLFlBQUssV0FBVyxjQUFTO0FBQ3BDLFdBQU87QUFBQSxFQUNUO0FBRUEsd0JBQXNCLE1BQU07QUFDMUIsUUFBSSxJQUFJLGFBQWEsS0FBSyxRQUN0QixLQUFLLEtBQUssS0FBSyxHQUNmLEtBQUssS0FBSyxLQUFLLEdBQ2YsS0FBSyxLQUFLLEtBQUssR0FDZixLQUFLLEtBQUssS0FBSztBQUNuQixRQUFJLEtBQUs7QUFBSSxXQUFLLEtBQU0sTUFBSyxNQUFNO0FBQ25DLFFBQUksS0FBSztBQUFJLFdBQUssS0FBTSxNQUFLLE1BQU07QUFDbkMsU0FBSyxLQUFLO0FBQ1YsU0FBSyxLQUFLO0FBQ1YsU0FBSyxLQUFLO0FBQ1YsU0FBSyxLQUFLO0FBQ1YsUUFBSSxLQUFLLFVBQVU7QUFDakIsVUFBSSxhQUFhLEtBQUssUUFBUSxLQUFLLGFBQWEsSUFBSSxJQUFJO0FBQ3hELFlBQU0sWUFBWSxJQUFJLElBQUk7QUFDMUIsWUFBTSxXQUFXLElBQUksSUFBSTtBQUN6QixZQUFNLGFBQWEsSUFBSSxJQUFJO0FBQzNCLFlBQU0sY0FBYyxJQUFJLElBQUk7QUFDNUIsVUFBSSxLQUFLO0FBQUksYUFBSyxLQUFNLE1BQUssTUFBTTtBQUNuQyxVQUFJLEtBQUs7QUFBSSxhQUFLLEtBQU0sTUFBSyxNQUFNO0FBQ25DLFdBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBRUEsVUFBUSxRQUFRLFNBQVMsSUFBRztBQUMxQixXQUFPLFVBQVUsU0FBVSxTQUFRLENBQUMsQ0FBQyxJQUFHLFdBQVc7QUFBQSxFQUNyRDtBQUVBLFVBQVEsT0FBTyxTQUFTLElBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsTUFBSyxDQUFDLEdBQUUsSUFBSSxLQUFLLENBQUMsR0FBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7QUFBQSxFQUN2RTtBQUVBLFVBQVEsT0FBTyxTQUFTLElBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsUUFBTyxTQUFTLEVBQUMsR0FBRyxXQUFXO0FBQUEsRUFDNUQ7QUFFQSxVQUFRLFVBQVUsU0FBUyxJQUFHO0FBQzVCLFdBQU8sVUFBVSxTQUFTLFFBQVEsYUFBYSxFQUFDLEVBQUUsYUFBYSxFQUFDLElBQUksUUFBUSxhQUFhO0FBQUEsRUFDM0Y7QUFFQSxVQUFRLGVBQWUsU0FBUyxJQUFHO0FBQ2pDLFdBQU8sVUFBVSxTQUFVLGdCQUFlLE9BQU8sT0FBTSxhQUFhLEtBQUksa0JBQVMsQ0FBQyxFQUFDLEdBQUcsV0FBVztBQUFBLEVBQ25HO0FBRUEsVUFBUSxlQUFlLFNBQVMsSUFBRztBQUNqQyxXQUFPLFVBQVUsU0FBUyxRQUFRLFdBQVcsRUFBQyxFQUFFLGFBQWEsRUFBQyxFQUFFLGNBQWMsRUFBQyxFQUFFLFlBQVksRUFBQyxJQUFJLFFBQVEsV0FBVztBQUFBLEVBQ3ZIO0FBRUEsVUFBUSxhQUFhLFNBQVMsSUFBRztBQUMvQixXQUFPLFVBQVUsU0FBVSxjQUFhLE9BQU8sT0FBTSxhQUFhLEtBQUksa0JBQVMsQ0FBQyxFQUFDLEdBQUcsV0FBVztBQUFBLEVBQ2pHO0FBRUEsVUFBUSxlQUFlLFNBQVMsSUFBRztBQUNqQyxXQUFPLFVBQVUsU0FBVSxnQkFBZSxPQUFPLE9BQU0sYUFBYSxLQUFJLGtCQUFTLENBQUMsRUFBQyxHQUFHLFdBQVc7QUFBQSxFQUNuRztBQUVBLFVBQVEsZ0JBQWdCLFNBQVMsSUFBRztBQUNsQyxXQUFPLFVBQVUsU0FBVSxpQkFBZ0IsT0FBTyxPQUFNLGFBQWEsS0FBSSxrQkFBUyxDQUFDLEVBQUMsR0FBRyxXQUFXO0FBQUEsRUFDcEc7QUFFQSxVQUFRLGNBQWMsU0FBUyxJQUFHO0FBQ2hDLFdBQU8sVUFBVSxTQUFVLGVBQWMsT0FBTyxPQUFNLGFBQWEsS0FBSSxrQkFBUyxDQUFDLEVBQUMsR0FBRyxXQUFXO0FBQUEsRUFDbEc7QUFFQSxTQUFPO0FBQ1Q7OztBQzdGZSx3QkFBUyxRQUFRLElBQUksSUFBSSxJQUFJLElBQUk7QUFDOUMsTUFBSSxRQUFRLE9BQU8sVUFDZixHQUFHLElBQUksTUFBTSxRQUNiLEtBQUssT0FBTyxJQUFJLE1BQU0sSUFBSSxDQUFDO0FBRS9CLE9BQUssS0FBSyxLQUFLLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEMsU0FBSyxJQUFJLEtBQUssT0FBTyxNQUFNLEdBQUc7QUFBQSxFQUNoQztBQUVBLFlBQVUsR0FBRyxHQUFHLE9BQU8sT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFO0FBRTVDLHFCQUFtQixJQUFHLEdBQUcsT0FBTyxLQUFJLEtBQUksS0FBSSxLQUFJO0FBQzlDLFFBQUksTUFBSyxJQUFJLEdBQUc7QUFDZCxVQUFJLE9BQU8sTUFBTTtBQUNqQixXQUFLLEtBQUssS0FBSSxLQUFLLEtBQUs7QUFDeEIsV0FBSyxLQUFLLEtBQUksS0FBSyxLQUFLO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFFBQUksY0FBYyxLQUFLLEtBQ25CLGNBQWUsUUFBUSxJQUFLLGFBQzVCLElBQUksS0FBSSxHQUNSLEtBQUssSUFBSTtBQUViLFdBQU8sSUFBSSxJQUFJO0FBQ2IsVUFBSSxNQUFNLElBQUksT0FBTztBQUNyQixVQUFJLEtBQUssT0FBTztBQUFhLFlBQUksTUFBTTtBQUFBO0FBQ2xDLGFBQUs7QUFBQSxJQUNaO0FBRUEsUUFBSyxjQUFjLEtBQUssSUFBSSxLQUFPLEtBQUssS0FBSyxlQUFnQixLQUFJLElBQUk7QUFBRyxRQUFFO0FBRTFFLFFBQUksWUFBWSxLQUFLLEtBQUssYUFDdEIsYUFBYSxRQUFRO0FBRXpCLFFBQUssTUFBSyxNQUFPLE1BQUssS0FBSztBQUN6QixVQUFJLEtBQUssUUFBUyxPQUFLLGFBQWEsTUFBSyxhQUFhLFFBQVE7QUFDOUQsZ0JBQVUsSUFBRyxHQUFHLFdBQVcsS0FBSSxLQUFJLElBQUksR0FBRTtBQUN6QyxnQkFBVSxHQUFHLEdBQUcsWUFBWSxJQUFJLEtBQUksS0FBSSxHQUFFO0FBQUEsSUFDNUMsT0FBTztBQUNMLFVBQUksS0FBSyxRQUFTLE9BQUssYUFBYSxNQUFLLGFBQWEsUUFBUTtBQUM5RCxnQkFBVSxJQUFHLEdBQUcsV0FBVyxLQUFJLEtBQUksS0FBSSxFQUFFO0FBQ3pDLGdCQUFVLEdBQUcsR0FBRyxZQUFZLEtBQUksSUFBSSxLQUFJLEdBQUU7QUFBQSxJQUM1QztBQUFBLEVBQ0Y7QUFDRjs7O0FDN0NPLG1CQUFtQixRQUFRLE9BQU87QUFDdkMsVUFBUSxVQUFVO0FBQUEsU0FDWDtBQUFHO0FBQUEsU0FDSDtBQUFHLFdBQUssTUFBTSxNQUFNO0FBQUc7QUFBQTtBQUNuQixXQUFLLE1BQU0sS0FBSyxFQUFFLE9BQU8sTUFBTTtBQUFHO0FBQUE7QUFFN0MsU0FBTztBQUNUOzs7QUNMTyxJQUFNLFdBQVcsT0FBTyxVQUFVO0FBRTFCLG1CQUFtQjtBQUNoQyxNQUFJLFNBQVEsb0JBQUksSUFBSSxHQUNoQixTQUFTLENBQUMsR0FDVixRQUFRLENBQUMsR0FDVCxVQUFVO0FBRWQsaUJBQWUsR0FBRztBQUNoQixRQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksT0FBTSxJQUFJLEdBQUc7QUFDbkMsUUFBSSxDQUFDLEdBQUc7QUFDTixVQUFJLFlBQVk7QUFBVSxlQUFPO0FBQ2pDLGFBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsQ0FBQztBQUFBLElBQ25DO0FBQ0EsV0FBTyxNQUFPLEtBQUksS0FBSyxNQUFNO0FBQUEsRUFDL0I7QUFFQSxRQUFNLFNBQVMsU0FBUyxHQUFHO0FBQ3pCLFFBQUksQ0FBQyxVQUFVO0FBQVEsYUFBTyxPQUFPLE1BQU07QUFDM0MsYUFBUyxDQUFDLEdBQUcsU0FBUSxvQkFBSSxJQUFJO0FBQzdCLGVBQVcsU0FBUyxHQUFHO0FBQ3JCLFlBQU0sTUFBTSxRQUFRO0FBQ3BCLFVBQUksT0FBTSxJQUFJLEdBQUc7QUFBRztBQUNwQixhQUFNLElBQUksS0FBSyxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDbkM7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sUUFBUSxTQUFTLEdBQUc7QUFDeEIsV0FBTyxVQUFVLFNBQVUsU0FBUSxNQUFNLEtBQUssQ0FBQyxHQUFHLFNBQVMsTUFBTSxNQUFNO0FBQUEsRUFDekU7QUFFQSxRQUFNLFVBQVUsU0FBUyxHQUFHO0FBQzFCLFdBQU8sVUFBVSxTQUFVLFdBQVUsR0FBRyxTQUFTO0FBQUEsRUFDbkQ7QUFFQSxRQUFNLE9BQU8sV0FBVztBQUN0QixXQUFPLFFBQVEsUUFBUSxLQUFLLEVBQUUsUUFBUSxPQUFPO0FBQUEsRUFDL0M7QUFFQSxZQUFVLE1BQU0sT0FBTyxTQUFTO0FBRWhDLFNBQU87QUFDVDs7O0FDekNlLGdCQUFnQjtBQUM3QixNQUFJLFFBQVEsUUFBUSxFQUFFLFFBQVEsTUFBUyxHQUNuQyxTQUFTLE1BQU0sUUFDZixlQUFlLE1BQU0sT0FDckIsS0FBSyxHQUNMLEtBQUssR0FDTCxNQUNBLFdBQ0EsUUFBUSxPQUNSLGVBQWUsR0FDZixlQUFlLEdBQ2YsUUFBUTtBQUVaLFNBQU8sTUFBTTtBQUViLHFCQUFtQjtBQUNqQixRQUFJLElBQUksT0FBTyxFQUFFLFFBQ2IsVUFBVSxLQUFLLElBQ2YsU0FBUSxVQUFVLEtBQUssSUFDdkIsT0FBTyxVQUFVLEtBQUs7QUFDMUIsV0FBUSxRQUFPLFVBQVMsS0FBSyxJQUFJLEdBQUcsSUFBSSxlQUFlLGVBQWUsQ0FBQztBQUN2RSxRQUFJO0FBQU8sYUFBTyxLQUFLLE1BQU0sSUFBSTtBQUNqQyxjQUFVLFFBQU8sU0FBUSxPQUFRLEtBQUksaUJBQWlCO0FBQ3RELGdCQUFZLE9BQVEsS0FBSTtBQUN4QixRQUFJO0FBQU8sZUFBUSxLQUFLLE1BQU0sTUFBSyxHQUFHLFlBQVksS0FBSyxNQUFNLFNBQVM7QUFDdEUsUUFBSSxTQUFTLGNBQVMsQ0FBQyxFQUFFLElBQUksU0FBUyxHQUFHO0FBQUUsYUFBTyxTQUFRLE9BQU87QUFBQSxJQUFHLENBQUM7QUFDckUsV0FBTyxhQUFhLFVBQVUsT0FBTyxRQUFRLElBQUksTUFBTTtBQUFBLEVBQ3pEO0FBRUEsUUFBTSxTQUFTLFNBQVMsR0FBRztBQUN6QixXQUFPLFVBQVUsU0FBVSxRQUFPLENBQUMsR0FBRyxRQUFRLEtBQUssT0FBTztBQUFBLEVBQzVEO0FBRUEsUUFBTSxRQUFRLFNBQVMsR0FBRztBQUN4QixXQUFPLFVBQVUsU0FBVSxFQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO0FBQUEsRUFDbkY7QUFFQSxRQUFNLGFBQWEsU0FBUyxHQUFHO0FBQzdCLFdBQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsTUFBTSxRQUFRO0FBQUEsRUFDakU7QUFFQSxRQUFNLFlBQVksV0FBVztBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sT0FBTyxXQUFXO0FBQ3RCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxRQUFRLFNBQVMsR0FBRztBQUN4QixXQUFPLFVBQVUsU0FBVSxTQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsS0FBSztBQUFBLEVBQ3ZEO0FBRUEsUUFBTSxVQUFVLFNBQVMsR0FBRztBQUMxQixXQUFPLFVBQVUsU0FBVSxnQkFBZSxLQUFLLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLFFBQVEsS0FBSztBQUFBLEVBQ3pGO0FBRUEsUUFBTSxlQUFlLFNBQVMsR0FBRztBQUMvQixXQUFPLFVBQVUsU0FBVSxnQkFBZSxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsUUFBUSxLQUFLO0FBQUEsRUFDekU7QUFFQSxRQUFNLGVBQWUsU0FBUyxHQUFHO0FBQy9CLFdBQU8sVUFBVSxTQUFVLGdCQUFlLENBQUMsR0FBRyxRQUFRLEtBQUs7QUFBQSxFQUM3RDtBQUVBLFFBQU0sUUFBUSxTQUFTLEdBQUc7QUFDeEIsV0FBTyxVQUFVLFNBQVUsU0FBUSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUs7QUFBQSxFQUMvRTtBQUVBLFFBQU0sT0FBTyxXQUFXO0FBQ3RCLFdBQU8sS0FBSyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUN6QixNQUFNLEtBQUssRUFDWCxhQUFhLFlBQVksRUFDekIsYUFBYSxZQUFZLEVBQ3pCLE1BQU0sS0FBSztBQUFBLEVBQ2xCO0FBRUEsU0FBTyxVQUFVLE1BQU0sUUFBUSxHQUFHLFNBQVM7QUFDN0M7QUFFQSxrQkFBa0IsT0FBTztBQUN2QixNQUFJLFFBQU8sTUFBTTtBQUVqQixRQUFNLFVBQVUsTUFBTTtBQUN0QixTQUFPLE1BQU07QUFDYixTQUFPLE1BQU07QUFFYixRQUFNLE9BQU8sV0FBVztBQUN0QixXQUFPLFNBQVMsTUFBSyxDQUFDO0FBQUEsRUFDeEI7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxpQkFBaUI7QUFDdEIsU0FBTyxTQUFTLEtBQUssTUFBTSxNQUFNLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUM3RDs7O0FDcEdlLG1CQUFtQixJQUFHO0FBQ25DLFNBQU8sV0FBVztBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUNGOzs7QUNKZSxnQkFBZ0IsSUFBRztBQUNoQyxTQUFPLENBQUM7QUFDVjs7O0FDR0EsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDO0FBRVQsbUJBQWtCLElBQUc7QUFDMUIsU0FBTztBQUNUO0FBRUEsbUJBQW1CLElBQUcsR0FBRztBQUN2QixTQUFRLE1BQU0sS0FBSSxDQUFDLE1BQ2IsU0FBUyxJQUFHO0FBQUUsV0FBUSxNQUFJLE1BQUs7QUFBQSxFQUFHLElBQ2xDLFVBQVMsTUFBTSxDQUFDLElBQUksTUFBTSxHQUFHO0FBQ3JDO0FBRUEsaUJBQWlCLElBQUcsR0FBRztBQUNyQixNQUFJO0FBQ0osTUFBSSxLQUFJO0FBQUcsUUFBSSxJQUFHLEtBQUksR0FBRyxJQUFJO0FBQzdCLFNBQU8sU0FBUyxJQUFHO0FBQUUsV0FBTyxLQUFLLElBQUksSUFBRyxLQUFLLElBQUksR0FBRyxFQUFDLENBQUM7QUFBQSxFQUFHO0FBQzNEO0FBSUEsZUFBZSxRQUFRLE9BQU8sYUFBYTtBQUN6QyxNQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssTUFBTTtBQUM5RCxNQUFJLEtBQUs7QUFBSSxTQUFLLFVBQVUsSUFBSSxFQUFFLEdBQUcsS0FBSyxZQUFZLElBQUksRUFBRTtBQUFBO0FBQ3ZELFNBQUssVUFBVSxJQUFJLEVBQUUsR0FBRyxLQUFLLFlBQVksSUFBSSxFQUFFO0FBQ3BELFNBQU8sU0FBUyxJQUFHO0FBQUUsV0FBTyxHQUFHLEdBQUcsRUFBQyxDQUFDO0FBQUEsRUFBRztBQUN6QztBQUVBLGlCQUFpQixRQUFRLE9BQU8sYUFBYTtBQUMzQyxNQUFJLElBQUksS0FBSyxJQUFJLE9BQU8sUUFBUSxNQUFNLE1BQU0sSUFBSSxHQUM1QyxJQUFJLElBQUksTUFBTSxDQUFDLEdBQ2YsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUNmLElBQUk7QUFHUixNQUFJLE9BQU8sS0FBSyxPQUFPLElBQUk7QUFDekIsYUFBUyxPQUFPLE1BQU0sRUFBRSxRQUFRO0FBQ2hDLFlBQVEsTUFBTSxNQUFNLEVBQUUsUUFBUTtBQUFBLEVBQ2hDO0FBRUEsU0FBTyxFQUFFLElBQUksR0FBRztBQUNkLE1BQUUsS0FBSyxVQUFVLE9BQU8sSUFBSSxPQUFPLElBQUksRUFBRTtBQUN6QyxNQUFFLEtBQUssWUFBWSxNQUFNLElBQUksTUFBTSxJQUFJLEVBQUU7QUFBQSxFQUMzQztBQUVBLFNBQU8sU0FBUyxJQUFHO0FBQ2pCLFFBQUksS0FBSSxlQUFPLFFBQVEsSUFBRyxHQUFHLENBQUMsSUFBSTtBQUNsQyxXQUFPLEVBQUUsSUFBRyxFQUFFLElBQUcsRUFBQyxDQUFDO0FBQUEsRUFDckI7QUFDRjtBQUVPLGVBQWMsUUFBUSxRQUFRO0FBQ25DLFNBQU8sT0FDRixPQUFPLE9BQU8sT0FBTyxDQUFDLEVBQ3RCLE1BQU0sT0FBTyxNQUFNLENBQUMsRUFDcEIsWUFBWSxPQUFPLFlBQVksQ0FBQyxFQUNoQyxNQUFNLE9BQU8sTUFBTSxDQUFDLEVBQ3BCLFFBQVEsT0FBTyxRQUFRLENBQUM7QUFDL0I7QUFFTyx1QkFBdUI7QUFDNUIsTUFBSSxTQUFTLE1BQ1QsUUFBUSxNQUNSLGNBQWMsZUFDZCxZQUNBLGFBQ0EsU0FDQSxRQUFRLFdBQ1IsV0FDQSxRQUNBO0FBRUoscUJBQW1CO0FBQ2pCLFFBQUksSUFBSSxLQUFLLElBQUksT0FBTyxRQUFRLE1BQU0sTUFBTTtBQUM1QyxRQUFJLFVBQVU7QUFBVSxjQUFRLFFBQVEsT0FBTyxJQUFJLE9BQU8sSUFBSSxFQUFFO0FBQ2hFLGdCQUFZLElBQUksSUFBSSxVQUFVO0FBQzlCLGFBQVMsUUFBUTtBQUNqQixXQUFPO0FBQUEsRUFDVDtBQUVBLGlCQUFlLElBQUc7QUFDaEIsV0FBTyxNQUFLLFFBQVEsTUFBTSxLQUFJLENBQUMsRUFBQyxJQUFJLFVBQVcsV0FBVyxVQUFTLFVBQVUsT0FBTyxJQUFJLFVBQVMsR0FBRyxPQUFPLFdBQVcsSUFBSSxXQUFVLE1BQU0sRUFBQyxDQUFDLENBQUM7QUFBQSxFQUMvSTtBQUVBLFFBQU0sU0FBUyxTQUFTLElBQUc7QUFDekIsV0FBTyxNQUFNLFlBQWEsVUFBVSxTQUFRLFVBQVUsT0FBTyxPQUFPLElBQUksVUFBUyxHQUFHLGVBQWlCLElBQUksRUFBQyxDQUFDLENBQUM7QUFBQSxFQUM5RztBQUVBLFFBQU0sU0FBUyxTQUFTLEdBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsVUFBUyxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxLQUFLLE9BQU8sTUFBTTtBQUFBLEVBQ3ZGO0FBRUEsUUFBTSxRQUFRLFNBQVMsR0FBRztBQUN4QixXQUFPLFVBQVUsU0FBVSxTQUFRLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSxLQUFLLE1BQU0sTUFBTTtBQUFBLEVBQzdFO0FBRUEsUUFBTSxhQUFhLFNBQVMsR0FBRztBQUM3QixXQUFPLFFBQVEsTUFBTSxLQUFLLENBQUMsR0FBRyxjQUFjLGVBQWtCLFFBQVE7QUFBQSxFQUN4RTtBQUVBLFFBQU0sUUFBUSxTQUFTLEdBQUc7QUFDeEIsV0FBTyxVQUFVLFNBQVUsU0FBUSxJQUFJLE9BQU8sV0FBVSxRQUFRLEtBQUssVUFBVTtBQUFBLEVBQ2pGO0FBRUEsUUFBTSxjQUFjLFNBQVMsR0FBRztBQUM5QixXQUFPLFVBQVUsU0FBVSxlQUFjLEdBQUcsUUFBUSxLQUFLO0FBQUEsRUFDM0Q7QUFFQSxRQUFNLFVBQVUsU0FBUyxHQUFHO0FBQzFCLFdBQU8sVUFBVSxTQUFVLFdBQVUsR0FBRyxTQUFTO0FBQUEsRUFDbkQ7QUFFQSxTQUFPLFNBQVMsR0FBRyxHQUFHO0FBQ3BCLGlCQUFZLEdBQUcsY0FBYztBQUM3QixXQUFPLFFBQVE7QUFBQSxFQUNqQjtBQUNGO0FBRWUsc0JBQXNCO0FBQ25DLFNBQU8sWUFBWSxFQUFFLFdBQVUsU0FBUTtBQUN6Qzs7O0FDekhlLG9CQUFvQixRQUFPLE1BQU0sUUFBTyxXQUFXO0FBQ2hFLE1BQUksT0FBTyxTQUFTLFFBQU8sTUFBTSxNQUFLLEdBQ2xDO0FBQ0osY0FBWSxnQkFBZ0IsYUFBYSxPQUFPLE9BQU8sU0FBUztBQUNoRSxVQUFRLFVBQVU7QUFBQSxTQUNYLEtBQUs7QUFDUixVQUFJLFFBQVEsS0FBSyxJQUFJLEtBQUssSUFBSSxNQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQztBQUNwRCxVQUFJLFVBQVUsYUFBYSxRQUFRLENBQUMsTUFBTSxZQUFZLHdCQUFnQixNQUFNLEtBQUssQ0FBQztBQUFHLGtCQUFVLFlBQVk7QUFDM0csYUFBTyxhQUFhLFdBQVcsS0FBSztBQUFBLElBQ3RDO0FBQUEsU0FDSztBQUFBLFNBQ0E7QUFBQSxTQUNBO0FBQUEsU0FDQTtBQUFBLFNBQ0EsS0FBSztBQUNSLFVBQUksVUFBVSxhQUFhLFFBQVEsQ0FBQyxNQUFNLFlBQVksdUJBQWUsTUFBTSxLQUFLLElBQUksS0FBSyxJQUFJLE1BQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUFHLGtCQUFVLFlBQVksWUFBYSxXQUFVLFNBQVM7QUFDOUs7QUFBQSxJQUNGO0FBQUEsU0FDSztBQUFBLFNBQ0EsS0FBSztBQUNSLFVBQUksVUFBVSxhQUFhLFFBQVEsQ0FBQyxNQUFNLFlBQVksdUJBQWUsSUFBSSxDQUFDO0FBQUcsa0JBQVUsWUFBWSxZQUFhLFdBQVUsU0FBUyxPQUFPO0FBQzFJO0FBQUEsSUFDRjtBQUFBO0FBRUYsU0FBTyxPQUFPLFNBQVM7QUFDekI7OztBQ3ZCTyxtQkFBbUIsT0FBTztBQUMvQixNQUFJLFNBQVMsTUFBTTtBQUVuQixRQUFNLFFBQVEsU0FBUyxRQUFPO0FBQzVCLFFBQUksSUFBSSxPQUFPO0FBQ2YsV0FBTyxjQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxJQUFJLFVBQVMsT0FBTyxLQUFLLE1BQUs7QUFBQSxFQUNoRTtBQUVBLFFBQU0sYUFBYSxTQUFTLFFBQU8sV0FBVztBQUM1QyxRQUFJLElBQUksT0FBTztBQUNmLFdBQU8sV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLFNBQVMsSUFBSSxVQUFTLE9BQU8sS0FBSyxRQUFPLFNBQVM7QUFBQSxFQUNoRjtBQUVBLFFBQU0sT0FBTyxTQUFTLFFBQU87QUFDM0IsUUFBSSxVQUFTO0FBQU0sZUFBUTtBQUUzQixRQUFJLElBQUksT0FBTztBQUNmLFFBQUksS0FBSztBQUNULFFBQUksS0FBSyxFQUFFLFNBQVM7QUFDcEIsUUFBSSxTQUFRLEVBQUU7QUFDZCxRQUFJLE9BQU8sRUFBRTtBQUNiLFFBQUk7QUFDSixRQUFJO0FBQ0osUUFBSSxVQUFVO0FBRWQsUUFBSSxPQUFPLFFBQU87QUFDaEIsYUFBTyxRQUFPLFNBQVEsTUFBTSxPQUFPO0FBQ25DLGFBQU8sSUFBSSxLQUFLLElBQUksS0FBSztBQUFBLElBQzNCO0FBRUEsV0FBTyxZQUFZLEdBQUc7QUFDcEIsYUFBTyxjQUFjLFFBQU8sTUFBTSxNQUFLO0FBQ3ZDLFVBQUksU0FBUyxTQUFTO0FBQ3BCLFVBQUUsTUFBTTtBQUNSLFVBQUUsTUFBTTtBQUNSLGVBQU8sT0FBTyxDQUFDO0FBQUEsTUFDakIsV0FBVyxPQUFPLEdBQUc7QUFDbkIsaUJBQVEsS0FBSyxNQUFNLFNBQVEsSUFBSSxJQUFJO0FBQ25DLGVBQU8sS0FBSyxLQUFLLE9BQU8sSUFBSSxJQUFJO0FBQUEsTUFDbEMsV0FBVyxPQUFPLEdBQUc7QUFDbkIsaUJBQVEsS0FBSyxLQUFLLFNBQVEsSUFBSSxJQUFJO0FBQ2xDLGVBQU8sS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJO0FBQUEsTUFDbkMsT0FBTztBQUNMO0FBQUEsTUFDRjtBQUNBLGdCQUFVO0FBQUEsSUFDWjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUNUO0FBRWUsbUJBQWtCO0FBQy9CLE1BQUksUUFBUSxXQUFXO0FBRXZCLFFBQU0sT0FBTyxXQUFXO0FBQ3RCLFdBQU8sTUFBSyxPQUFPLFFBQU8sQ0FBQztBQUFBLEVBQzdCO0FBRUEsWUFBVSxNQUFNLE9BQU8sU0FBUztBQUVoQyxTQUFPLFVBQVUsS0FBSztBQUN4Qjs7O0FDckVlLHdCQUFTLFdBQVc7QUFDakMsTUFBSSxJQUFJLFVBQVUsU0FBUyxJQUFJLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUk7QUFDN0QsU0FBTyxJQUFJO0FBQUcsV0FBTyxLQUFLLE1BQU0sVUFBVSxNQUFNLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQztBQUM5RCxTQUFPO0FBQ1Q7OztBQ0ZBLElBQU8scUJBQVEsZUFBTyw4REFBOEQ7OztBQ0M3RSxJQUFJLE9BQU8sY0FBeUIsVUFBVSxNQUFNLE1BQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxLQUFNLEdBQUcsQ0FBQztBQUV6RixJQUFJLE9BQU8sY0FBeUIsVUFBVSxLQUFLLE1BQU0sSUFBSSxHQUFHLFVBQVUsSUFBSSxLQUFNLEdBQUcsQ0FBQztBQUUvRixJQUFJLEtBQUksVUFBVTtBQUVILHlCQUFTLEdBQUc7QUFDekIsTUFBSSxJQUFJLEtBQUssSUFBSTtBQUFHLFNBQUssS0FBSyxNQUFNLENBQUM7QUFDckMsTUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEdBQUc7QUFDekIsS0FBRSxJQUFJLE1BQU0sSUFBSTtBQUNoQixLQUFFLElBQUksTUFBTSxNQUFNO0FBQ2xCLEtBQUUsSUFBSSxNQUFNLE1BQU07QUFDbEIsU0FBTyxLQUFJO0FBQ2I7OztBQ2hCZSwyQkFBUyxJQUFHO0FBQ3pCLFNBQU8sb0JBQW9CO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ0pPLElBQUksT0FBTSxLQUFLO0FBQ2YsSUFBSSxRQUFRLEtBQUs7QUFDakIsSUFBSSxNQUFNLEtBQUs7QUFDZixJQUFJLE9BQU0sS0FBSztBQUNmLElBQUksT0FBTSxLQUFLO0FBQ2YsSUFBSSxNQUFNLEtBQUs7QUFDZixJQUFJLE9BQU8sS0FBSztBQUVoQixJQUFJLFdBQVU7QUFDZCxJQUFJLE1BQUssS0FBSztBQUNkLElBQUksU0FBUyxNQUFLO0FBQ2xCLElBQUksT0FBTSxJQUFJO0FBRWQsY0FBYyxJQUFHO0FBQ3RCLFNBQU8sS0FBSSxJQUFJLElBQUksS0FBSSxLQUFLLE1BQUssS0FBSyxLQUFLLEVBQUM7QUFDOUM7QUFFTyxjQUFjLElBQUc7QUFDdEIsU0FBTyxNQUFLLElBQUksU0FBUyxNQUFLLEtBQUssQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFDO0FBQzFEOzs7QUNmQSx3QkFBd0IsR0FBRztBQUN6QixTQUFPLEVBQUU7QUFDWDtBQUVBLHdCQUF3QixHQUFHO0FBQ3pCLFNBQU8sRUFBRTtBQUNYO0FBRUEsdUJBQXVCLEdBQUc7QUFDeEIsU0FBTyxFQUFFO0FBQ1g7QUFFQSxxQkFBcUIsR0FBRztBQUN0QixTQUFPLEVBQUU7QUFDWDtBQUVBLHFCQUFxQixHQUFHO0FBQ3RCLFNBQU8sS0FBSyxFQUFFO0FBQ2hCO0FBRUEsbUJBQW1CLElBQUksSUFBSSxJQUFJLElBQUksS0FBSSxLQUFJLEtBQUksS0FBSTtBQUNqRCxNQUFJLE1BQU0sS0FBSyxJQUFJLE1BQU0sS0FBSyxJQUMxQixPQUFNLE1BQUssS0FBSSxPQUFNLE1BQUssS0FDMUIsSUFBSSxPQUFNLE1BQU0sT0FBTTtBQUMxQixNQUFJLElBQUksSUFBSTtBQUFTO0FBQ3JCLE1BQUssUUFBTyxNQUFLLE9BQU0sT0FBTyxNQUFLLFFBQU87QUFDMUMsU0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHO0FBQ3BDO0FBSUEsd0JBQXdCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFDbEQsTUFBSSxNQUFNLEtBQUssSUFDWCxNQUFNLEtBQUssSUFDWCxLQUFNLE1BQUssS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLE1BQU0sTUFBTSxHQUFHLEdBQ2pELEtBQUssS0FBSyxLQUNWLEtBQUssQ0FBQyxLQUFLLEtBQ1gsTUFBTSxLQUFLLElBQ1gsTUFBTSxLQUFLLElBQ1gsTUFBTSxLQUFLLElBQ1gsTUFBTSxLQUFLLElBQ1gsTUFBTyxPQUFNLE9BQU8sR0FDcEIsTUFBTyxPQUFNLE9BQU8sR0FDcEIsS0FBSyxNQUFNLEtBQ1gsS0FBSyxNQUFNLEtBQ1gsS0FBSyxLQUFLLEtBQUssS0FBSyxJQUNwQixJQUFJLEtBQUssSUFDVCxLQUFJLE1BQU0sTUFBTSxNQUFNLEtBQ3RCLElBQUssTUFBSyxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUksR0FBRyxJQUFJLElBQUksS0FBSyxLQUFJLEVBQUMsQ0FBQyxHQUN2RCxNQUFPLE1BQUksS0FBSyxLQUFLLEtBQUssSUFDMUIsTUFBTyxFQUFDLEtBQUksS0FBSyxLQUFLLEtBQUssSUFDM0IsTUFBTyxNQUFJLEtBQUssS0FBSyxLQUFLLElBQzFCLE1BQU8sRUFBQyxLQUFJLEtBQUssS0FBSyxLQUFLLElBQzNCLE1BQU0sTUFBTSxLQUNaLE1BQU0sTUFBTSxLQUNaLE1BQU0sTUFBTSxLQUNaLE1BQU0sTUFBTTtBQUloQixNQUFJLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFBSyxVQUFNLEtBQUssTUFBTTtBQUVwRSxTQUFPO0FBQUEsSUFDTCxJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixLQUFLLENBQUM7QUFBQSxJQUNOLEtBQUssQ0FBQztBQUFBLElBQ04sS0FBSyxNQUFPLE1BQUssSUFBSTtBQUFBLElBQ3JCLEtBQUssTUFBTyxNQUFLLElBQUk7QUFBQSxFQUN2QjtBQUNGO0FBRWUsdUJBQVc7QUFDeEIsTUFBSSxjQUFjLGdCQUNkLGNBQWMsZ0JBQ2QsZUFBZSxrQkFBUyxDQUFDLEdBQ3pCLFlBQVksTUFDWixhQUFhLGVBQ2IsV0FBVyxhQUNYLFdBQVcsYUFDWCxVQUFVO0FBRWQsaUJBQWU7QUFDYixRQUFJLFFBQ0EsR0FDQSxLQUFLLENBQUMsWUFBWSxNQUFNLE1BQU0sU0FBUyxHQUN2QyxLQUFLLENBQUMsWUFBWSxNQUFNLE1BQU0sU0FBUyxHQUN2QyxLQUFLLFdBQVcsTUFBTSxNQUFNLFNBQVMsSUFBSSxRQUN6QyxLQUFLLFNBQVMsTUFBTSxNQUFNLFNBQVMsSUFBSSxRQUN2QyxLQUFLLEtBQUksS0FBSyxFQUFFLEdBQ2hCLEtBQUssS0FBSztBQUVkLFFBQUksQ0FBQztBQUFTLGdCQUFVLFNBQVMsYUFBSztBQUd0QyxRQUFJLEtBQUs7QUFBSSxVQUFJLElBQUksS0FBSyxJQUFJLEtBQUs7QUFHbkMsUUFBSSxDQUFFLE1BQUs7QUFBVSxjQUFRLE9BQU8sR0FBRyxDQUFDO0FBQUEsYUFHL0IsS0FBSyxPQUFNLFVBQVM7QUFDM0IsY0FBUSxPQUFPLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUN6QyxjQUFRLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtBQUNqQyxVQUFJLEtBQUssVUFBUztBQUNoQixnQkFBUSxPQUFPLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUN6QyxnQkFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxFQUFFO0FBQUEsTUFDbEM7QUFBQSxJQUNGLE9BR0s7QUFDSCxVQUFJLE1BQU0sSUFDTixNQUFNLElBQ04sTUFBTSxJQUNOLE1BQU0sSUFDTixNQUFNLElBQ04sTUFBTSxJQUNOLEtBQUssU0FBUyxNQUFNLE1BQU0sU0FBUyxJQUFJLEdBQ3ZDLEtBQU0sS0FBSyxZQUFhLGFBQVksQ0FBQyxVQUFVLE1BQU0sTUFBTSxTQUFTLElBQUksS0FBSyxLQUFLLEtBQUssS0FBSyxFQUFFLElBQzlGLEtBQUssS0FBSSxLQUFJLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxhQUFhLE1BQU0sTUFBTSxTQUFTLENBQUMsR0FDL0QsTUFBTSxJQUNOLE1BQU0sSUFDTixJQUNBO0FBR0osVUFBSSxLQUFLLFVBQVM7QUFDaEIsWUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLEdBQzNCLEtBQUssS0FBSyxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7QUFDL0IsWUFBSyxRQUFPLEtBQUssS0FBSztBQUFTLGdCQUFPLEtBQUssSUFBSSxJQUFLLE9BQU8sSUFBSSxPQUFPO0FBQUE7QUFDakUsZ0JBQU0sR0FBRyxNQUFNLE1BQU8sTUFBSyxNQUFNO0FBQ3RDLFlBQUssUUFBTyxLQUFLLEtBQUs7QUFBUyxnQkFBTyxLQUFLLElBQUksSUFBSyxPQUFPLElBQUksT0FBTztBQUFBO0FBQ2pFLGdCQUFNLEdBQUcsTUFBTSxNQUFPLE1BQUssTUFBTTtBQUFBLE1BQ3hDO0FBRUEsVUFBSSxNQUFNLEtBQUssSUFBSSxHQUFHLEdBQ2xCLE1BQU0sS0FBSyxJQUFJLEdBQUcsR0FDbEIsTUFBTSxLQUFLLElBQUksR0FBRyxHQUNsQixNQUFNLEtBQUssSUFBSSxHQUFHO0FBR3RCLFVBQUksS0FBSyxVQUFTO0FBQ2hCLFlBQUksTUFBTSxLQUFLLElBQUksR0FBRyxHQUNsQixNQUFNLEtBQUssSUFBSSxHQUFHLEdBQ2xCLE1BQU0sS0FBSyxJQUFJLEdBQUcsR0FDbEIsTUFBTSxLQUFLLElBQUksR0FBRyxHQUNsQjtBQUdKLFlBQUksS0FBSyxPQUFPLE1BQUssVUFBVSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSTtBQUN2RSxjQUFJLEtBQUssTUFBTSxHQUFHLElBQ2QsS0FBSyxNQUFNLEdBQUcsSUFDZCxLQUFLLE1BQU0sR0FBRyxJQUNkLEtBQUssTUFBTSxHQUFHLElBQ2QsS0FBSyxJQUFJLElBQUksS0FBTSxNQUFLLEtBQUssS0FBSyxNQUFPLE1BQUssS0FBSyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxHQUNoRyxLQUFLLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxFQUFFO0FBQzNDLGdCQUFNLEtBQUksSUFBSyxNQUFLLE1BQU8sTUFBSyxFQUFFO0FBQ2xDLGdCQUFNLEtBQUksSUFBSyxNQUFLLE1BQU8sTUFBSyxFQUFFO0FBQUEsUUFDcEM7QUFBQSxNQUNGO0FBR0EsVUFBSSxDQUFFLE9BQU07QUFBVSxnQkFBUSxPQUFPLEtBQUssR0FBRztBQUFBLGVBR3BDLE1BQU0sVUFBUztBQUN0QixhQUFLLGVBQWUsS0FBSyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssRUFBRTtBQUNuRCxhQUFLLGVBQWUsS0FBSyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssRUFBRTtBQUVuRCxnQkFBUSxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRztBQUc3QyxZQUFJLE1BQU07QUFBSSxrQkFBUSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFBQSxhQUd6RjtBQUNILGtCQUFRLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtBQUNoRixrQkFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDdkcsa0JBQVEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEtBQUssTUFBTSxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQUEsUUFDbEY7QUFBQSxNQUNGO0FBR0ssZ0JBQVEsT0FBTyxLQUFLLEdBQUcsR0FBRyxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUlsRSxVQUFJLENBQUUsTUFBSyxhQUFZLENBQUUsT0FBTTtBQUFVLGdCQUFRLE9BQU8sS0FBSyxHQUFHO0FBQUEsZUFHdkQsTUFBTSxVQUFTO0FBQ3RCLGFBQUssZUFBZSxLQUFLLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDcEQsYUFBSyxlQUFlLEtBQUssS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtBQUVwRCxnQkFBUSxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRztBQUc3QyxZQUFJLE1BQU07QUFBSSxrQkFBUSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFBQSxhQUd6RjtBQUNILGtCQUFRLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtBQUNoRixrQkFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQ3RHLGtCQUFRLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRTtBQUFBLFFBQ2xGO0FBQUEsTUFDRjtBQUdLLGdCQUFRLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUN6QztBQUVBLFlBQVEsVUFBVTtBQUVsQixRQUFJO0FBQVEsYUFBTyxVQUFVLE1BQU0sU0FBUyxNQUFNO0FBQUEsRUFDcEQ7QUFFQSxNQUFJLFdBQVcsV0FBVztBQUN4QixRQUFJLElBQUssRUFBQyxZQUFZLE1BQU0sTUFBTSxTQUFTLElBQUksQ0FBQyxZQUFZLE1BQU0sTUFBTSxTQUFTLEtBQUssR0FDbEYsS0FBSyxFQUFDLFdBQVcsTUFBTSxNQUFNLFNBQVMsSUFBSSxDQUFDLFNBQVMsTUFBTSxNQUFNLFNBQVMsS0FBSyxJQUFJLE1BQUs7QUFDM0YsV0FBTyxDQUFDLElBQUksRUFBQyxJQUFJLEdBQUcsSUFBSSxFQUFDLElBQUksQ0FBQztBQUFBLEVBQ2hDO0FBRUEsTUFBSSxjQUFjLFNBQVMsR0FBRztBQUM1QixXQUFPLFVBQVUsU0FBVSxlQUFjLE9BQU8sTUFBTSxhQUFhLElBQUksa0JBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTztBQUFBLEVBQzlGO0FBRUEsTUFBSSxjQUFjLFNBQVMsR0FBRztBQUM1QixXQUFPLFVBQVUsU0FBVSxlQUFjLE9BQU8sTUFBTSxhQUFhLElBQUksa0JBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTztBQUFBLEVBQzlGO0FBRUEsTUFBSSxlQUFlLFNBQVMsR0FBRztBQUM3QixXQUFPLFVBQVUsU0FBVSxnQkFBZSxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUMvRjtBQUVBLE1BQUksWUFBWSxTQUFTLEdBQUc7QUFDMUIsV0FBTyxVQUFVLFNBQVUsYUFBWSxLQUFLLE9BQU8sT0FBTyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUMvRztBQUVBLE1BQUksYUFBYSxTQUFTLEdBQUc7QUFDM0IsV0FBTyxVQUFVLFNBQVUsY0FBYSxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUM3RjtBQUVBLE1BQUksV0FBVyxTQUFTLEdBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsWUFBVyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUMzRjtBQUVBLE1BQUksV0FBVyxTQUFTLEdBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsWUFBVyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUMzRjtBQUVBLE1BQUksVUFBVSxTQUFTLEdBQUc7QUFDeEIsV0FBTyxVQUFVLFNBQVcsV0FBVSxLQUFLLE9BQU8sT0FBTyxHQUFJLE9BQU87QUFBQSxFQUN0RTtBQUVBLFNBQU87QUFDVDs7O0FDcFFPLElBQUksUUFBUSxNQUFNLFVBQVU7QUFFcEIsd0JBQVMsSUFBRztBQUN6QixTQUFPLE9BQU8sT0FBTSxZQUFZLFlBQVksS0FDeEMsS0FDQSxNQUFNLEtBQUssRUFBQztBQUNsQjs7O0FDTkEsZ0JBQWdCLFNBQVM7QUFDdkIsT0FBSyxXQUFXO0FBQ2xCO0FBRUEsT0FBTyxZQUFZO0FBQUEsRUFDakIsV0FBVyxXQUFXO0FBQ3BCLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUNBLFNBQVMsV0FBVztBQUNsQixTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFDQSxXQUFXLFdBQVc7QUFDcEIsU0FBSyxTQUFTO0FBQUEsRUFDaEI7QUFBQSxFQUNBLFNBQVMsV0FBVztBQUNsQixRQUFJLEtBQUssU0FBVSxLQUFLLFVBQVUsS0FBSyxLQUFLLFdBQVc7QUFBSSxXQUFLLFNBQVMsVUFBVTtBQUNuRixTQUFLLFFBQVEsSUFBSSxLQUFLO0FBQUEsRUFDeEI7QUFBQSxFQUNBLE9BQU8sU0FBUyxJQUFHLElBQUc7QUFDcEIsU0FBSSxDQUFDLElBQUcsS0FBSSxDQUFDO0FBQ2IsWUFBUSxLQUFLO0FBQUEsV0FDTjtBQUFHLGFBQUssU0FBUztBQUFHLGFBQUssUUFBUSxLQUFLLFNBQVMsT0FBTyxJQUFHLEVBQUMsSUFBSSxLQUFLLFNBQVMsT0FBTyxJQUFHLEVBQUM7QUFBRztBQUFBLFdBQzFGO0FBQUcsYUFBSyxTQUFTO0FBQUE7QUFDYixhQUFLLFNBQVMsT0FBTyxJQUFHLEVBQUM7QUFBRztBQUFBO0FBQUEsRUFFekM7QUFDRjtBQUVlLHdCQUFTLFNBQVM7QUFDL0IsU0FBTyxJQUFJLE9BQU8sT0FBTztBQUMzQjs7O0FDOUJPLFlBQVcsR0FBRztBQUNuQixTQUFPLEVBQUU7QUFDWDtBQUVPLFlBQVcsR0FBRztBQUNuQixTQUFPLEVBQUU7QUFDWDs7O0FDQWUsc0JBQVMsSUFBRyxJQUFHO0FBQzVCLE1BQUksVUFBVSxrQkFBUyxJQUFJLEdBQ3ZCLFVBQVUsTUFDVixRQUFRLGdCQUNSLFNBQVM7QUFFYixPQUFJLE9BQU8sT0FBTSxhQUFhLEtBQUssT0FBTSxTQUFhLEtBQVMsa0JBQVMsRUFBQztBQUN6RSxPQUFJLE9BQU8sT0FBTSxhQUFhLEtBQUssT0FBTSxTQUFhLEtBQVMsa0JBQVMsRUFBQztBQUV6RSxnQkFBYyxNQUFNO0FBQ2xCLFFBQUksR0FDQSxJQUFLLFFBQU8sZUFBTSxJQUFJLEdBQUcsUUFDekIsR0FDQSxXQUFXLE9BQ1g7QUFFSixRQUFJLFdBQVc7QUFBTSxlQUFTLE1BQU0sU0FBUyxhQUFLLENBQUM7QUFFbkQsU0FBSyxJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRztBQUN2QixVQUFJLENBQUUsS0FBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sVUFBVTtBQUMxRCxZQUFJLFdBQVcsQ0FBQztBQUFVLGlCQUFPLFVBQVU7QUFBQTtBQUN0QyxpQkFBTyxRQUFRO0FBQUEsTUFDdEI7QUFDQSxVQUFJO0FBQVUsZUFBTyxNQUFNLENBQUMsR0FBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQUEsSUFDM0Q7QUFFQSxRQUFJO0FBQVEsYUFBTyxTQUFTLE1BQU0sU0FBUyxNQUFNO0FBQUEsRUFDbkQ7QUFFQSxPQUFLLElBQUksU0FBUyxHQUFHO0FBQ25CLFdBQU8sVUFBVSxTQUFVLE1BQUksT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsR0FBRyxRQUFRO0FBQUEsRUFDckY7QUFFQSxPQUFLLElBQUksU0FBUyxHQUFHO0FBQ25CLFdBQU8sVUFBVSxTQUFVLE1BQUksT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsR0FBRyxRQUFRO0FBQUEsRUFDckY7QUFFQSxPQUFLLFVBQVUsU0FBUyxHQUFHO0FBQ3pCLFdBQU8sVUFBVSxTQUFVLFdBQVUsT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVE7QUFBQSxFQUM1RjtBQUVBLE9BQUssUUFBUSxTQUFTLEdBQUc7QUFDdkIsV0FBTyxVQUFVLFNBQVUsU0FBUSxHQUFHLFdBQVcsUUFBUyxVQUFTLE1BQU0sT0FBTyxJQUFJLFFBQVE7QUFBQSxFQUM5RjtBQUVBLE9BQUssVUFBVSxTQUFTLEdBQUc7QUFDekIsV0FBTyxVQUFVLFNBQVUsTUFBSyxPQUFPLFVBQVUsU0FBUyxPQUFPLFNBQVMsTUFBTSxVQUFVLENBQUMsR0FBRyxRQUFRO0FBQUEsRUFDeEc7QUFFQSxTQUFPO0FBQ1Q7OztBQ3RETyxJQUFJLG9CQUFvQixZQUFZLGNBQVc7QUFFdEQsZ0JBQWdCLE9BQU87QUFDckIsT0FBSyxTQUFTO0FBQ2hCO0FBRUEsT0FBTyxZQUFZO0FBQUEsRUFDakIsV0FBVyxXQUFXO0FBQ3BCLFNBQUssT0FBTyxVQUFVO0FBQUEsRUFDeEI7QUFBQSxFQUNBLFNBQVMsV0FBVztBQUNsQixTQUFLLE9BQU8sUUFBUTtBQUFBLEVBQ3RCO0FBQUEsRUFDQSxXQUFXLFdBQVc7QUFDcEIsU0FBSyxPQUFPLFVBQVU7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsU0FBUyxXQUFXO0FBQ2xCLFNBQUssT0FBTyxRQUFRO0FBQUEsRUFDdEI7QUFBQSxFQUNBLE9BQU8sU0FBUyxJQUFHLEdBQUc7QUFDcEIsU0FBSyxPQUFPLE1BQU0sSUFBSSxLQUFLLElBQUksRUFBQyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBQyxDQUFDO0FBQUEsRUFDckQ7QUFDRjtBQUVlLHFCQUFxQixPQUFPO0FBRXpDLGtCQUFnQixTQUFTO0FBQ3ZCLFdBQU8sSUFBSSxPQUFPLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDbEM7QUFFQSxTQUFPLFNBQVM7QUFFaEIsU0FBTztBQUNUOzs7QUNoQ08sb0JBQW9CLEdBQUc7QUFDNUIsTUFBSSxLQUFJLEVBQUU7QUFFVixJQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sRUFBRTtBQUN4QixJQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sRUFBRTtBQUV6QixJQUFFLFFBQVEsU0FBUyxHQUFHO0FBQ3BCLFdBQU8sVUFBVSxTQUFTLEdBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxHQUFFLEVBQUU7QUFBQSxFQUNwRDtBQUVBLFNBQU87QUFDVDtBQUVlLDhCQUFXO0FBQ3hCLFNBQU8sV0FBVyxhQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRDs7O0FDWkEsb0JBQW9CLEdBQUc7QUFDckIsU0FBTyxFQUFFO0FBQ1g7QUFFQSxvQkFBb0IsR0FBRztBQUNyQixTQUFPLEVBQUU7QUFDWDtBQUVBLGNBQWMsT0FBTztBQUNuQixNQUFJLFNBQVMsWUFDVCxTQUFTLFlBQ1QsS0FBSSxJQUNKLEtBQUksSUFDSixVQUFVO0FBRWQsbUJBQWdCO0FBQ2QsUUFBSSxRQUFRLE9BQU8sTUFBTSxLQUFLLFNBQVMsR0FBRyxJQUFJLE9BQU8sTUFBTSxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sTUFBTSxNQUFNLElBQUk7QUFDbkcsUUFBSSxDQUFDO0FBQVMsZ0JBQVUsU0FBUyxhQUFLO0FBQ3RDLFVBQU0sU0FBUyxDQUFDLEdBQUUsTUFBTSxNQUFPLE1BQUssS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUUsTUFBTSxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUUsTUFBTSxNQUFPLE1BQUssS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUUsTUFBTSxNQUFNLElBQUksQ0FBQztBQUNuSSxRQUFJO0FBQVEsYUFBTyxVQUFVLE1BQU0sU0FBUyxNQUFNO0FBQUEsRUFDcEQ7QUFFQSxRQUFLLFNBQVMsU0FBUyxHQUFHO0FBQ3hCLFdBQU8sVUFBVSxTQUFVLFVBQVMsR0FBRyxTQUFRO0FBQUEsRUFDakQ7QUFFQSxRQUFLLFNBQVMsU0FBUyxHQUFHO0FBQ3hCLFdBQU8sVUFBVSxTQUFVLFVBQVMsR0FBRyxTQUFRO0FBQUEsRUFDakQ7QUFFQSxRQUFLLElBQUksU0FBUyxHQUFHO0FBQ25CLFdBQU8sVUFBVSxTQUFVLE1BQUksT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsR0FBRyxTQUFRO0FBQUEsRUFDckY7QUFFQSxRQUFLLElBQUksU0FBUyxHQUFHO0FBQ25CLFdBQU8sVUFBVSxTQUFVLE1BQUksT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsR0FBRyxTQUFRO0FBQUEsRUFDckY7QUFFQSxRQUFLLFVBQVUsU0FBUyxHQUFHO0FBQ3pCLFdBQU8sVUFBVSxTQUFXLFdBQVUsS0FBSyxPQUFPLE9BQU8sR0FBSSxTQUFRO0FBQUEsRUFDdkU7QUFFQSxTQUFPO0FBQ1Q7QUFFQSx5QkFBeUIsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJO0FBQ2hELFVBQVEsT0FBTyxJQUFJLEVBQUU7QUFDckIsVUFBUSxjQUFjLEtBQU0sTUFBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQzlEO0FBZ0JPLDBCQUEwQjtBQUMvQixTQUFPLEtBQUssZUFBZTtBQUM3Qjs7O0FDeEVPLGdCQUFlLE1BQU0sSUFBRyxJQUFHO0FBQ2hDLE9BQUssU0FBUyxjQUNYLEtBQUksS0FBSyxNQUFNLEtBQUssT0FBTyxHQUMzQixLQUFJLEtBQUssTUFBTSxLQUFLLE9BQU8sR0FDM0IsTUFBSyxNQUFNLElBQUksS0FBSyxPQUFPLEdBQzNCLE1BQUssTUFBTSxJQUFJLEtBQUssT0FBTyxHQUMzQixNQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU0sTUFBSyxHQUMvQixNQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU0sTUFBSyxDQUNsQztBQUNGO0FBRU8sZUFBZSxTQUFTO0FBQzdCLE9BQUssV0FBVztBQUNsQjtBQUVBLE1BQU0sWUFBWTtBQUFBLEVBQ2hCLFdBQVcsV0FBVztBQUNwQixTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFDQSxTQUFTLFdBQVc7QUFDbEIsU0FBSyxRQUFRO0FBQUEsRUFDZjtBQUFBLEVBQ0EsV0FBVyxXQUFXO0FBQ3BCLFNBQUssTUFBTSxLQUFLLE1BQ2hCLEtBQUssTUFBTSxLQUFLLE1BQU07QUFDdEIsU0FBSyxTQUFTO0FBQUEsRUFDaEI7QUFBQSxFQUNBLFNBQVMsV0FBVztBQUNsQixZQUFRLEtBQUs7QUFBQSxXQUNOO0FBQUcsZUFBTSxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxXQUNqQztBQUFHLGFBQUssU0FBUyxPQUFPLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBRztBQUFBO0FBRXBELFFBQUksS0FBSyxTQUFVLEtBQUssVUFBVSxLQUFLLEtBQUssV0FBVztBQUFJLFdBQUssU0FBUyxVQUFVO0FBQ25GLFNBQUssUUFBUSxJQUFJLEtBQUs7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsT0FBTyxTQUFTLElBQUcsSUFBRztBQUNwQixTQUFJLENBQUMsSUFBRyxLQUFJLENBQUM7QUFDYixZQUFRLEtBQUs7QUFBQSxXQUNOO0FBQUcsYUFBSyxTQUFTO0FBQUcsYUFBSyxRQUFRLEtBQUssU0FBUyxPQUFPLElBQUcsRUFBQyxJQUFJLEtBQUssU0FBUyxPQUFPLElBQUcsRUFBQztBQUFHO0FBQUEsV0FDMUY7QUFBRyxhQUFLLFNBQVM7QUFBRztBQUFBLFdBQ3BCO0FBQUcsYUFBSyxTQUFTO0FBQUcsYUFBSyxTQUFTLE9BQVEsS0FBSSxLQUFLLE1BQU0sS0FBSyxPQUFPLEdBQUksS0FBSSxLQUFLLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFBQTtBQUNqRyxlQUFNLE1BQU0sSUFBRyxFQUFDO0FBQUc7QUFBQTtBQUU5QixTQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTTtBQUNoQyxTQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTTtBQUFBLEVBQ2xDO0FBQ0Y7OztBQzVDQSxnQkFBZ0IsU0FBUyxNQUFNO0FBQzdCLE9BQUssU0FBUyxJQUFJLE1BQU0sT0FBTztBQUMvQixPQUFLLFFBQVE7QUFDZjtBQUVBLE9BQU8sWUFBWTtBQUFBLEVBQ2pCLFdBQVcsV0FBVztBQUNwQixTQUFLLEtBQUssQ0FBQztBQUNYLFNBQUssS0FBSyxDQUFDO0FBQ1gsU0FBSyxPQUFPLFVBQVU7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsU0FBUyxXQUFXO0FBQ2xCLFFBQUksS0FBSSxLQUFLLElBQ1QsS0FBSSxLQUFLLElBQ1QsSUFBSSxHQUFFLFNBQVM7QUFFbkIsUUFBSSxJQUFJLEdBQUc7QUFDVCxVQUFJLEtBQUssR0FBRSxJQUNQLEtBQUssR0FBRSxJQUNQLEtBQUssR0FBRSxLQUFLLElBQ1osS0FBSyxHQUFFLEtBQUssSUFDWixJQUFJLElBQ0o7QUFFSixhQUFPLEVBQUUsS0FBSyxHQUFHO0FBQ2YsWUFBSSxJQUFJO0FBQ1IsYUFBSyxPQUFPLE1BQ1YsS0FBSyxRQUFRLEdBQUUsS0FBTSxLQUFJLEtBQUssU0FBVSxNQUFLLElBQUksS0FDakQsS0FBSyxRQUFRLEdBQUUsS0FBTSxLQUFJLEtBQUssU0FBVSxNQUFLLElBQUksR0FDbkQ7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFNBQUssS0FBSyxLQUFLLEtBQUs7QUFDcEIsU0FBSyxPQUFPLFFBQVE7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsT0FBTyxTQUFTLElBQUcsSUFBRztBQUNwQixTQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUM7QUFDZixTQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUM7QUFBQSxFQUNqQjtBQUNGO0FBRUEsSUFBTyxpQkFBUyxpQkFBZ0IsTUFBTTtBQUVwQyxrQkFBZ0IsU0FBUztBQUN2QixXQUFPLFNBQVMsSUFBSSxJQUFJLE1BQU0sT0FBTyxJQUFJLElBQUksT0FBTyxTQUFTLElBQUk7QUFBQSxFQUNuRTtBQUVBLFNBQU8sT0FBTyxTQUFTLE9BQU07QUFDM0IsV0FBTyxRQUFPLENBQUMsS0FBSTtBQUFBLEVBQ3JCO0FBRUEsU0FBTztBQUNULEVBQUcsSUFBSTs7O0FDdkRQLElBQU8sb0JBQVEsUUFBSyxNQUFNOzs7QUNBWCxtQkFBbUIsT0FBTTtBQUFBLEVBQ3RDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsR0FDQztBQUNELFNBQU8saUJBQWlCLE1BQU07QUFBQSxJQUM1QixNQUFNLEVBQUMsT0FBTyxPQUFNLFlBQVksTUFBTSxjQUFjLEtBQUk7QUFBQSxJQUN4RCxhQUFhLEVBQUMsT0FBTyxhQUFhLFlBQVksTUFBTSxjQUFjLEtBQUk7QUFBQSxJQUN0RSxRQUFRLEVBQUMsT0FBTyxRQUFRLFlBQVksTUFBTSxjQUFjLEtBQUk7QUFBQSxJQUM1RCxXQUFXLEVBQUMsT0FBTyxZQUFXLFlBQVksTUFBTSxjQUFjLEtBQUk7QUFBQSxJQUNsRSxHQUFHLEVBQUMsT0FBTyxVQUFRO0FBQUEsRUFDckIsQ0FBQztBQUNIOzs7QUNiTyxtQkFBbUIsR0FBRyxJQUFHLElBQUc7QUFDakMsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1QsT0FBSyxJQUFJO0FBQ1g7QUFFQSxVQUFVLFlBQVk7QUFBQSxFQUNwQixhQUFhO0FBQUEsRUFDYixPQUFPLFNBQVMsR0FBRztBQUNqQixXQUFPLE1BQU0sSUFBSSxPQUFPLElBQUksVUFBVSxLQUFLLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDbEU7QUFBQSxFQUNBLFdBQVcsU0FBUyxJQUFHLElBQUc7QUFDeEIsV0FBTyxPQUFNLElBQUksT0FBTSxJQUFJLE9BQU8sSUFBSSxVQUFVLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxFQUFDO0FBQUEsRUFDbEc7QUFBQSxFQUNBLE9BQU8sU0FBUyxRQUFPO0FBQ3JCLFdBQU8sQ0FBQyxPQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssR0FBRyxPQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQztBQUFBLEVBQ2hFO0FBQUEsRUFDQSxRQUFRLFNBQVMsSUFBRztBQUNsQixXQUFPLEtBQUksS0FBSyxJQUFJLEtBQUs7QUFBQSxFQUMzQjtBQUFBLEVBQ0EsUUFBUSxTQUFTLElBQUc7QUFDbEIsV0FBTyxLQUFJLEtBQUssSUFBSSxLQUFLO0FBQUEsRUFDM0I7QUFBQSxFQUNBLFFBQVEsU0FBUyxVQUFVO0FBQ3pCLFdBQU8sQ0FBRSxVQUFTLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBSSxVQUFTLEtBQUssS0FBSyxLQUFLLEtBQUssQ0FBQztBQUFBLEVBQzFFO0FBQUEsRUFDQSxTQUFTLFNBQVMsSUFBRztBQUNuQixXQUFRLE1BQUksS0FBSyxLQUFLLEtBQUs7QUFBQSxFQUM3QjtBQUFBLEVBQ0EsU0FBUyxTQUFTLElBQUc7QUFDbkIsV0FBUSxNQUFJLEtBQUssS0FBSyxLQUFLO0FBQUEsRUFDN0I7QUFBQSxFQUNBLFVBQVUsU0FBUyxJQUFHO0FBQ3BCLFdBQU8sR0FBRSxLQUFLLEVBQUUsT0FBTyxHQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxHQUFFLFFBQVEsRUFBQyxDQUFDO0FBQUEsRUFDM0U7QUFBQSxFQUNBLFVBQVUsU0FBUyxJQUFHO0FBQ3BCLFdBQU8sR0FBRSxLQUFLLEVBQUUsT0FBTyxHQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxHQUFFLFFBQVEsRUFBQyxDQUFDO0FBQUEsRUFDM0U7QUFBQSxFQUNBLFVBQVUsV0FBVztBQUNuQixXQUFPLGVBQWUsS0FBSyxJQUFJLE1BQU0sS0FBSyxJQUFJLGFBQWEsS0FBSyxJQUFJO0FBQUEsRUFDdEU7QUFDRjtBQUVPLElBQUksWUFBVyxJQUFJLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFFM0MsVUFBVSxZQUFZLFVBQVU7QUFFakIsbUJBQW1CLE1BQU07QUFDdEMsU0FBTyxDQUFDLEtBQUs7QUFBUSxRQUFJLENBQUUsUUFBTyxLQUFLO0FBQWEsYUFBTztBQUMzRCxTQUFPLEtBQUs7QUFDZDs7O0FDbERPLHdCQUF1QixPQUFPO0FBQ25DLFFBQU0seUJBQXlCO0FBQ2pDO0FBRWUsMEJBQVMsT0FBTztBQUM3QixRQUFNLGVBQWU7QUFDckIsUUFBTSx5QkFBeUI7QUFDakM7OztBQ0tBLHdCQUF1QixPQUFPO0FBQzVCLFNBQVEsRUFBQyxNQUFNLFdBQVcsTUFBTSxTQUFTLFlBQVksQ0FBQyxNQUFNO0FBQzlEO0FBRUEseUJBQXlCO0FBQ3ZCLE1BQUksSUFBSTtBQUNSLE1BQUksYUFBYSxZQUFZO0FBQzNCLFFBQUksRUFBRSxtQkFBbUI7QUFDekIsUUFBSSxFQUFFLGFBQWEsU0FBUyxHQUFHO0FBQzdCLFVBQUksRUFBRSxRQUFRO0FBQ2QsYUFBTyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxJQUNyRDtBQUNBLFdBQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLFFBQVEsT0FBTyxFQUFFLE9BQU8sUUFBUSxLQUFLLENBQUM7QUFBQSxFQUNqRTtBQUNBLFNBQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDO0FBQ2pEO0FBRUEsNEJBQTRCO0FBQzFCLFNBQU8sS0FBSyxVQUFVO0FBQ3hCO0FBRUEsMkJBQTJCLE9BQU87QUFDaEMsU0FBTyxDQUFDLE1BQU0sU0FBVSxPQUFNLGNBQWMsSUFBSSxPQUFPLE1BQU0sWUFBWSxJQUFJLFFBQVUsT0FBTSxVQUFVLEtBQUs7QUFDOUc7QUFFQSw2QkFBNEI7QUFDMUIsU0FBTyxVQUFVLGtCQUFtQixrQkFBa0I7QUFDeEQ7QUFFQSwwQkFBMEIsWUFBVyxRQUFRLGlCQUFpQjtBQUM1RCxNQUFJLE1BQU0sV0FBVSxRQUFRLE9BQU8sR0FBRyxFQUFFLElBQUksZ0JBQWdCLEdBQUcsSUFDM0QsTUFBTSxXQUFVLFFBQVEsT0FBTyxHQUFHLEVBQUUsSUFBSSxnQkFBZ0IsR0FBRyxJQUMzRCxNQUFNLFdBQVUsUUFBUSxPQUFPLEdBQUcsRUFBRSxJQUFJLGdCQUFnQixHQUFHLElBQzNELE1BQU0sV0FBVSxRQUFRLE9BQU8sR0FBRyxFQUFFLElBQUksZ0JBQWdCLEdBQUc7QUFDL0QsU0FBTyxXQUFVLFVBQ2YsTUFBTSxNQUFPLE9BQU0sT0FBTyxJQUFJLEtBQUssSUFBSSxHQUFHLEdBQUcsS0FBSyxLQUFLLElBQUksR0FBRyxHQUFHLEdBQ2pFLE1BQU0sTUFBTyxPQUFNLE9BQU8sSUFBSSxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUNuRTtBQUNGO0FBRWUseUJBQVc7QUFDeEIsTUFBSSxVQUFTLGdCQUNULFNBQVMsZUFDVCxZQUFZLGtCQUNaLGFBQWEsbUJBQ2IsWUFBWSxtQkFDWixjQUFjLENBQUMsR0FBRyxRQUFRLEdBQzFCLGtCQUFrQixDQUFDLENBQUMsV0FBVyxTQUFTLEdBQUcsQ0FBQyxVQUFVLFFBQVEsQ0FBQyxHQUMvRCxXQUFXLEtBQ1gsY0FBYyxjQUNkLFlBQVksaUJBQVMsU0FBUyxRQUFRLEtBQUssR0FDM0MsZUFDQSxZQUNBLGFBQ0EsYUFBYSxLQUNiLGFBQWEsS0FDYixpQkFBaUIsR0FDakIsY0FBYztBQUVsQixnQkFBYyxZQUFXO0FBQ3ZCLGVBQ0ssU0FBUyxVQUFVLGdCQUFnQixFQUNuQyxHQUFHLGNBQWMsT0FBTyxFQUN4QixHQUFHLGtCQUFrQixXQUFXLEVBQ2hDLEdBQUcsaUJBQWlCLFVBQVUsRUFDaEMsT0FBTyxTQUFTLEVBQ2QsR0FBRyxtQkFBbUIsWUFBWSxFQUNsQyxHQUFHLGtCQUFrQixVQUFVLEVBQy9CLEdBQUcsa0NBQWtDLFVBQVUsRUFDL0MsTUFBTSwrQkFBK0IsZUFBZTtBQUFBLEVBQzNEO0FBRUEsT0FBSyxZQUFZLFNBQVMsWUFBWSxZQUFXLFFBQU8sT0FBTztBQUM3RCxRQUFJLGFBQVksV0FBVyxZQUFZLFdBQVcsVUFBVSxJQUFJO0FBQ2hFLGVBQVUsU0FBUyxVQUFVLGdCQUFnQjtBQUM3QyxRQUFJLGVBQWUsWUFBVztBQUM1QixlQUFTLFlBQVksWUFBVyxRQUFPLEtBQUs7QUFBQSxJQUM5QyxPQUFPO0FBQ0wsaUJBQVUsVUFBVSxFQUFFLEtBQUssV0FBVztBQUNwQyxnQkFBUSxNQUFNLFNBQVMsRUFDcEIsTUFBTSxLQUFLLEVBQ1gsTUFBTSxFQUNOLEtBQUssTUFBTSxPQUFPLGVBQWMsYUFBYSxXQUFVLE1BQU0sTUFBTSxTQUFTLElBQUksVUFBUyxFQUN6RixJQUFJO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxPQUFLLFVBQVUsU0FBUyxZQUFXLEdBQUcsR0FBRyxPQUFPO0FBQzlDLFNBQUssUUFBUSxZQUFXLFdBQVc7QUFDakMsVUFBSSxLQUFLLEtBQUssT0FBTyxHQUNqQixLQUFLLE9BQU8sTUFBTSxhQUFhLEVBQUUsTUFBTSxNQUFNLFNBQVMsSUFBSTtBQUM5RCxhQUFPLEtBQUs7QUFBQSxJQUNkLEdBQUcsR0FBRyxLQUFLO0FBQUEsRUFDYjtBQUVBLE9BQUssVUFBVSxTQUFTLFlBQVcsR0FBRyxHQUFHLE9BQU87QUFDOUMsU0FBSyxVQUFVLFlBQVcsV0FBVztBQUNuQyxVQUFJLElBQUksT0FBTyxNQUFNLE1BQU0sU0FBUyxHQUNoQyxLQUFLLEtBQUssUUFDVixLQUFLLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxPQUFPLE1BQU0sYUFBYSxFQUFFLE1BQU0sTUFBTSxTQUFTLElBQUksR0FDcEYsS0FBSyxHQUFHLE9BQU8sRUFBRSxHQUNqQixLQUFLLE9BQU8sTUFBTSxhQUFhLEVBQUUsTUFBTSxNQUFNLFNBQVMsSUFBSTtBQUM5RCxhQUFPLFVBQVUsVUFBVSxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsZUFBZTtBQUFBLElBQ3ZFLEdBQUcsR0FBRyxLQUFLO0FBQUEsRUFDYjtBQUVBLE9BQUssY0FBYyxTQUFTLFlBQVcsSUFBRyxJQUFHLE9BQU87QUFDbEQsU0FBSyxVQUFVLFlBQVcsV0FBVztBQUNuQyxhQUFPLFVBQVUsS0FBSyxPQUFPLFVBQzNCLE9BQU8sT0FBTSxhQUFhLEdBQUUsTUFBTSxNQUFNLFNBQVMsSUFBSSxJQUNyRCxPQUFPLE9BQU0sYUFBYSxHQUFFLE1BQU0sTUFBTSxTQUFTLElBQUksRUFDdkQsR0FBRyxPQUFPLE1BQU0sTUFBTSxTQUFTLEdBQUcsZUFBZTtBQUFBLElBQ25ELEdBQUcsTUFBTSxLQUFLO0FBQUEsRUFDaEI7QUFFQSxPQUFLLGNBQWMsU0FBUyxZQUFXLElBQUcsSUFBRyxHQUFHLE9BQU87QUFDckQsU0FBSyxVQUFVLFlBQVcsV0FBVztBQUNuQyxVQUFJLElBQUksT0FBTyxNQUFNLE1BQU0sU0FBUyxHQUNoQyxJQUFJLEtBQUssUUFDVCxLQUFLLEtBQUssT0FBTyxTQUFTLENBQUMsSUFBSSxPQUFPLE1BQU0sYUFBYSxFQUFFLE1BQU0sTUFBTSxTQUFTLElBQUk7QUFDeEYsYUFBTyxVQUFVLFVBQVMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxVQUMzRCxPQUFPLE9BQU0sYUFBYSxDQUFDLEdBQUUsTUFBTSxNQUFNLFNBQVMsSUFBSSxDQUFDLElBQ3ZELE9BQU8sT0FBTSxhQUFhLENBQUMsR0FBRSxNQUFNLE1BQU0sU0FBUyxJQUFJLENBQUMsRUFDekQsR0FBRyxHQUFHLGVBQWU7QUFBQSxJQUN2QixHQUFHLEdBQUcsS0FBSztBQUFBLEVBQ2I7QUFFQSxpQkFBZSxZQUFXLEdBQUc7QUFDM0IsUUFBSSxLQUFLLElBQUksWUFBWSxJQUFJLEtBQUssSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDO0FBQ3hELFdBQU8sTUFBTSxXQUFVLElBQUksYUFBWSxJQUFJLFVBQVUsR0FBRyxXQUFVLEdBQUcsV0FBVSxDQUFDO0FBQUEsRUFDbEY7QUFFQSxxQkFBbUIsWUFBVyxJQUFJLElBQUk7QUFDcEMsUUFBSSxLQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUssV0FBVSxHQUFHLEtBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxXQUFVO0FBQ25FLFdBQU8sT0FBTSxXQUFVLEtBQUssT0FBTSxXQUFVLElBQUksYUFBWSxJQUFJLFVBQVUsV0FBVSxHQUFHLElBQUcsRUFBQztBQUFBLEVBQzdGO0FBRUEsb0JBQWtCLFNBQVE7QUFDeEIsV0FBTyxDQUFFLEVBQUMsUUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFPLEdBQUcsTUFBTSxHQUFJLEVBQUMsUUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFPLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDbEY7QUFFQSxvQkFBa0IsYUFBWSxZQUFXLFFBQU8sT0FBTztBQUNyRCxnQkFDSyxHQUFHLGNBQWMsV0FBVztBQUFFLGNBQVEsTUFBTSxTQUFTLEVBQUUsTUFBTSxLQUFLLEVBQUUsTUFBTTtBQUFBLElBQUcsQ0FBQyxFQUM5RSxHQUFHLDJCQUEyQixXQUFXO0FBQUUsY0FBUSxNQUFNLFNBQVMsRUFBRSxNQUFNLEtBQUssRUFBRSxJQUFJO0FBQUEsSUFBRyxDQUFDLEVBQ3pGLE1BQU0sUUFBUSxXQUFXO0FBQ3hCLFVBQUksT0FBTyxNQUNQLE9BQU8sV0FDUCxJQUFJLFFBQVEsTUFBTSxJQUFJLEVBQUUsTUFBTSxLQUFLLEdBQ25DLElBQUksT0FBTyxNQUFNLE1BQU0sSUFBSSxHQUMzQixJQUFJLFVBQVMsT0FBTyxTQUFTLENBQUMsSUFBSSxPQUFPLFdBQVUsYUFBYSxPQUFNLE1BQU0sTUFBTSxJQUFJLElBQUksUUFDMUYsSUFBSSxLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FDakQsS0FBSSxLQUFLLFFBQ1QsSUFBSSxPQUFPLGVBQWMsYUFBYSxXQUFVLE1BQU0sTUFBTSxJQUFJLElBQUksWUFDcEUsSUFBSSxZQUFZLEdBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxJQUFJLEdBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzVFLGFBQU8sU0FBUyxHQUFHO0FBQ2pCLFlBQUksTUFBTTtBQUFHLGNBQUk7QUFBQSxhQUNaO0FBQUUsY0FBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQUksY0FBSSxJQUFJLFVBQVUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQUEsUUFBRztBQUMzRixVQUFFLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDaEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNQO0FBRUEsbUJBQWlCLE1BQU0sTUFBTSxPQUFPO0FBQ2xDLFdBQVEsQ0FBQyxTQUFTLEtBQUssYUFBYyxJQUFJLFFBQVEsTUFBTSxJQUFJO0FBQUEsRUFDN0Q7QUFFQSxtQkFBaUIsTUFBTSxNQUFNO0FBQzNCLFNBQUssT0FBTztBQUNaLFNBQUssT0FBTztBQUNaLFNBQUssU0FBUztBQUNkLFNBQUssY0FBYztBQUNuQixTQUFLLFNBQVMsT0FBTyxNQUFNLE1BQU0sSUFBSTtBQUNyQyxTQUFLLE9BQU87QUFBQSxFQUNkO0FBRUEsVUFBUSxZQUFZO0FBQUEsSUFDbEIsT0FBTyxTQUFTLE9BQU87QUFDckIsVUFBSTtBQUFPLGFBQUssY0FBYztBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsT0FBTyxXQUFXO0FBQ2hCLFVBQUksRUFBRSxLQUFLLFdBQVcsR0FBRztBQUN2QixhQUFLLEtBQUssWUFBWTtBQUN0QixhQUFLLEtBQUssT0FBTztBQUFBLE1BQ25CO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sU0FBUyxLQUFLLFlBQVc7QUFDN0IsVUFBSSxLQUFLLFNBQVMsUUFBUTtBQUFTLGFBQUssTUFBTSxLQUFLLFdBQVUsT0FBTyxLQUFLLE1BQU0sRUFBRTtBQUNqRixVQUFJLEtBQUssVUFBVSxRQUFRO0FBQVMsYUFBSyxPQUFPLEtBQUssV0FBVSxPQUFPLEtBQUssT0FBTyxFQUFFO0FBQ3BGLFVBQUksS0FBSyxVQUFVLFFBQVE7QUFBUyxhQUFLLE9BQU8sS0FBSyxXQUFVLE9BQU8sS0FBSyxPQUFPLEVBQUU7QUFDcEYsV0FBSyxLQUFLLFNBQVM7QUFDbkIsV0FBSyxLQUFLLE1BQU07QUFDaEIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssV0FBVztBQUNkLFVBQUksRUFBRSxLQUFLLFdBQVcsR0FBRztBQUN2QixlQUFPLEtBQUssS0FBSztBQUNqQixhQUFLLEtBQUssS0FBSztBQUFBLE1BQ2pCO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sU0FBUyxPQUFNO0FBQ25CLFVBQUksSUFBSSxnQkFBTyxLQUFLLElBQUksRUFBRSxNQUFNO0FBQ2hDLGdCQUFVLEtBQ1IsT0FDQSxLQUFLLE1BQ0wsSUFBSSxVQUFVLE9BQU07QUFBQSxRQUNsQixhQUFhLEtBQUs7QUFBQSxRQUNsQixRQUFRO0FBQUEsUUFDUjtBQUFBLFFBQ0EsV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUNyQixVQUFVO0FBQUEsTUFDWixDQUFDLEdBQ0QsQ0FDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsbUJBQWlCLFVBQVUsTUFBTTtBQUMvQixRQUFJLENBQUMsUUFBTyxNQUFNLE1BQU0sU0FBUztBQUFHO0FBQ3BDLFFBQUksSUFBSSxRQUFRLE1BQU0sSUFBSSxFQUFFLE1BQU0sS0FBSyxHQUNuQyxJQUFJLEtBQUssUUFDVCxJQUFJLEtBQUssSUFBSSxZQUFZLElBQUksS0FBSyxJQUFJLFlBQVksSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLEdBQUcsV0FBVyxNQUFNLE1BQU0sU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUMzRyxJQUFJLGdCQUFRLEtBQUs7QUFJckIsUUFBSSxFQUFFLE9BQU87QUFDWCxVQUFJLEVBQUUsTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sRUFBRSxJQUFJO0FBQ3BELFVBQUUsTUFBTSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQUEsTUFDdEM7QUFDQSxtQkFBYSxFQUFFLEtBQUs7QUFBQSxJQUN0QixXQUdTLEVBQUUsTUFBTTtBQUFHO0FBQUEsU0FHZjtBQUNILFFBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6Qix3QkFBVSxJQUFJO0FBQ2QsUUFBRSxNQUFNO0FBQUEsSUFDVjtBQUVBLHFCQUFRLEtBQUs7QUFDYixNQUFFLFFBQVEsV0FBVyxZQUFZLFVBQVU7QUFDM0MsTUFBRSxLQUFLLFNBQVMsVUFBVSxVQUFVLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsZUFBZSxDQUFDO0FBRXBHLDBCQUFzQjtBQUNwQixRQUFFLFFBQVE7QUFDVixRQUFFLElBQUk7QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUVBLHVCQUFxQixVQUFVLE1BQU07QUFDbkMsUUFBSSxlQUFlLENBQUMsUUFBTyxNQUFNLE1BQU0sU0FBUztBQUFHO0FBQ25ELFFBQUksSUFBSSxRQUFRLE1BQU0sTUFBTSxJQUFJLEVBQUUsTUFBTSxLQUFLLEdBQ3pDLElBQUksZ0JBQU8sTUFBTSxJQUFJLEVBQUUsR0FBRyxrQkFBa0IsWUFBWSxJQUFJLEVBQUUsR0FBRyxnQkFBZ0IsWUFBWSxJQUFJLEdBQ2pHLElBQUksZ0JBQVEsT0FBTyxhQUFhLEdBQ2hDLGdCQUFnQixNQUFNLGVBQ3RCLEtBQUssTUFBTSxTQUNYLEtBQUssTUFBTTtBQUVmLG1CQUFZLE1BQU0sSUFBSTtBQUN0QixtQkFBYyxLQUFLO0FBQ25CLE1BQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLHNCQUFVLElBQUk7QUFDZCxNQUFFLE1BQU07QUFFUix3QkFBb0IsUUFBTztBQUN6Qix1QkFBUSxNQUFLO0FBQ2IsVUFBSSxDQUFDLEVBQUUsT0FBTztBQUNaLFlBQUksS0FBSyxPQUFNLFVBQVUsSUFBSSxLQUFLLE9BQU0sVUFBVTtBQUNsRCxVQUFFLFFBQVEsS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBLE1BQ2hDO0FBQ0EsUUFBRSxNQUFNLE1BQUssRUFDWCxLQUFLLFNBQVMsVUFBVSxVQUFVLEVBQUUsS0FBSyxRQUFRLEVBQUUsTUFBTSxLQUFLLGdCQUFRLFFBQU8sYUFBYSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLGVBQWUsQ0FBQztBQUFBLElBQ3hJO0FBRUEsd0JBQW9CLFFBQU87QUFDekIsUUFBRSxHQUFHLCtCQUErQixJQUFJO0FBQ3hDLGNBQVcsT0FBTSxNQUFNLEVBQUUsS0FBSztBQUM5Qix1QkFBUSxNQUFLO0FBQ2IsUUFBRSxNQUFNLE1BQUssRUFBRSxJQUFJO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBRUEsc0JBQW9CLFVBQVUsTUFBTTtBQUNsQyxRQUFJLENBQUMsUUFBTyxNQUFNLE1BQU0sU0FBUztBQUFHO0FBQ3BDLFFBQUksS0FBSyxLQUFLLFFBQ1YsS0FBSyxnQkFBUSxNQUFNLGlCQUFpQixNQUFNLGVBQWUsS0FBSyxPQUFPLElBQUksR0FDekUsS0FBSyxHQUFHLE9BQU8sRUFBRSxHQUNqQixLQUFLLEdBQUcsSUFBSyxPQUFNLFdBQVcsTUFBTSxJQUNwQyxLQUFLLFVBQVUsVUFBVSxNQUFNLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sTUFBTSxNQUFNLElBQUksR0FBRyxlQUFlO0FBRTlGLHFCQUFRLEtBQUs7QUFDYixRQUFJLFdBQVc7QUFBRyxzQkFBTyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsUUFBUSxFQUFFLEtBQUssVUFBVSxJQUFJLElBQUksS0FBSztBQUFBO0FBQ3RGLHNCQUFPLElBQUksRUFBRSxLQUFLLEtBQUssV0FBVyxJQUFJLElBQUksS0FBSztBQUFBLEVBQ3REO0FBRUEsd0JBQXNCLFVBQVUsTUFBTTtBQUNwQyxRQUFJLENBQUMsUUFBTyxNQUFNLE1BQU0sU0FBUztBQUFHO0FBQ3BDLFFBQUksVUFBVSxNQUFNLFNBQ2hCLElBQUksUUFBUSxRQUNaLElBQUksUUFBUSxNQUFNLE1BQU0sTUFBTSxlQUFlLFdBQVcsQ0FBQyxFQUFFLE1BQU0sS0FBSyxHQUN0RSxTQUFTLEdBQUcsR0FBRztBQUVuQixtQkFBYyxLQUFLO0FBQ25CLFNBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDdEIsVUFBSSxRQUFRLElBQUksSUFBSSxnQkFBUSxHQUFHLElBQUk7QUFDbkMsVUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsVUFBVTtBQUMzQyxVQUFJLENBQUMsRUFBRTtBQUFRLFVBQUUsU0FBUyxHQUFHLFVBQVUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFBQSxlQUNuRCxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sT0FBTyxFQUFFO0FBQUksVUFBRSxTQUFTLEdBQUcsRUFBRSxPQUFPO0FBQUEsSUFDckU7QUFFQSxRQUFJO0FBQWUsc0JBQWdCLGFBQWEsYUFBYTtBQUU3RCxRQUFJLFNBQVM7QUFDWCxVQUFJLEVBQUUsT0FBTztBQUFHLHFCQUFhLEVBQUUsSUFBSSxnQkFBZ0IsV0FBVyxXQUFXO0FBQUUsMEJBQWdCO0FBQUEsUUFBTSxHQUFHLFVBQVU7QUFDOUcsd0JBQVUsSUFBSTtBQUNkLFFBQUUsTUFBTTtBQUFBLElBQ1Y7QUFBQSxFQUNGO0FBRUEsc0JBQW9CLFVBQVUsTUFBTTtBQUNsQyxRQUFJLENBQUMsS0FBSztBQUFXO0FBQ3JCLFFBQUksSUFBSSxRQUFRLE1BQU0sSUFBSSxFQUFFLE1BQU0sS0FBSyxHQUNuQyxVQUFVLE1BQU0sZ0JBQ2hCLElBQUksUUFBUSxRQUFRLEdBQUcsR0FBRyxHQUFHO0FBRWpDLHFCQUFRLEtBQUs7QUFDYixTQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ3RCLFVBQUksUUFBUSxJQUFJLElBQUksZ0JBQVEsR0FBRyxJQUFJO0FBQ25DLFVBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxPQUFPLEVBQUU7QUFBWSxVQUFFLE9BQU8sS0FBSztBQUFBLGVBQ25ELEVBQUUsVUFBVSxFQUFFLE9BQU8sT0FBTyxFQUFFO0FBQVksVUFBRSxPQUFPLEtBQUs7QUFBQSxJQUNuRTtBQUNBLFFBQUksRUFBRSxLQUFLO0FBQ1gsUUFBSSxFQUFFLFFBQVE7QUFDWixVQUFJLEtBQUssRUFBRSxPQUFPLElBQUksS0FBSyxFQUFFLE9BQU8sSUFDaEMsS0FBSyxFQUFFLE9BQU8sSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUNoQyxLQUFNLE1BQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxLQUFNLE1BQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxJQUN4RCxLQUFNLE1BQUssR0FBRyxLQUFLLEdBQUcsTUFBTSxLQUFNLE1BQUssR0FBRyxLQUFLLEdBQUcsTUFBTTtBQUM1RCxVQUFJLE1BQU0sR0FBRyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7QUFDL0IsVUFBSSxDQUFFLElBQUcsS0FBSyxHQUFHLE1BQU0sR0FBSSxJQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDN0MsVUFBSSxDQUFFLElBQUcsS0FBSyxHQUFHLE1BQU0sR0FBSSxJQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7QUFBQSxJQUMvQyxXQUNTLEVBQUU7QUFBUSxVQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksRUFBRSxPQUFPO0FBQUE7QUFDNUM7QUFFTCxNQUFFLEtBQUssU0FBUyxVQUFVLFVBQVUsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsZUFBZSxDQUFDO0FBQUEsRUFDMUU7QUFFQSxzQkFBb0IsVUFBVSxNQUFNO0FBQ2xDLFFBQUksQ0FBQyxLQUFLO0FBQVc7QUFDckIsUUFBSSxJQUFJLFFBQVEsTUFBTSxJQUFJLEVBQUUsTUFBTSxLQUFLLEdBQ25DLFVBQVUsTUFBTSxnQkFDaEIsSUFBSSxRQUFRLFFBQVEsR0FBRztBQUUzQixtQkFBYyxLQUFLO0FBQ25CLFFBQUk7QUFBYSxtQkFBYSxXQUFXO0FBQ3pDLGtCQUFjLFdBQVcsV0FBVztBQUFFLG9CQUFjO0FBQUEsSUFBTSxHQUFHLFVBQVU7QUFDdkUsU0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRztBQUN0QixVQUFJLFFBQVE7QUFDWixVQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sT0FBTyxFQUFFO0FBQVksZUFBTyxFQUFFO0FBQUEsZUFDOUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxPQUFPLEVBQUU7QUFBWSxlQUFPLEVBQUU7QUFBQSxJQUM5RDtBQUNBLFFBQUksRUFBRSxVQUFVLENBQUMsRUFBRTtBQUFRLFFBQUUsU0FBUyxFQUFFLFFBQVEsT0FBTyxFQUFFO0FBQ3pELFFBQUksRUFBRTtBQUFRLFFBQUUsT0FBTyxLQUFLLEtBQUssT0FBTyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQUEsU0FDckQ7QUFDSCxRQUFFLElBQUk7QUFFTixVQUFJLEVBQUUsU0FBUyxHQUFHO0FBQ2hCLFlBQUksZ0JBQVEsR0FBRyxJQUFJO0FBQ25CLFlBQUksS0FBSyxNQUFNLFdBQVcsS0FBSyxFQUFFLElBQUksV0FBVyxLQUFLLEVBQUUsRUFBRSxJQUFJLGFBQWE7QUFDeEUsY0FBSSxJQUFJLGdCQUFPLElBQUksRUFBRSxHQUFHLGVBQWU7QUFDdkMsY0FBSTtBQUFHLGNBQUUsTUFBTSxNQUFNLFNBQVM7QUFBQSxRQUNoQztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE9BQUssYUFBYSxTQUFTLEdBQUc7QUFDNUIsV0FBTyxVQUFVLFNBQVUsY0FBYSxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxHQUFHLFFBQVE7QUFBQSxFQUM5RjtBQUVBLE9BQUssU0FBUyxTQUFTLEdBQUc7QUFDeEIsV0FBTyxVQUFVLFNBQVUsV0FBUyxPQUFPLE1BQU0sYUFBYSxJQUFJLGtCQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUTtBQUFBLEVBQzNGO0FBRUEsT0FBSyxZQUFZLFNBQVMsR0FBRztBQUMzQixXQUFPLFVBQVUsU0FBVSxhQUFZLE9BQU8sTUFBTSxhQUFhLElBQUksa0JBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRO0FBQUEsRUFDOUY7QUFFQSxPQUFLLFNBQVMsU0FBUyxHQUFHO0FBQ3hCLFdBQU8sVUFBVSxTQUFVLFVBQVMsT0FBTyxNQUFNLGFBQWEsSUFBSSxrQkFBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUTtBQUFBLEVBQ3BJO0FBRUEsT0FBSyxjQUFjLFNBQVMsR0FBRztBQUM3QixXQUFPLFVBQVUsU0FBVSxhQUFZLEtBQUssQ0FBQyxFQUFFLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxZQUFZLElBQUksWUFBWSxFQUFFO0FBQUEsRUFDcEg7QUFFQSxPQUFLLGtCQUFrQixTQUFTLEdBQUc7QUFDakMsV0FBTyxVQUFVLFNBQVUsaUJBQWdCLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFBQSxFQUM1UTtBQUVBLE9BQUssWUFBWSxTQUFTLEdBQUc7QUFDM0IsV0FBTyxVQUFVLFNBQVUsYUFBWSxHQUFHLFFBQVE7QUFBQSxFQUNwRDtBQUVBLE9BQUssV0FBVyxTQUFTLEdBQUc7QUFDMUIsV0FBTyxVQUFVLFNBQVUsWUFBVyxDQUFDLEdBQUcsUUFBUTtBQUFBLEVBQ3BEO0FBRUEsT0FBSyxjQUFjLFNBQVMsR0FBRztBQUM3QixXQUFPLFVBQVUsU0FBVSxlQUFjLEdBQUcsUUFBUTtBQUFBLEVBQ3REO0FBRUEsT0FBSyxLQUFLLFdBQVc7QUFDbkIsUUFBSSxRQUFRLFVBQVUsR0FBRyxNQUFNLFdBQVcsU0FBUztBQUNuRCxXQUFPLFVBQVUsWUFBWSxPQUFPO0FBQUEsRUFDdEM7QUFFQSxPQUFLLGdCQUFnQixTQUFTLEdBQUc7QUFDL0IsV0FBTyxVQUFVLFNBQVUsa0JBQWtCLEtBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxLQUFLLEtBQUssY0FBYztBQUFBLEVBQzVGO0FBRUEsT0FBSyxjQUFjLFNBQVMsR0FBRztBQUM3QixXQUFPLFVBQVUsU0FBVSxlQUFjLENBQUMsR0FBRyxRQUFRO0FBQUEsRUFDdkQ7QUFFQSxTQUFPO0FBQ1Q7OztBQzViQSx3QkFBOEI7Ozt3QkNEUDs7O0FFTWhCLElBQU0sYUFBYSxDQUN4QixPQUNBLFVBQ0EsT0FDQSxPQUNBLFdBQ0c7QUFDSCxRQUFNLE9BQU8sYUFBYSxLQUFLO0FBRS9CLFFBQU0sU0FBUyxFQUFFLEtBQUssSUFBSSxPQUFPLElBQUksUUFBUSxJQUFJLE1BQU0sSUFBSTtBQUMzRCxRQUFNLE1BQU0sQUFDVCxnQkFBTyxXQUFXLEVBQ2xCLE9BQU8sS0FBSyxFQUNaLEtBQUssVUFBVSxNQUFNLEVBQ3JCLEtBQUssU0FBUyxLQUFLO0FBRXRCLFFBQU0sUUFBUSxLQUFLLE1BQU0sSUFBSSxDQUFDLEVBQUUsU0FBSSxXQUFZO0FBQUEsSUFDOUM7QUFBQSxJQUNBO0FBQUEsSUFDQSxhQUFhLENBQUM7QUFBQSxJQUNkLGFBQWEsQ0FBQztBQUFBLEVBQ2hCLEVBQUU7QUFFRixRQUFNLFdBQVcsSUFBSSxJQUFJLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFcEQsUUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJLENBQUMsRUFBRSxRQUFRLGFBQWM7QUFBQSxJQUNwRCxRQUFRLFNBQVMsSUFBSSxNQUFnQjtBQUFBLElBQ3JDLFFBQVEsU0FBUyxJQUFJLE1BQWdCO0FBQUEsRUFDdkMsRUFBRTtBQUVGLGFBQVcsU0FBUSxPQUFPO0FBQ3hCLFVBQU0sRUFBRSxRQUFRLFdBQVc7QUFDM0IsV0FBTyxZQUFZLEtBQUssS0FBSTtBQUM1QixXQUFPLFlBQVksS0FBSyxLQUFJO0FBQUEsRUFDOUI7QUFFQSxNQUFJLE9BQU8sT0FBTyxFQUFFLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBbUMxQjtBQUVDLFFBQU0sS0FBSSxBQUFHLE1BQVcsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFRLGlCQUFTLEdBQUc7QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFDUCxTQUFTLE9BQU87QUFBQSxFQUNsQixDQUFDO0FBRUQsUUFBTSxRQUFRLElBQ1gsT0FBTyxHQUFHLEVBQ1YsS0FBSyxlQUFlLFlBQVksRUFDaEMsS0FBSyxhQUFhLEVBQUUsRUFDcEIsS0FBSyxlQUFlLEtBQUssRUFDekIsVUFBVSxHQUFHLEVBQ2IsS0FBSyxLQUFLLEVBQ1YsS0FBSyxHQUFHLEVBQ1IsS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLE9BQU8sUUFBUyxFQUFFLElBQUksR0FBRSxFQUFFLElBQUksSUFBSyxFQUN6RSxLQUFLLENBQUMsTUFDTCxFQUNHLE9BQU8sTUFBTSxFQUNiLEtBQUssS0FBSyxFQUFFLEVBQ1osS0FBSyxNQUFNLFFBQVEsRUFFbkIsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQ3ZCLEVBQ0MsS0FDQyxDQUFDLE1BQU0sRUFBRSxPQUFPLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUV2QztBQUVGLFFBQU0sUUFBTyxJQUNWLE9BQU8sS0FBSyxHQUFHLEVBQ2YsS0FBSyxRQUFRLE1BQU0sRUFDbkIsS0FBSyxrQkFBa0IsR0FBRyxFQUMxQixLQUFLLGdCQUFnQixHQUFHLEVBQ3hCLFVBQVUsTUFBTSxFQUNoQixLQUFLLEtBQUssRUFDVixLQUFLLE1BQU0sRUFJWCxLQUFLLEtBQUssR0FBRztBQUVoQixRQUFNLE9BQU87QUFFYixRQUFNLFlBQVksQ0FBQyxPQUFtQixTQUFpQjtBQUNyRCxpQkFBYSxNQUFNLEtBQUs7QUFDeEIsVUFBTSxNQUFNO0FBQUEsRUFDZDtBQUVBLFFBQU0sVUFBVSxJQUNiLE9BQU8sR0FBRyxFQUNWLEtBQUssUUFBUSxNQUFNLEVBQ25CLEtBQUssa0JBQWtCLEtBQUssRUFDNUIsVUFBVSxNQUFNLEVBQ2hCLEtBQUssS0FBSyxFQUNWLEtBQUssTUFBTSxFQUNYLEtBQUssU0FBUyxPQUFPLE9BQU8sRUFBRSxFQUM5QixLQUFLLFVBQVUsSUFBSSxFQUNuQixLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUUsRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLEVBQ3JDLEdBQUcsYUFBYSxDQUFDLE1BQU07QUFDdEIsUUFBSSxRQUFRLFNBQVMsSUFBSTtBQUN6QixVQUFNLFFBQVEsV0FBVyxDQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLFVBQU0sUUFDSixhQUNBLENBQUMsTUFDQyxFQUFFLFlBQVksS0FBSyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FDeEMsRUFBRSxZQUFZLEtBQUssQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQzVDO0FBQ0EsVUFDRyxRQUFRLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQzFELE9BQU8sVUFBVSxFQUNqQixNQUFNO0FBQUEsRUFDWCxDQUFDLEVBQ0EsR0FBRyxZQUFZLENBQUMsTUFBTTtBQUNyQixRQUFJLFFBQVEsU0FBUyxLQUFLO0FBQzFCLFVBQU0sUUFBUSxXQUFXLEtBQUs7QUFDOUIsVUFBTSxRQUFRLGFBQWEsS0FBSztBQUNoQyxVQUFLLFFBQVEsV0FBVyxLQUFLLEVBQUUsTUFBTTtBQUFBLEVBQ3ZDLENBQUMsRUFDQSxHQUFHLFNBQVMsQ0FBQyxPQUFtQixNQUFjO0FBQzdDLGNBQVUsT0FBTyxFQUFFLElBQUk7QUFBQSxFQUN6QixDQUFDO0FBMkJILGVBQWEsR0FBcUQ7QUFDaEUsVUFBTSxLQUFLLEVBQUUsT0FBTztBQUNwQixVQUFNLE1BQUssRUFBRSxPQUFPO0FBQ3BCLFVBQU0sSUFBSSxLQUFLLElBQUksTUFBSyxFQUFFLElBQUk7QUFDOUIsV0FBTyxJQUFJLE9BQU8sUUFBUSxNQUFNLEtBQUssU0FBUyxLQUFLLE1BQUssSUFBSSxLQUFLLE9BQU8sUUFDbEU7QUFBQSxFQUNSO0FBRUEsa0JBQWdCLEVBQUUseUJBQWE7QUFDN0IsUUFBSSxLQUFLLGFBQWEsVUFBUztBQUFBLEVBQ2pDO0FBQ0EsTUFBSSxLQUNGLEFBQ0csY0FBSyxFQUNMLE9BQU87QUFBQSxJQUNOLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDTCxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ2hCLENBQUMsRUFDQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEIsR0FBRyxRQUFRLE1BQU0sQ0FDdEI7QUFDRjs7O0FDdk1PLElBQU0sZ0JBQWdCLENBQzNCLE9BQ0EsVUFDQSxPQUNBLE9BQ0EsV0FDRztBQUNILFFBQU0sVUFBVSxlQUFlLE9BQU8sU0FBUyxRQUFRO0FBQ3ZELFVBQVEsSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUV2QixRQUFNLGFBQVksQUFBRyxpQkFBUyxFQUFFLE9BQU87QUFDdkMsVUFBUSxJQUFJLEVBQUUsc0JBQVUsQ0FBQztBQUV6QixRQUFNLFVBQXlCLFdBQVcsT0FBTyxTQUFTLFFBQVE7QUFDbEUsVUFBUSxJQUFJLEVBQUUsUUFBUSxDQUFDO0FBRXZCLFFBQU0sWUFBWSxDQUFDLEdBQUcsT0FBTztBQUM3QixZQUFVLFFBQVEsQ0FBQyxJQUFHLE1BQU07QUFDMUIsUUFBSSxVQUFVLEtBQUssQ0FBQyxHQUFHLE1BQU0sTUFBTSxLQUFLLEdBQUUsU0FBUyxFQUFFLElBQUksR0FBRztBQUMxRCxZQUFNLFNBQVEsVUFBVSxVQUFVLENBQUMsR0FBRyxNQUFNLE1BQU0sS0FBSyxHQUFFLFNBQVMsRUFBRSxJQUFJO0FBQ3hFLGdCQUFVLE9BQU8sUUFBTyxDQUFDO0FBQUEsSUFDM0I7QUFBQSxFQUNGLENBQUM7QUFRRCxVQUFRLElBQUksRUFBRSxVQUFVLENBQUM7QUFZekIsUUFBTSxVQUFvQixVQUFVLElBQUksQ0FBQyxNQUFNO0FBQzdDLFdBQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLEVBQUUsU0FBUztBQUFBLEVBQzlDLENBQUM7QUFDRCxRQUFNLFFBQVEsUUFBUSxJQUFJLENBQUMsTUFBTSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBRWpELFFBQU0sTUFBTSxBQUNULGdCQUFPLFdBQVcsRUFDbEIsT0FBTyxLQUFLLEVBQ1osS0FBSyxVQUFVLE1BQU0sRUFDckIsS0FBSyxTQUFTLEtBQUs7QUFFdEIsUUFBTSxhQUFhLGlCQUFpQixTQUFTLElBQUksRUFBRSxpQkFDakQsZUFDRjtBQUdBLFFBQU0sT0FBTyxJQUNWLE9BQU8sR0FBRyxFQUNWLFVBQVUsUUFBUSxFQUNsQixLQUFLLFNBQVMsRUFDZCxLQUFLLFFBQVEsRUFDYixLQUFLLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFDL0MsS0FBSyxNQUFNLFFBQVEsQ0FBQyxFQUNwQixLQUFLLE1BQU0sU0FBUyxDQUFDLEVBQ3JCLE1BQU0sUUFBUSxVQUFVLEVBQ3hCLE1BQU0sZ0JBQWdCLEdBQUcsRUFDekIsS0FBSyxVQUFVLFVBQVUsRUFDekIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQixPQUFLLEtBQUssY0FBYyxDQUFDLE1BQW1CLEVBQUUsSUFBSTtBQUVsRCxRQUFNLFlBQVksQ0FBQyxPQUFtQixTQUFpQjtBQUNyRCxVQUFNLFlBQVcsWUFBWTtBQUM3QixpQkFBYSxNQUFNLEtBQUs7QUFDeEIsVUFBTSxNQUFNO0FBQUEsRUFDZDtBQUNBLE9BQUssR0FBRyxTQUFTLENBQUMsT0FBbUIsTUFBYztBQUNqRCxjQUFVLE9BQU8sRUFBRSxJQUFJO0FBQUEsRUFDekIsQ0FBQztBQUVELFFBQU0sUUFBTyxJQUNWLE9BQU8sR0FBRyxFQUNWLEtBQUssVUFBVSxTQUFTLEVBQ3hCLEtBQUssa0JBQWtCLEdBQUcsRUFDMUIsVUFBVSxNQUFNLEVBQ2hCLEtBQUssS0FBSyxFQUNWLEtBQUssTUFBTSxFQUNYLEtBQUssZ0JBQWdCLEdBQUc7QUFHM0IsUUFBTSxhQUFhLEFBQ2hCLG1CQUFnQixFQUNoQixNQUNDLFVBQ0EsQUFDRyxlQUFZLEVBQ1osRUFBRSxRQUFRLENBQUMsRUFDWCxFQUFFLFNBQVMsQ0FBQyxDQUNqQixFQUNDLE1BQU0sVUFBVSxBQUFHLGlCQUFjLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFDaEQsTUFDQyxXQUNBLEFBQUcsZ0JBQWEsRUFBRSxTQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FDM0Q7QUFJRixhQUFXLE1BQU0sU0FBUyxFQUFFLEdBQUcsUUFBUSxTQUFVLEdBQUc7QUFDbEQsU0FBSyxLQUFLLE1BQU0sQ0FBQyxPQUFNLEdBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLE9BQU0sR0FBRSxDQUFDO0FBQUEsRUFDbkQsQ0FBQztBQUVELGtCQUFnQixFQUFFLHlCQUFhO0FBQzdCLFNBQUssS0FBSyxhQUFhLFVBQVM7QUFBQSxFQUNsQztBQUNBLE1BQUksS0FDRixBQUNHLGNBQUssRUFDTCxPQUFPO0FBQUEsSUFDTixDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ0wsQ0FBQyxPQUFPLE1BQU07QUFBQSxFQUNoQixDQUFDLEVBQ0EsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ3BCLEdBQUcsUUFBUSxNQUFNLENBQ3RCO0FBRUEsUUFBTSxPQUFPLENBQ1gsZ0JBQ0c7QUFDSCx5QkFBcUIsT0FBTyxHQUFHO0FBQzdCLFVBQUksQ0FBQyxNQUFNO0FBQVEsb0JBQVcsWUFBWSxHQUFHLEVBQUUsUUFBUTtBQUN2RCxRQUFFLEtBQUssRUFBRTtBQUNULFFBQUUsS0FBSyxFQUFFO0FBQUEsSUFDWDtBQUVBLHFCQUFpQixPQUFPLEdBQUc7QUFDekIsUUFBRSxLQUFLLE1BQU07QUFDYixRQUFFLEtBQUssTUFBTTtBQUFBLElBQ2Y7QUFFQSx1QkFBbUIsT0FBTyxHQUFHO0FBQzNCLFVBQUksQ0FBQyxNQUFNO0FBQVEsb0JBQVcsWUFBWSxDQUFDO0FBQzNDLFFBQUUsS0FBSztBQUNQLFFBQUUsS0FBSztBQUFBLElBQ1Q7QUFFQSxXQUFPLEFBQ0osYUFBSyxFQUNMLEdBQUcsU0FBUyxXQUFXLEVBQ3ZCLEdBQUcsUUFBUSxPQUFPLEVBQ2xCLEdBQUcsT0FBTyxTQUFTO0FBQUEsRUFDeEI7QUFFQSxPQUFLLEtBQUssS0FBSyxVQUFVLENBQUM7QUErRDVCOzs7QUM1Tk8sSUFBTSxlQUFlLENBQzFCLE9BQ0EsVUFDQSxPQUNBLE9BQ0EsV0FDRztBQUNILFFBQU0sVUFBVSxlQUFlLE9BQU8sU0FBUyxRQUFRO0FBQ3ZELFVBQVEsSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUV2QixRQUFNLE9BQU8sQUFBRyxpQkFBUyxFQUFFLE9BQU87QUFDbEMsVUFBUSxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBRXBCLFFBQU0saUJBQWlCO0FBQ3ZCLFFBQU0sZ0JBQWdCO0FBQ3RCLFFBQU0sa0JBQWtCO0FBQ3hCLFFBQU0sa0JBQWtCO0FBRXhCLE1BQUksV0FBVyxLQUNiLFNBQVMsV0FBVyxHQUNwQixjQUFjLFNBQVM7QUFHekIsTUFBSSxVQUFVLEFBQUcsZ0JBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxXQUFXLENBQUM7QUFFbEQsTUFBSSxPQUFPLEFBQ1IsbUJBQVcsRUFDWCxNQUFNLEFBQUcsZUFBWSxLQUFLLElBQUksQ0FBQyxFQUMvQixPQUFPLFNBQVUsR0FBRztBQUNuQixXQUFPLEVBQUU7QUFBQSxFQUNYLENBQUMsRUFDQSxNQUFNLFNBQVUsR0FBRztBQUNsQixXQUFRLEVBQUUsS0FBSyxNQUFPLEtBQUs7QUFBQSxFQUM3QixDQUFDO0FBRUgsUUFBTSxNQUFNLEFBQ1QsZ0JBQU8sV0FBVyxFQUNsQixPQUFPLEtBQUssRUFDWixLQUFLLFVBQVUsTUFBTSxFQUNyQixLQUFLLFNBQVMsS0FBSyxFQUNuQixPQUFPLEdBQUcsRUFDVixLQUFLLGFBQWEsZUFBZSxTQUFTLE1BQU0sU0FBUyxHQUFHO0FBRS9ELE1BQUksUUFBTyxJQUFJLE9BQU8sR0FBRyxFQUFFLFVBQVUsT0FBTyxHQUMxQyxRQUFRLElBQUksT0FBTyxHQUFHLEVBQUUsVUFBVSxRQUFRLEdBQzFDLFNBQVMsSUFBSSxPQUFPLEdBQUcsRUFBRSxVQUFVLFNBQVM7QUFHOUMsTUFBSSxrQkFBa0IsQUFDbkIsUUFBWSxFQUNaLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUNmLE1BQU0sQ0FBQyxpQkFBaUIsZUFBZSxDQUFDO0FBUTNDLE1BQUksUUFBTyxpQkFBaUIsSUFBSSxFQUU3QixJQUFJLFNBQVUsR0FBRztBQUNoQixZQUFRLElBQUksQ0FBQztBQUNiLFdBQU8sRUFBRTtBQUFBLEVBQ1gsQ0FBQztBQUtILFVBQVEsS0FBSTtBQUNaLFFBQU0sU0FBUyxNQUFLLE9BQU87QUFHM0IsUUFBTSxRQUFRLE1BQ1gsS0FBSyxlQUFlLE1BQU0sQ0FBQyxFQUMzQixNQUFNLEVBQ04sT0FBTyxNQUFNLEVBQ2IsS0FBSyxTQUFVLEdBQUc7QUFDakIsSUFBQyxFQUFFLFNBQVMsRUFBRSxJQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsU0FBUztBQUFBLEVBQzlDLENBQUMsRUFDQSxLQUFLLFNBQVMsTUFBTSxFQUNwQixLQUFLLEtBQUssSUFBSSxFQUNkLEtBQUssUUFBUSxNQUFNLEVBQ25CLEtBQUssVUFBVSxPQUFPO0FBRXpCLFFBQU0sU0FBUyxNQUNaLEtBQUssTUFBTSxFQUNYLE1BQU0sRUFDTixPQUFPLE1BQU0sRUFDYixLQUFLLFNBQVMsT0FBTyxFQUNyQixLQUFLLE1BQU0sUUFBUSxFQUNuQixLQUFLLGFBQWEsU0FBVSxHQUFHO0FBQzlCLFdBQ0UsWUFDQyxHQUFFLElBQUksTUFDUCxnQkFDQyxHQUFFLElBQUksaUJBQ1AsUUFDQyxHQUFFLElBQUksTUFBTSxLQUFLO0FBQUEsRUFFdEIsQ0FBQyxFQUNBLEtBQUssZUFBZSxTQUFVLEdBQUc7QUFDaEMsV0FBTyxFQUFFLElBQUksTUFBTSxVQUFVO0FBQUEsRUFDL0IsQ0FBQyxFQUNBLEtBQUssU0FBVSxHQUFHO0FBQ2pCLFdBQU8sRUFBRSxLQUFLO0FBQUEsRUFDaEIsQ0FBQztBQUVILFFBQU0sVUFBVSxPQUNiLEtBQUssTUFBTSxFQUNYLE1BQU0sRUFDTixPQUFPLFFBQVEsRUFDZixLQUFLLFNBQVMsUUFBUSxFQUN0QixLQUFLLGFBQWEsU0FBVSxHQUFHO0FBQzlCLFdBQ0UsWUFBYSxHQUFFLElBQUksTUFBTSxnQkFBaUIsR0FBRSxJQUFJLGtCQUFrQjtBQUFBLEVBRXRFLENBQUMsRUFDQSxLQUFLLEtBQUssQ0FBQyxNQUFNLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxFQUN6QyxLQUFLLFVBQVUsT0FBTyxFQUN0QixLQUFLLFFBQVEsU0FBUyxFQUN0QixNQUFNLFdBQVcsR0FBRztBQUd2Qiw0QkFBMEIsU0FBUztBQUNqQyxRQUFJLE9BQU0sQ0FBQztBQUVYLG1CQUFjLE1BQU0sTUFBTTtBQUN4QixVQUFJLE9BQU8sS0FBSSxPQUNiO0FBQ0YsVUFBSSxDQUFDLE1BQU07QUFDVCxlQUFPLEtBQUksUUFBUSxRQUFRLEVBQUUsTUFBWSxVQUFVLENBQUMsRUFBRTtBQUN0RCxZQUFJLEtBQUssUUFBUTtBQUVmLGVBQUssU0FBUyxNQUFLLEtBQUssVUFBVSxHQUFJLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBRSxDQUFDO0FBQ2pFLGVBQUssT0FBTyxTQUFTLEtBQUssSUFBSTtBQUM5QixlQUFLLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQztBQUFBLFFBQ2pDO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsWUFBUSxRQUFRLFNBQVUsR0FBRztBQUMzQixZQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUEsSUFDaEIsQ0FBQztBQUVELFdBQU8sQUFBRyxVQUFVLEtBQUksR0FBRztBQUFBLEVBQzdCO0FBR0EsMEJBQXdCLE9BQU87QUFDN0IsUUFBSSxPQUFNLENBQUMsR0FDVCxVQUFVLENBQUM7QUFHYixVQUFNLFFBQVEsU0FBVSxHQUFHO0FBQ3pCLFdBQUksRUFBRSxLQUFLLFFBQVE7QUFBQSxJQUNyQixDQUFDO0FBR0QsVUFBTSxRQUFRLFNBQVUsR0FBRztBQUN6QixVQUFJLEVBQUUsS0FBSztBQUNULFVBQUUsS0FBSyxRQUFRLFFBQVEsU0FBVSxHQUFHO0FBQ2xDLGtCQUFRLEtBQUssS0FBSSxFQUFFLEtBQUssTUFBTSxLQUFLLEtBQUksRUFBRSxDQUFDO0FBQUEsUUFDNUMsQ0FBQztBQUFBLElBQ0wsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBQ3ZLTyxJQUFNLGlCQUFpQixDQUM1QixPQUNBLFVBQ0EsT0FDQSxPQUNBLFdBQ0c7QUFDSCxRQUFNLEVBQUUsYUFBYSxNQUFNO0FBQzNCLE1BQUksY0FBYyxTQUFTO0FBQzNCLFVBQVEsSUFBSSxFQUFFLFlBQVksQ0FBQztBQUUzQixVQUFRLEtBQUssZ0JBQWdCO0FBRTdCLFVBQVEsUUFBUSxnQkFBZ0I7QUFFaEMsUUFBTSxvQkFBb0IsaUJBQWlCLFNBQVMsSUFBSSxFQUFFLGlCQUN4RCxlQUNGO0FBQ0EsTUFBSSxpQkFBaUI7QUFFckIsUUFBTSxvQkFBb0IsQUFDdkIsZ0JBQU8sV0FBVyxFQUNsQixPQUFPLE9BQU8sRUFDZCxLQUFLLFFBQVEsT0FBTztBQUV2QixvQkFBa0IsR0FBRyxVQUFVLHFCQUFxQixJQUFJO0FBQ3RELHFCQUFpQixHQUFHLE9BQU87QUFDM0IsU0FDRyxXQUFXLEVBQ1gsU0FBUyxHQUFHLEVBQ1osTUFBTSxRQUFRLENBQUMsTUFBTTtBQUNwQixVQUFJLEVBQUUsVUFBVTtBQUFlO0FBQy9CLGFBQU87QUFBQSxJQUNULENBQUM7QUFBQSxFQUNMLENBQUM7QUFLRCxRQUFNLE9BQU8sYUFBYSxLQUFLO0FBRS9CLFFBQU0sUUFJQSxLQUFLLE1BQU0sSUFBSSxDQUFDLE1BQU0sT0FBTyxPQUFPLENBQUMsQ0FBQztBQUU1QyxRQUFNLFdBQVcsS0FBSyxNQUFNLEtBQUssQ0FBQyxVQUFTLE1BQUssU0FBUyxTQUFTLFFBQVE7QUFDMUUsTUFBSTtBQUNKLE1BQUksQ0FBQyxVQUFVO0FBQ2IsVUFBTSxNQUFLLEtBQUssTUFBTTtBQUN0QixTQUFLLE1BQU0sS0FBSyxFQUFFLFNBQUksTUFBTSxTQUFTLFNBQVMsQ0FBQztBQUMvQyxvQkFBZ0I7QUFBQSxFQUNsQixPQUFPO0FBQ0wsb0JBQWdCLFNBQVM7QUFBQSxFQUMzQjtBQUVBLFFBQU0sUUFBUSxLQUFLLE1BQU0sSUFBSSxDQUFDLE1BQU0sT0FBTyxPQUFPLENBQUMsQ0FBQztBQUVwRCxRQUFNLGFBQWEsQUFDaEIsbUJBQWdCLEtBQUssRUFDckIsTUFDQyxRQUNBLEFBQUcsYUFBVSxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ3BDLEVBQ0MsTUFBTSxVQUFVLEFBQUcsaUJBQWMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUMvQyxNQUFNLFVBQVUsQUFBRyxlQUFZLFFBQVEsR0FBRyxTQUFTLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQztBQUV0RSxRQUFNLE9BQU8sQ0FBQyxnQkFBOEM7QUFDMUQseUJBQXFCLE9BQU8sR0FBRztBQUM3QixVQUFJLENBQUMsTUFBTTtBQUFRLG9CQUFXLFlBQVksR0FBRyxFQUFFLFFBQVE7QUFDdkQsUUFBRSxLQUFLLEVBQUU7QUFDVCxRQUFFLEtBQUssRUFBRTtBQUFBLElBQ1g7QUFFQSxxQkFBaUIsT0FBTyxHQUFHO0FBQ3pCLFFBQUUsS0FBSyxNQUFNO0FBQ2IsUUFBRSxLQUFLLE1BQU07QUFBQSxJQUNmO0FBRUEsdUJBQW1CLE9BQU8sR0FBRztBQUMzQixVQUFJLENBQUMsTUFBTTtBQUFRLG9CQUFXLFlBQVksQ0FBQztBQUMzQyxRQUFFLEtBQUs7QUFDUCxRQUFFLEtBQUs7QUFBQSxJQUNUO0FBRUEsV0FBTyxBQUNKLGFBQUssRUFDTCxHQUFHLFNBQVMsV0FBVyxFQUN2QixHQUFHLFFBQVEsT0FBTyxFQUNsQixHQUFHLE9BQU8sU0FBUztBQUFBLEVBQ3hCO0FBRUEsUUFBTSxNQUFNLEFBQ1QsZ0JBQU8sV0FBVyxFQUNsQixPQUFPLEtBQUssRUFDWixLQUFLLFVBQVUsTUFBTSxFQUNyQixLQUFLLFNBQVMsS0FBSyxFQUNuQixLQUFLLFNBQVMsZ0JBQWdCO0FBRWpDLFFBQU0sUUFBTyxJQUNWLE9BQU8sR0FBRyxFQUNWLEtBQUssVUFBVSxTQUFTLEVBQ3hCLEtBQUssa0JBQWtCLEdBQUcsRUFDMUIsVUFBVSxNQUFNLEVBQ2hCLEtBQUssS0FBSyxFQUNWLEtBQUssTUFBTSxFQUNYLEtBQUssZ0JBQWdCLEdBQUcsRUFDeEIsS0FBSyxjQUFjLFdBQVc7QUFFakMsTUFBSSxRQUFPLElBQ1IsT0FBTyxPQUFPLEVBQ2QsVUFBVSxNQUFNLEVBQ2hCLEtBQUssS0FBSyxFQUNWLE1BQU0sRUFDTixPQUFPLFVBQVUsRUFFakIsS0FBSyxTQUFTLE1BQU0sRUFDcEIsS0FBSyxjQUFjLFdBQVc7QUFFakMsUUFBTSxZQUFZLElBQ2YsT0FBTyxVQUFVLEVBQ2pCLFVBQVUsUUFBUSxFQUNsQixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQ1osTUFBTSxFQUNOLE9BQU8sWUFBWSxFQUNuQixLQUFLLE1BQU0sTUFBTSxFQUNqQixLQUFLLFdBQVcsWUFBWSxFQUM1QixLQUFLLFFBQVEsRUFBRSxFQUNmLEtBQUssUUFBUSxHQUFHLEVBQ2hCLEtBQUssZUFBZSxDQUFDLEVBQ3JCLEtBQUssZ0JBQWdCLENBQUMsRUFDdEIsS0FBSyxVQUFVLE1BQU0sRUFFckIsS0FBSyxnQkFBZ0IsRUFBRSxFQUN2QixPQUFPLFVBQVUsRUFDakIsS0FBSyxLQUFLLGdCQUFnQjtBQUU3QixRQUFNLGdCQUFnQixDQUFDLE1BQ3JCLEtBQUssTUFBTSxLQUFLLENBQUMsVUFBUyxNQUFLLE9BQU8sRUFBRSxLQUFLLEVBQUU7QUFFakQsUUFBTSxnQkFBZ0IsQ0FBQyxTQUNyQixLQUFLLE1BQU0sS0FBSyxDQUFDLFVBQVMsTUFBSyxTQUFTLElBQUksRUFBRTtBQUVoRCxRQUFNLE9BS0YsSUFDRCxPQUFPLEdBQUcsRUFDVixVQUFVLFFBQVEsRUFDbEIsS0FBSyxLQUFLLEVBQ1YsS0FBSyxRQUFRLEVBRWIsS0FBSyxLQUFLLENBQUMsRUFDWCxLQUFLLFFBQVEsQ0FBQyxNQUFNO0FBQ25CLFFBQUksY0FBYyxDQUFDLE1BQU0sU0FBUyxVQUFVO0FBQzFDLGFBQU87QUFBQSxJQUNULE9BQU87QUFDTCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0YsQ0FBQyxFQUNBLEtBQUssS0FBSyxVQUFVLENBQUM7QUFFeEIsT0FBSyxLQUFLLGNBQWMsQ0FBQyxNQUFjLEVBQUUsSUFBSTtBQUU3QyxRQUFNLFlBQVksQ0FBQyxPQUFtQixTQUFpQjtBQUNyRCxpQkFBYSxNQUFNLEtBQUs7QUFDeEIsVUFBTSxNQUFNO0FBQUEsRUFDZDtBQUNBLE9BQUssR0FBRyxTQUFTLENBQUMsT0FBbUIsTUFBYztBQUNqRCxjQUFVLE9BQU8sRUFBRSxJQUFJO0FBQUEsRUFDekIsQ0FBQztBQUVELE9BQUssR0FBRyxhQUFhLENBQUMsT0FBbUIsTUFBTTtBQUM3QyxRQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3RCLG9CQUFjLEVBQUU7QUFFaEIsV0FBSyxNQUFNLFFBQVEsQ0FBQyxNQUFNO0FBQ3hCLFlBQUksRUFBRSxTQUFTLGFBQWE7QUFDMUIsaUJBQU87QUFBQSxRQUNUO0FBQU8saUJBQU87QUFBQSxNQUNoQixDQUFDO0FBQUEsSUFHSDtBQUFBLEVBQ0YsQ0FBQztBQUVELGtCQUFnQixJQUFXLEdBQVc7QUFDcEMsUUFBSSxPQUFNO0FBQUcsYUFBTztBQUNwQixVQUFNLFlBQVksTUFBTSxLQUN0QixDQUFDLFVBQ0UsTUFBSyxPQUFPLFVBQVUsTUFBSyxNQUFLLE9BQU8sVUFBVSxLQUNqRCxNQUFLLE9BQU8sVUFBVSxNQUFLLE1BQUssT0FBTyxVQUFVLENBQ3REO0FBRUEsV0FBTyxDQUFDLENBQUM7QUFBQSxFQUNYO0FBdUJBLE9BQ0csR0FBRyxhQUFhLENBQUMsT0FBbUIsTUFBeUI7QUFDNUQsU0FDRyxXQUFXLEVBQ1gsU0FBUyxHQUFHLEVBQ1osTUFBTSxXQUFXLENBQUMsTUFBTTtBQUN2QixhQUFPLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUk7QUFBQSxJQUN4QyxDQUFDO0FBQ0gsVUFDRyxXQUFXLEVBQ1gsU0FBUyxHQUFHLEVBQ1osTUFBTSxXQUFXLFNBQVUsR0FBRztBQUM3QixhQUFPLEVBQUUsT0FBTyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sVUFBVSxFQUFFLFFBQ3RELElBQ0E7QUFBQSxJQUNOLENBQUM7QUFHSCxVQUFNLGNBQWMsY0FBYyxDQUFDO0FBQUEsRUFxQnJDLENBQUMsRUFDQSxHQUFHLFlBQVksT0FBTztBQUV6QiwyQkFBeUIsR0FBRyxPQUFtQjtBQUFBLEVBQUU7QUFFakQscUJBQW1CO0FBRWpCLFNBQUssTUFBTSxXQUFXLENBQUM7QUFDdkIsVUFBSyxNQUFNLFdBQVcsQ0FBQyxFQUFFLE1BQU0sVUFBVSxTQUFTO0FBQUEsRUFDcEQ7QUFFQSxhQUFXLEdBQUcsUUFBUSxNQUFNO0FBQzFCLFVBQ0csS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUM1QixLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQzVCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFDNUIsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUUvQixTQUFLLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFBQSxFQUNuRCxDQUFDO0FBRUQsa0JBQWdCLEVBQUUseUJBQWE7QUFDN0IsU0FBSyxLQUFLLGFBQWEsVUFBUztBQUNoQyxVQUFLLEtBQUssYUFBYSxVQUFTO0FBQUEsRUFDbEM7QUFDQSxNQUFJLEtBQ0YsQUFDRyxjQUFLLEVBQ0wsT0FBTztBQUFBLElBQ04sQ0FBQyxHQUFHLENBQUM7QUFBQSxJQUNMLENBQUMsT0FBTyxNQUFNO0FBQUEsRUFDaEIsQ0FBQyxFQUNBLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUNyQixHQUFHLFFBQVEsTUFBTSxDQUN0QjtBQUVBLHVCQUFxQjtBQUNuQixVQUFNLFFBQVEsSUFBSSxNQUFNLElBQUk7QUFDNUIsaUJBQWEsUUFBUSxPQUFPLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQSxFQUNuRDtBQUNGOzs7QUM5U08sSUFBTSxTQUFTLENBQ3BCLE9BQ0EsVUFDQSxPQUNBLE9BQ0EsZUFDRztBQUNILFFBQU0sVUFBVSxlQUFlLE9BQU8sU0FBUyxRQUFRO0FBQ3ZELFVBQVEsSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUV2QixRQUFNLE9BQU8sQUFBRyxpQkFBUyxFQUFFLE9BQU87QUFDbEMsVUFBUSxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBRXBCLFFBQU0sVUFBUyxBQUFHLE9BQU8sSUFBSTtBQUU3QixRQUFNLFNBQVEsQUFBRyxRQUNmLEFBQUcsaUJBQVksaUJBQW9CLEtBQUssU0FBUyxTQUFTLENBQUMsQ0FDN0Q7QUFFQSxRQUFNLFlBQVksQ0FBQyxTQUFTO0FBQzFCLFVBQU0sUUFBTyxBQUNWLFVBQVUsSUFBSSxFQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUNsQixLQUFLLENBQUMsSUFBRyxNQUFNLEVBQUUsU0FBUyxHQUFFLFVBQVUsRUFBRSxRQUFRLEdBQUUsS0FBSztBQUMxRCxXQUFPLEFBQUcsa0JBQVUsRUFBRSxLQUFLLENBQUMsWUFBYyxPQUFLLFNBQVMsS0FBSyxRQUFTLENBQUMsQ0FBQyxFQUN0RSxLQUNGO0FBQUEsRUFDRjtBQUVBLFFBQU0sUUFBTyxVQUFVLElBQUk7QUFDM0IsTUFBSSxRQUFRO0FBRVosUUFBTSxNQUFNLEFBQ1QsZ0JBQU8sV0FBVyxFQUNsQixPQUFPLEtBQUssRUFDWixLQUFLLFVBQVUsVUFBVSxFQUN6QixLQUFLLFNBQVMsS0FBSyxFQUNuQixNQUFNLFFBQVEsaUJBQWlCO0FBRWxDLFFBQU0sT0FBTyxJQUNWLFVBQVUsR0FBRyxFQUNiLEtBQUssTUFBSyxZQUFZLENBQUMsRUFDdkIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUs7QUFFeEQsUUFBTSxPQUFPLEtBQ1YsT0FBTyxNQUFNLEVBQ2IsS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFDcEMsS0FBSyxVQUFVLENBQUMsTUFBTSxXQUFXLENBQUMsQ0FBQyxFQUNuQyxLQUFLLGdCQUFnQixHQUFHLEVBQ3hCLEtBQUssUUFBUSxDQUFDLE1BQU07QUFDbkIsUUFBSSxDQUFDLEVBQUU7QUFBTyxhQUFPO0FBQ3JCLFdBQU8sRUFBRSxRQUFRO0FBQUcsVUFBSSxFQUFFO0FBQzFCLFdBQU8sT0FBTSxFQUFFLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDL0IsQ0FBQyxFQUNBLE1BQU0sVUFBVSxTQUFTLEVBQ3pCLEdBQUcsU0FBUyxPQUFPO0FBRXRCLFFBQU0sUUFBTyxLQUNWLE9BQU8sTUFBTSxFQUNiLE1BQU0sZUFBZSxNQUFNLEVBQzNCLEtBQUssa0JBQWtCLE1BQU0sRUFDN0IsS0FBSyxLQUFLLENBQUMsRUFDWCxLQUFLLEtBQUssRUFBRTtBQUdmLFFBQUssT0FBTyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssSUFBSTtBQUVqRCxRQUFNLFFBQVEsTUFDWCxPQUFPLE9BQU8sRUFDZCxLQUFLLGdCQUFnQixDQUFDLE1BQU8sY0FBYSxDQUFDLElBQUksSUFBSSxLQUFLLEdBQUcsRUFDM0QsS0FBSyxDQUFDLE1BQU0sSUFBSSxRQUFPLEVBQUUsS0FBSyxHQUFHO0FBRXBDLE9BQUssT0FBTyxPQUFPLEVBQUUsS0FDbkIsQ0FBQyxNQUNDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU0sR0FBRSxLQUFLLEtBQUssSUFBSSxHQUloRDtBQUVBLG1CQUFpQixPQUFPLEdBQUc7QUFDekIsWUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ2pCLFlBQVEsVUFBVSxJQUFLLElBQUksRUFBRSxTQUFVO0FBRXZDLFVBQUssS0FBSyxDQUFDLE1BQU07QUFDZixRQUFFLFNBQVM7QUFBQSxRQUNULElBQU0sR0FBRSxLQUFLLEVBQUUsTUFBTyxHQUFFLEtBQUssRUFBRSxNQUFPO0FBQUEsUUFDdEMsSUFBTSxHQUFFLEtBQUssRUFBRSxNQUFPLEdBQUUsS0FBSyxFQUFFLE1BQU87QUFBQSxRQUN0QyxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQUEsUUFDYixJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQUEsTUFDZjtBQUNBLGNBQVEsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUFBLElBQ3pCLENBQUM7QUFFRCxVQUFNLElBQUksS0FDUCxXQUFXLEVBQ1gsU0FBUyxHQUFHLEVBQ1osS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLEVBQUUsT0FBTyxNQUFNLEVBQUUsT0FBTyxLQUFLO0FBRXRFLFNBQUssV0FBVyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsTUFBTSxXQUFXLEVBQUUsTUFBTSxDQUFDO0FBQzdELFVBQUssV0FBVyxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQztBQUN0RSxVQUNHLFdBQVcsQ0FBQyxFQUNaLEtBQUssZ0JBQWdCLENBQUMsTUFBTyxjQUFhLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBRztBQUFBLEVBQ2hFO0FBRUEsc0JBQW9CLEdBQUc7QUFDckIsWUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ2pCLFdBQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxLQUFLLElBQUksR0FBSSxHQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBQSxFQUNwRDtBQUVBLHdCQUFzQixHQUFHO0FBQ3ZCLFdBQU8sRUFBRSxNQUFNLFNBQVMsRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztBQUFBLEVBQ3JEO0FBQ0Y7OztBQ25ITyxJQUFNLGFBQWEsQ0FDeEIsT0FDQSxVQUNBLE9BQ0EsT0FDQSxXQUNHO0FBQ0gsUUFBTSxVQUFVLGVBQWUsT0FBTyxTQUFTLFFBQVE7QUFDdkQsVUFBUSxJQUFJLEVBQUUsUUFBUSxDQUFDO0FBRXZCLFFBQU0sYUFBWSxBQUFHLGlCQUFTLEVBQUUsT0FBTztBQUN2QyxVQUFRLElBQUksRUFBRSxzQkFBVSxDQUFDO0FBRXpCLFFBQU0sTUFBTSxBQUNULGdCQUFPLFdBQVcsRUFDbEIsT0FBTyxLQUFLLEVBQ1osS0FBSyxVQUFVLE1BQU0sRUFDckIsS0FBSyxTQUFTLEtBQUs7QUFFdEIsUUFBTSxRQUFPLEFBQ1YsVUFBVSxZQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFDdEMsSUFBSSxDQUFDLE1BQU8sRUFBRSxXQUFXLElBQUksQ0FBRSxFQUMvQixLQUFLLENBQUMsSUFBRyxNQUFNLEdBQUUsUUFBUSxFQUFFLEtBQUs7QUFFbkMsUUFBTSxjQUFjLFFBQVE7QUFDNUIsUUFBTSxjQUFjLGNBQWM7QUFFbEMsUUFBTSxVQUFVLEFBQ2IsZ0JBQVEsRUFDUixLQUFLLENBQUMsS0FBSyxXQUFXLENBQUMsRUFDdkIsV0FBVyxDQUFDLElBQUcsTUFBTSxDQUFDO0FBRXpCLFFBQU0sU0FBUSxBQUNYLFFBQWEsRUFDYixPQUFPLE1BQU0sTUFBTSxDQUFDLEVBQ3BCLE1BQVMsa0JBQWdCO0FBRTVCLHFCQUFtQixHQUE4QjtBQUMvQyxXQUFPLEVBQUUsS0FBSyxLQUFLLFFBQVMsR0FBRSxXQUFXLEFBQUcsSUFBSSxFQUFFLFVBQVUsU0FBUyxJQUFJO0FBQUEsRUFDM0U7QUFFQSxxQkFBbUIsR0FBOEIsSUFBWSxHQUFXO0FBQ3RFLE1BQUUsU0FBVSxPQUFNLEVBQUUsS0FBSyxLQUFLLFNBQVM7QUFDdkMsUUFBSSxFQUFFO0FBQVUsUUFBRSxTQUFTLFFBQVEsQ0FBQyxPQUFNLFVBQVUsSUFBRyxJQUFJLENBQUMsQ0FBQztBQUFBLEVBQy9EO0FBRUEsb0JBQWtCLEdBQThCO0FBQzlDLFFBQUksT0FBTyxFQUFFLEtBQUssS0FBSztBQUN2QixNQUFFLFFBQ0EsT0FBTSxPQUFPLEVBQUUsUUFBUSxJQUFJLEtBQUssSUFDNUIsT0FBTSxJQUFJLElBQ1YsRUFBRSxTQUNBLEVBQUUsT0FBTyxRQUNUO0FBQ1IsUUFBSSxFQUFFO0FBQVUsUUFBRSxTQUFTLFFBQVEsUUFBUTtBQUFBLEVBQzdDO0FBRUEsd0JBQXNCLEdBQUc7QUFDdkIsV0FBTyxTQUFTLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxRQUFRLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxNQUFNO0FBQUEsRUFDMUU7QUFFQSx3QkFBc0IsR0FBRztBQUN2QixXQUFPLFNBQVMsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNoRTtBQUVBLGlDQUErQixHQUFHO0FBQ2hDLFdBQU8sU0FBUyxFQUFFLE9BQU8sR0FBRyxFQUFFLE9BQU8sUUFBUSxFQUFFLE9BQU8sR0FBRyxXQUFXO0FBQUEsRUFDdEU7QUFFQSxpQ0FBK0IsR0FBRztBQUNoQyxXQUFPLFNBQVMsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLEdBQUcsV0FBVztBQUFBLEVBQ2pFO0FBRUEsb0JBQ0UsWUFDQSxhQUNBLFVBQ0EsV0FDQTtBQUNBLFVBQU0sS0FBSyxLQUFLLElBQUssYUFBZSxjQUFhLE1BQU0sTUFBTyxLQUFLLEVBQUc7QUFDdEUsVUFBTSxLQUFLLEtBQUssSUFBSSxVQUFVO0FBQzlCLFVBQU0sS0FBSyxLQUFLLElBQUssV0FBYSxZQUFXLE1BQU0sTUFBTyxLQUFLLEVBQUc7QUFDbEUsVUFBTSxLQUFLLEtBQUssSUFBSSxRQUFRO0FBQzVCLFdBQ0UsTUFDQSxjQUFjLEtBQ2QsTUFDQSxjQUFjLEtBQ2IsY0FBYSxhQUNWLEtBQ0EsTUFDRixjQUNBLE1BQ0EsY0FDQSxVQUNDLFlBQVcsYUFBYSxJQUFJLEtBQzdCLE1BQ0EsY0FBYyxLQUNkLE1BQ0EsY0FBYyxNQUNoQixNQUNBLFlBQVksS0FDWixNQUNBLFlBQVk7QUFBQSxFQUVoQjtBQUVBLFFBQU0sU0FBUyxDQUFDLFNBQVE7QUFDdEIsVUFBTSxJQUFJLEtBQ1AsVUFBVSxHQUFHLEVBQ2IsS0FBSyxPQUFNLE9BQU8sQ0FBQyxFQUNuQixLQUFLLEdBQUcsRUFDUixLQUNDLGFBQ0EsQ0FBQyxHQUFHLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQyxjQUFjLElBQUksS0FDNUQ7QUFFRixNQUFFLE9BQU8sTUFBTSxFQUFFLEtBQUssU0FBUyxFQUFFLEVBQUUsS0FBSyxVQUFVLEVBQUUsRUFBRSxLQUFLLFFBQVEsTUFBSztBQUV4RSxNQUFFLE9BQU8sTUFBTSxFQUNaLEtBQUssS0FBSyxFQUFFLEVBQ1osS0FBSyxLQUFLLENBQUMsRUFDWCxLQUFLLE1BQU0sUUFBUSxFQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDO0FBQUEsRUFDbEI7QUFFQSxVQUFRLEtBQUk7QUFDWixZQUFVLE9BQU8sTUFBSyxLQUFLLEtBQUssUUFBUSxHQUFJLGNBQWMsVUFBVSxLQUFJLENBQUM7QUFDekUsV0FBUyxLQUFJO0FBRWIsTUFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLE1BQU07QUFFM0IsTUFBSSxPQUFPLE9BQU8sRUFBRSxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBZTFCO0FBRUMsUUFBTSxnQkFBZ0IsSUFDbkIsT0FBTyxHQUFHLEVBQ1YsS0FBSyxRQUFRLE1BQU0sRUFDbkIsS0FBSyxVQUFVLE1BQU0sRUFDckIsS0FBSyxrQkFBa0IsSUFBSSxFQUMzQixVQUFVLE1BQU0sRUFDaEIsS0FBSyxNQUFLLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxRQUFRLENBQUMsRUFDbkQsS0FBSyxNQUFNLEVBQ1gsS0FBSyxTQUFVLEdBQUc7QUFDakIsTUFBRSxPQUFPLG9CQUFvQjtBQUFBLEVBQy9CLENBQUMsRUFDQSxLQUFLLEtBQUsscUJBQXFCO0FBRWxDLFFBQU0sUUFBTyxJQUNWLE9BQU8sR0FBRyxFQUNWLEtBQUssUUFBUSxNQUFNLEVBQ25CLEtBQUssVUFBVSxNQUFNLEVBQ3JCLFVBQVUsTUFBTSxFQUNoQixLQUFLLE1BQUssTUFBTSxDQUFDLEVBQ2pCLEtBQUssTUFBTSxFQUNYLEtBQUssU0FBVSxHQUFHO0FBQ2pCLE1BQUUsT0FBTyxXQUFXO0FBQUEsRUFDdEIsQ0FBQyxFQUNBLEtBQUssS0FBSyxZQUFZLEVBQ3RCLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEtBQUs7QUFFdkMsUUFBTSxRQUFRLElBQ1gsT0FBTyxHQUFHLEVBQ1YsVUFBVSxNQUFNLEVBQ2hCLEtBQUssTUFBSyxPQUFPLENBQUMsRUFDbEIsS0FBSyxNQUFNLEVBQ1gsS0FBSyxNQUFNLE9BQU8sRUFDbEIsS0FDQyxhQUNBLENBQUMsTUFDQyxVQUFVLEVBQUUsSUFBSSxpQkFBaUIsY0FBYyxPQUFPLEVBQUUsSUFBSSxNQUFNLEtBQUssZ0JBRTNFLEVBQ0MsS0FBSyxlQUFlLENBQUMsTUFBTyxFQUFFLElBQUksTUFBTSxVQUFVLEtBQU0sRUFDeEQsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssSUFBSSxFQUM1QixHQUFHLGFBQWEsWUFBWSxJQUFJLENBQUMsRUFDakMsR0FBRyxZQUFZLFlBQVksS0FBSyxDQUFDO0FBVXBDLHVCQUFxQixRQUFRO0FBQzNCLFdBQU8sU0FBVSxPQUFPLEdBQUc7QUFDekIsTUFBRyxnQkFBTyxJQUFJLEVBQUUsUUFBUSxpQkFBaUIsTUFBTTtBQUMvQyxNQUFHLGdCQUFPLEVBQUUsaUJBQWlCLEVBQzFCLFFBQVEsMEJBQTBCLE1BQU0sRUFDeEMsTUFBTTtBQUNUO0FBQUcsUUFBRyxnQkFBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLGdCQUFnQixNQUFNLEVBQUUsTUFBTTtBQUFBLGFBQ3ZELElBQUksRUFBRTtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLGtCQUFnQixFQUFFLHlCQUFhO0FBQzdCLGtCQUFjLEtBQUssYUFBYSxVQUFTO0FBQ3pDLFVBQUssS0FBSyxhQUFhLFVBQVM7QUFDaEMsVUFBTSxLQUFLLGFBQWEsVUFBUztBQUFBLEVBQ25DO0FBQ0EsTUFBSSxLQUNGLEFBQ0csY0FBSyxFQUNMLE9BQU87QUFBQSxJQUNOLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDTCxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ2hCLENBQUMsRUFDQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEIsR0FBRyxRQUFRLE1BQU0sQ0FDdEI7QUFDRjs7O0FDak9PLElBQU0sV0FBVyxDQUN0QixPQUNBLFVBQ0EsT0FDQSxPQUNBLFdBQ0c7QUFDSCxRQUFNLFVBQVUsZUFBZSxPQUFPLFNBQVMsUUFBUTtBQUN2RCxVQUFRLElBQUksRUFBRSxRQUFRLENBQUM7QUFFdkIsUUFBTSxhQUFZLEFBQUcsaUJBQVMsRUFBRSxPQUFPO0FBQ3ZDLFVBQVEsSUFBSSxFQUFFLHNCQUFVLENBQUM7QUFFekIsTUFBSSxTQUFTLEtBQUssSUFBSSxPQUFPLE1BQU0sSUFBSTtBQUN2QyxNQUFJLFNBQVEsQUFBRyxRQUFnQixrQkFBZ0I7QUFFL0MsTUFBSSxJQUFJLEFBQ0wsZ0JBQU8sS0FBSyxFQUNaLEtBQUssU0FBUyxLQUFLLEVBQ25CLEtBQUssVUFBVSxNQUFNLEVBQ3JCLE9BQU8sR0FBRyxFQUNWLEtBQUssYUFBYSxlQUFlLFFBQVEsSUFBSSxNQUFNLFNBQVMsSUFBSSxHQUFHO0FBRXRFLE1BQUksSUFBSSxBQUNMLGdCQUFPLEtBQUssRUFDWixLQUFLLFNBQVMsS0FBSyxFQUNuQixLQUFLLFVBQVUsTUFBTSxFQUNyQixPQUFPLEdBQUcsRUFDVixLQUFLLGFBQWEsZUFBZSxRQUFRLElBQUksTUFBTSxTQUFTLElBQUksR0FBRztBQUV0RSxNQUFJLElBQUksQUFDTCxnQkFBTyxLQUFLLEVBQ1osS0FBSyxTQUFTLEtBQUssRUFDbkIsS0FBSyxVQUFVLE1BQU0sRUFDckIsT0FBTyxHQUFHLEVBQ1YsS0FBSyxhQUFhLGVBQWUsUUFBUSxJQUFJLE1BQU0sU0FBUyxJQUFJLEdBQUc7QUFFdEUsTUFBSSxZQUFZLEFBQ2Isa0JBQVUsRUFDVixLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDO0FBRTdCLE1BQUksUUFBTyxBQUNSLFVBQVUsVUFBUyxFQUNuQixJQUFJLFNBQVUsR0FBRztBQUNoQixXQUFPLEVBQUU7QUFBQSxFQUNYLENBQUM7QUFFSCxZQUFVLEtBQUk7QUFDZCxNQUFJLE1BQU0sQUFDUCxZQUFJLEVBQ0osV0FBVyxTQUFVLEdBQUc7QUFDdkIsV0FBTyxFQUFFO0FBQUEsRUFDWCxDQUFDLEVBQ0EsU0FBUyxTQUFVLEdBQUc7QUFDckIsV0FBTyxFQUFFO0FBQUEsRUFDWCxDQUFDLEVBQ0EsWUFBWSxTQUFVLEdBQUc7QUFDeEIsV0FBTyxFQUFFO0FBQUEsRUFDWCxDQUFDLEVBQ0EsWUFBWSxTQUFVLEdBQUc7QUFDeEIsV0FBTyxFQUFFO0FBQUEsRUFDWCxDQUFDO0FBRUgsSUFBRSxVQUFVLE1BQU0sRUFDZixLQUFLLE1BQUssWUFBWSxDQUFDLEVBQ3ZCLE1BQU0sRUFDTixPQUFPLE1BQU0sRUFDYixLQUFLLFdBQVcsU0FBVSxHQUFHO0FBQzVCLFdBQU8sRUFBRSxRQUFRLE9BQU87QUFBQSxFQUMxQixDQUFDLEVBQ0EsS0FBSyxLQUFLLEdBQUcsRUFDYixNQUFNLFVBQVUsTUFBTSxFQUN0QixNQUFNLFFBQVEsU0FBVSxHQUFHO0FBQzFCLFdBQU8sT0FBTyxHQUFFLFdBQVcsSUFBSSxFQUFFLFFBQVEsS0FBSyxJQUFJO0FBQUEsRUFDcEQsQ0FBQztBQUNMOzs7QUMzRU8sSUFBTSxXQUFXLENBQ3RCLE9BQ0EsVUFDQSxPQUNBLE9BQ0EsV0FDRztBQVlILFFBQU0sT0FBTyxDQUFDLFNBQVM7QUFDckIsVUFBTSxRQUFPLEFBQUcsVUFBVSxJQUFJO0FBQzlCLFVBQUssS0FBSztBQUNWLFVBQUssS0FBSyxRQUFTLE9BQUssU0FBUztBQUNqQyxXQUFPLEFBQUcsYUFBSyxFQUFFLFNBQVMsQ0FBQyxNQUFLLElBQUksTUFBSyxFQUFFLENBQUMsRUFBRSxLQUFJO0FBQUEsRUFDcEQ7QUFFQSxRQUFNLFVBQVUsZUFBZSxPQUFPLFNBQVMsUUFBUTtBQUN2RCxVQUFRLElBQUksRUFBRSxRQUFRLENBQUM7QUFFdkIsUUFBTSxhQUFZLEFBQUcsaUJBQVMsRUFBRSxPQUFPO0FBQ3ZDLFVBQVEsSUFBSSxFQUFFLHNCQUFVLENBQUM7QUFFekIsUUFBTSxRQUFPLEtBQUssVUFBUztBQUMzQixVQUFRLElBQUksS0FBSTtBQUVoQixNQUFJLEtBQUs7QUFDVCxNQUFJLEtBQUssQ0FBQztBQUNWLFFBQUssS0FBSyxDQUFDLE1BQU07QUFDZixRQUFJLEVBQUUsSUFBSTtBQUFJLFdBQUssRUFBRTtBQUNyQixRQUFJLEVBQUUsSUFBSTtBQUFJLFdBQUssRUFBRTtBQUFBLEVBQ3ZCLENBQUM7QUFFRCxRQUFNLE1BQU0sQUFDVCxnQkFBTyxXQUFXLEVBQ2xCLE9BQU8sS0FBSyxFQUNaLEtBQUssVUFBVSxNQUFNLEVBQ3JCLEtBQUssU0FBUyxLQUFLO0FBRXRCLFFBQU0sSUFBSSxJQUNQLE9BQU8sR0FBRyxFQUNWLEtBQUssZUFBZSxZQUFZLEVBQ2hDLEtBQUssYUFBYSxFQUFFLEVBQ3BCLEtBQUssYUFBYSxhQUFhLE1BQUssS0FBSyxLQUFLLE1BQUssS0FBSyxLQUFLO0FBRWhFLFFBQU0sUUFBTyxFQUNWLE9BQU8sR0FBRyxFQUNWLEtBQUssUUFBUSxNQUFNLEVBQ25CLEtBQUssVUFBVSxNQUFNLEVBQ3JCLEtBQUssa0JBQWtCLEdBQUcsRUFDMUIsS0FBSyxnQkFBZ0IsR0FBRyxFQUN4QixVQUFVLE1BQU0sRUFDaEIsS0FBSyxNQUFLLE1BQU0sQ0FBQyxFQUNqQixLQUFLLE1BQU0sRUFDWCxLQUNDLEtBQ0EsQUFDRyxlQUFlLEVBQ2YsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQ1osRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQ2pCO0FBRUYsUUFBTSxPQUFPLEVBQ1YsT0FBTyxHQUFHLEVBQ1YsS0FBSyxtQkFBbUIsT0FBTyxFQUMvQixLQUFLLGdCQUFnQixFQUFFLEVBQ3ZCLFVBQVUsR0FBRyxFQUNiLEtBQUssTUFBSyxZQUFZLENBQUMsRUFDdkIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLEVBQUUsS0FBSyxFQUFFLElBQUk7QUFFdEQsT0FDRyxPQUFPLFFBQVEsRUFDZixLQUFLLFFBQVEsQ0FBQyxNQUFPLEVBQUUsV0FBVyxTQUFTLE1BQU8sRUFDbEQsS0FBSyxLQUFLLEVBQUU7QUFFZixPQUFLLEtBQUssY0FBYyxDQUFDLE1BQU07QUFDN0IsWUFBUSxJQUFJLENBQUM7QUFDYixXQUFPLEVBQUUsS0FBSyxLQUFLO0FBQUEsRUFDckIsQ0FBQztBQUVELFFBQU0sWUFBWSxDQUFDLE9BQW1CLFNBQWlCO0FBQ3JELGlCQUFhLE1BQU0sS0FBSztBQUN4QixVQUFNLE1BQU07QUFBQSxFQUNkO0FBQ0EsT0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFtQixNQUFNO0FBQ3pDLFlBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztBQUNqQixjQUFVLE9BQU8sRUFBRSxLQUFLLEtBQUssSUFBSTtBQUFBLEVBQ25DLENBQUM7QUFFRCxPQUNHLE9BQU8sTUFBTSxFQUNiLEtBQUssTUFBTSxRQUFRLEVBQ25CLEtBQUssS0FBSyxDQUFDLE1BQU8sRUFBRSxXQUFXLEtBQUssQ0FBRSxFQUN0QyxLQUFLLGVBQWUsQ0FBQyxNQUFPLEVBQUUsV0FBVyxRQUFRLE9BQVEsRUFDekQsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEtBQUssSUFBSSxFQUM1QixNQUFNLElBQUksRUFDVixNQUFNLEVBQ04sS0FBSyxVQUFVLE9BQU87QUFFekIsa0JBQWdCLEVBQUUseUJBQWE7QUFDN0IsUUFBSSxLQUFLLGFBQWEsVUFBUztBQUFBLEVBQ2pDO0FBQ0EsTUFBSSxLQUNGLEFBQ0csY0FBSyxFQUNMLE9BQU87QUFBQSxJQUNOLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFDTCxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ2hCLENBQUMsRUFDQSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEIsR0FBRyxRQUFRLE1BQU0sQ0FDdEI7QUFDRjs7O0FDeEhPLElBQU0sVUFBVSxDQUNyQixPQUNBLFVBQ0EsT0FDQSxPQUNBLFdBQ0c7QUFDSCxRQUFNLFVBQVUsZUFBZSxPQUFPLFNBQVMsUUFBUTtBQUN2RCxVQUFRLElBQUksRUFBRSxRQUFRLENBQUM7QUFFdkIsUUFBTSxhQUFZLEFBQUcsaUJBQVMsRUFBRSxPQUFPO0FBQ3ZDLFVBQVEsSUFBSSxFQUFFLHNCQUFVLENBQUM7QUFFekIsUUFBTSxRQUFPLEFBQ1YsZ0JBQVEsRUFDUixLQUFRLGNBQWEsRUFDckIsS0FBSyxDQUFDLE9BQU8sTUFBTSxDQUFDLEVBQ3BCLFFBQVEsQ0FBQyxFQUNULE1BQU0sSUFBSSxFQUNULFdBQVUsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUcsTUFBTSxFQUFFLFNBQVMsR0FBRSxNQUFNLENBQ25FO0FBSUYsUUFBTSxNQUFNLEFBQ1QsZ0JBQU8sV0FBVyxFQUNsQixPQUFPLEtBQUssRUFDWixLQUFLLFVBQVUsTUFBTSxFQUNyQixLQUFLLFNBQVMsS0FBSyxFQUNuQixNQUFNLFFBQVEsaUJBQWlCO0FBRWxDLFFBQU0sT0FBTyxJQUNWLFVBQVUsR0FBRyxFQUNiLEtBQUssTUFBSyxPQUFPLENBQUMsRUFDbEIsS0FBSyxHQUFHLEVBQ1IsS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUs7QUFFeEQsT0FBSyxLQUFLLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBVzFDLFFBQU0sU0FBUSxBQUFHLFFBQWdCLGtCQUFnQjtBQUVqRCxPQUNHLE9BQU8sTUFBTSxFQUViLEtBQUssUUFBUSxDQUFDLE1BQU07QUFDbkIsV0FBTyxFQUFFLFFBQVE7QUFBRyxVQUFJLEVBQUU7QUFDMUIsV0FBTyxPQUFNLEVBQUUsS0FBSyxFQUFFO0FBQUEsRUFDeEIsQ0FBQyxFQUNBLEtBQUssZ0JBQWdCLEdBQUcsRUFDeEIsS0FBSyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQ2hDLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtBQUVwQyxPQUNHLE9BQU8sVUFBVSxFQUVqQixPQUFPLEtBQUs7QUFzQmYsUUFBTSxZQUFZLENBQUMsT0FBbUIsU0FBaUI7QUFDckQsaUJBQWEsTUFBTSxLQUFLO0FBQ3hCLFVBQU0sTUFBTTtBQUFBLEVBQ2Q7QUFDQSxPQUFLLEdBQUcsU0FBUyxDQUFDLE9BQW1CLE1BQU07QUFDekMsWUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ2pCLGNBQVUsT0FBTyxFQUFFLEtBQUssSUFBSTtBQUFBLEVBQzlCLENBQUM7QUFFRCxrQkFBZ0IsRUFBRSx5QkFBYTtBQUM3QixRQUFJLEtBQUssYUFBYSxVQUFTO0FBQUEsRUFDakM7QUFDQSxNQUFJLEtBQ0YsQUFDRyxjQUFLLEVBQ0wsT0FBTztBQUFBLElBQ04sQ0FBQyxHQUFHLENBQUM7QUFBQSxJQUNMLENBQUMsT0FBTyxNQUFNO0FBQUEsRUFDaEIsQ0FBQyxFQUNBLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNwQixHQUFHLFFBQVEsTUFBTSxDQUN0QjtBQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dCVHVDOEIsSUFBRSxNQUFBOzs7Ozs7OzRDQUFQLElBQUU7Ozs7QUFBakIsYUFBZ0MsUUFBQSxRQUFBLE1BQUE7Ozs7OENBQVosS0FBRSxNQUFBO0FBQUEsaUJBQUEsR0FBQSxPQUFBO29FQUFQLEtBQUUsTUFBQTs7Ozs7Ozs7Ozs7OztpQkFIcEIsSUFBSSxNQUFBOzs7Ozs7O3FCQUVJLElBQU87O21DQUFaLFFBQUksS0FBQSxHQUFBOzs7Ozs7Ozs7O2dCQUZGLGFBQ047Ozs7OztVQUFvQixJQUFHLFFBQUE7QUFBQSw0QkFBQSxxQkFBQTs7O0FBRnpCLGFBT08sUUFBQSxNQUFBLE1BQUE7OztBQUxMLGFBSVMsTUFBQSxNQUFBOzs7OzRCQUpXLElBQUcsR0FBQTs7Ozs7Ozs7O2dEQUR0QixJQUFJLE1BQUE7QUFBQSxpQkFBQSxJQUFBLFFBQUE7O3VCQUVJLElBQU87O3FDQUFaLFFBQUksS0FBQSxHQUFBOzs7Ozs7Ozs7Ozs7OzBDQUFKOzs7OEJBRGdCLElBQUcsR0FBQTs7Ozs7Ozs7Ozs7Ozs7OzttQkFIcEIsSUFBUzs7aUNBQWQsUUFBSSxLQUFBLEdBQUE7Ozs7Ozs7Ozs7Ozs7O0FBRFIsYUFXTSxRQUFBLE1BQUEsTUFBQTs7Ozs7QUFFTixhQUF3QixRQUFBLE1BQUEsTUFBQTs7OztxQkFaZixLQUFTOzttQ0FBZCxRQUFJLEtBQUEsR0FBQTs7Ozs7Ozs7Ozs7Ozt3Q0FBSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FEaElTLFVBQWU7VUFFbEIsV0FBVztVQUNYLE9BQU8sYUFBYTtVQUNwQixVQUFVLGFBQWEsV0FBVyxXQUFXO1FBRS9DLFdBQVcsWUFBVztRQUV0QixZQUFTOztNQUVYLE1BQU07TUFDTixTQUFTO01BQ1QsS0FBSzs7O01BR0wsTUFBTTtNQUNOLFNBQVM7TUFDVCxLQUFLOzs7TUFHTCxNQUFNO01BQ04sU0FBUztNQUNULEtBQUs7OztNQUdMLE1BQU07TUFDTixTQUFTO01BQ1QsS0FBSzs7O1NBSUYsT0FBTyxVQUFNLENBQ2xCLEtBQUssTUFBTSxPQUFPLGFBQWEsR0FBRyxHQUNsQyxLQUFLLE1BQU0sT0FBTyxjQUFjLEdBQUcsQ0FBQTtTQUc5QixJQUFJLE1BQU0sUUFBSTtJQUNuQixhQUFhLE9BQU8sSUFBSTtJQUN4QixhQUFhLE9BQU8sTUFBTTtJQUMxQixhQUFhLE9BQU8sTUFBTTs7U0FHckIsc0JBQXNCLHVCQUF1Qix1QkFBbUI7SUFDckUsa0JBQWtCLElBQUksSUFBSTtJQUMxQixrQkFBa0IsTUFBTSxJQUFJO0lBQzVCLGtCQUFrQixNQUFNLEVBQUU7O1FBR3RCLFNBQU07SUFDVixRQUFNO01BQ0osTUFBSTtRQUNGLEtBQUs7UUFDTCxlQUFlLG9CQUFvQixFQUFFOztNQUV2QyxRQUFNO1FBQ0osS0FBSztRQUNMLGVBQWUsb0JBQW9CLG9CQUFvQjs7O0lBRzNELFNBQU87TUFDTCxNQUFJO1FBQ0YsS0FBSztRQUNMLGVBQWUsb0JBQW9CLElBQUk7O01BRXpDLFFBQU07UUFDSixLQUFLO1FBQ0wsZUFBZSxvQkFBb0IscUJBQXFCOzs7SUFHNUQsT0FBSztNQUNILE1BQUk7UUFDRixLQUFLO1FBQ0wsZUFBZSxvQkFBb0IsSUFBSTs7TUFFekMsUUFBTTtRQUNKLEtBQUs7UUFDTCxlQUFlLG9CQUFvQixtQkFBbUI7Ozs7UUFjdEQsUUFBSztJQUdULHdCQUF3QjtJQUN4QixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsVUFBVTtJQUNWLFlBQVk7SUFDWixRQUFRO0lBQ1IsZUFBZTs7Z0JBR0gsT0FBYTtTQUNwQixTQUFTLGNBQWMsV0FBVyxHQUFBO0FBQ3JDOztRQUNFLE1BQUEsU0FBUyxjQUFjLFdBQVcsT0FBQyxRQUFBLE9BQUEsa0JBQUEsR0FBRSxNQUFLOztBQUV4QyxnQkFBTSxPQUFJLEdBQUssTUFBTTtpQkFDZDtBQUNQLHNDQUFLLE1BQUs7O1NBRVg7O0FBRUgsZUFBUyxjQUFjLFdBQVcsRUFBRSxNQUFLOztBQUV2QyxjQUFNLE9BQUksR0FBSyxNQUFNO2VBQ2Q7QUFDUCxvQ0FBSyxNQUFLOzs7Ozs7Ozs7Ozs7OztBQXRDaEI7QUFBRyxpQkFBTTtVQUNQLE9BQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxHQUFHLEtBQUssVUFBVSxHQUFHO1VBQ3hEO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7Ozs7QUFxQ0Y7QUFBRyxhQUFLLFVBQVUsR0FBRyxHQUFjOzs7Ozs7Ozs7Ozs7OztBRHJJOUIsc0JBQXNCLEdBQW1CO0FBQzlDLFFBQU0sVUFBbUIsRUFBRSxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRTtBQUNoRCxRQUFNLFVBQVUsQ0FBQztBQUVqQixJQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxNQUFNO0FBQzdCLFlBQVEsTUFBTSxLQUFLLEVBQUUsSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQ3hDLFlBQVEsUUFBUTtBQUFBLEVBQ2xCLENBQUM7QUFDRCxJQUFFLFlBQVksQ0FBQyxHQUFHLElBQUcsR0FBRyxNQUFNO0FBQzVCLFlBQVEsTUFBTSxLQUFLO0FBQUEsTUFDakIsUUFBUSxRQUFRO0FBQUEsTUFDaEIsUUFBUSxRQUFRO0FBQUEsSUFDbEIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUVELFNBQU87QUFDVDtBQXdFTyxvQkFBb0IsR0FBVSxXQUFrQztBQUNyRSxRQUFNLFFBQWtCLENBQUMsU0FBUztBQUNsQyxRQUFNLFVBQXlCLENBQUM7QUFFaEMsTUFBSSxJQUFJO0FBQ1IsU0FBTyxNQUFNLFVBQVUsSUFBSSxLQUFNO0FBQy9CO0FBRUEsVUFBTSxXQUFXLE1BQU0sTUFBTTtBQUM3QixVQUFNLGFBQWE7QUFBQSxNQUNqQixPQUFPLGlCQUFpQixHQUFHLFFBQVE7QUFBQSxNQUNuQyxNQUFNLGdCQUFnQixHQUFHLFFBQVE7QUFBQSxJQUNuQztBQUNBLFlBQVEsSUFBSSxFQUFFLFVBQVUsV0FBVyxDQUFDO0FBRXBDLFVBQU0sT0FBb0I7QUFBQSxNQUN4QixNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixPQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksV0FBVyxNQUFNLFFBQVE7QUFDM0IsV0FBSyxRQUFRLFdBQVc7QUFDeEIsWUFBTSxLQUFLLEdBQUcsV0FBVyxLQUFLO0FBQUEsSUFDaEM7QUFDQSxRQUFJLFdBQVcsS0FBSyxRQUFRO0FBQzFCLFdBQUssT0FBTyxXQUFXO0FBQUEsSUFDekI7QUFDQSxZQUFRLEtBQUssSUFBSTtBQUFBLEVBQ25CO0FBQ0EsUUFBTSxXQUFXLFFBQVEsS0FBSyxDQUFDLElBQUcsTUFBTSxHQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ2xFLFVBQVEsUUFBUSxDQUFDLFNBQVUsS0FBSyxTQUFTLFdBQVcsS0FBSyxLQUFNO0FBRS9ELFNBQU87QUFDVDtBQUVPLHdCQUF3QixHQUFVLFdBQW1CO0FBQzFELFFBQU0sUUFBUSxFQUFFLE1BQU07QUFDdEIsUUFBTSxZQUFZLE1BQU07QUFDeEIsUUFBTSxTQUFTLENBQUM7QUFDaEIsUUFBTSxRQUFRLENBQUMsTUFBTSxPQUFNO0FBQ3pCLFdBQU8sUUFBUSxZQUFZO0FBQUEsRUFDN0IsQ0FBQztBQUVELFFBQU0sUUFBa0IsQ0FBQyxTQUFTO0FBQ2xDLFFBQU0sVUFBeUIsQ0FBQztBQUVoQyxNQUFJLFFBQVE7QUFDWixNQUFJLElBQUk7QUFDUixTQUFPLE1BQU0sVUFBVSxJQUFJLEtBQU07QUFDL0I7QUFFQSxVQUFNLFdBQVcsTUFBTSxNQUFNO0FBQzdCLFVBQU0sT0FBTyxpQkFBaUIsR0FBRyxRQUFRO0FBRXpDLFFBQUksS0FBSyxRQUFRO0FBQ2YsWUFBTSxRQUFRLEdBQUcsSUFBSTtBQUNyQixXQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ3JCLGNBQU0sV0FBVyxZQUFZLE1BQU0sUUFBUSxJQUFJO0FBQy9DLFlBQ0UsQ0FBQyxRQUFRLEtBQ1AsQ0FBQyxZQUNDLFFBQVEsU0FBUyxZQUFZLFFBQVEsYUFBYSxRQUN0RCxHQUNBO0FBQ0Esa0JBQVEsS0FBSztBQUFBLFlBQ1gsSUFBSSxPQUFPO0FBQUEsWUFDWCxNQUFNO0FBQUEsWUFDTjtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGLENBQUM7QUFDRDtBQUFBLElBQ0YsT0FBTztBQUNMLGNBQVEsS0FBSztBQUFBLFFBQ1gsSUFBSSxPQUFPO0FBQUEsUUFDWCxNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVjtBQUFBLE1BQ0YsQ0FBQztBQUNELGNBQVE7QUFDUixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDQSxVQUFRLEtBQUs7QUFBQSxJQUNYLElBQUk7QUFBQSxJQUNKLE1BQU07QUFBQSxJQUNOLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxFQUNULENBQUM7QUFFRCxRQUFNLFdBQVcsUUFBUSxLQUFLLENBQUMsSUFBRyxNQUFNLEdBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDbEUsVUFBUSxRQUFRLENBQUMsU0FBVSxLQUFLLFNBQVMsV0FBVyxLQUFLLEtBQU07QUFFL0QsVUFBUSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3RCLFNBQU87QUFDVDtBQUVPLElBQU0sV0FBVyxBQUNyQixpQkFBUyxFQUNULEdBQUcsU0FBVSxHQUFnQjtBQUM1QixVQUFRLElBQUksRUFBRSxFQUFFLENBQUM7QUFDakIsU0FBTyxFQUFFO0FBQ1gsQ0FBQyxFQUNBLFNBQVMsU0FBVSxHQUFnQjtBQUNsQyxTQUFPLEVBQUU7QUFDWCxDQUFDO0FBQ0ksSUFBTSxZQUFOLGNBQXVCLHdCQUFNO0FBQUEsRUFJbEMsWUFBWSxRQUFrQjtBQUM1QixVQUFNLEdBQUc7QUFDVCxTQUFLLFNBQVM7QUFDZCxTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxTQUFTO0FBQ1AsUUFBSSx5QkFDRixxRUFDRjtBQUNBLFVBQU0sRUFBRSxjQUFjO0FBQ3RCLGNBQVUsTUFBTTtBQUVoQixRQUFJLGdCQUFRO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixPQUFPO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLFVBQVU7QUFDUixTQUFLLFVBQVUsTUFBTTtBQUFBLEVBQ3ZCO0FBQ0Y7OztBOVMvTEEsSUFBcUIsV0FBckIsY0FBc0MseUJBQU87QUFBQSxFQUE3QztBQUFBO0FBR0UsbUJBQXNDLENBQUM7QUFLdkMsNEJBQTZCO0FBQzdCLHdCQUF5QjtBQWtQekIsd0JBQWUsWUFDZCxLQUFLLFdBQVcsT0FBTyxPQUN0QixDQUFDLEdBQ0Qsa0JBQ0EsTUFBTSxLQUFLLFNBQVMsQ0FDdEI7QUFFQSx3QkFBZSxZQUFZLE1BQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBO0FBQUEsRUFoUDVELGdDQUFnQztBQUM5QixTQUFLLG1CQUFtQixJQUFJLFVBQVUsR0FDcEMsYUFDQSxZQUFZO0FBQ1YsVUFBSSxLQUFLLFNBQVM7QUFBcUIsY0FBTSxhQUFhLElBQUk7QUFBQSxXQUN6RDtBQUNILGNBQU0sYUFBYSxLQUFLLGtCQUFrQixXQUFXO0FBQ3JELFlBQUk7QUFBWSxnQkFBTSxXQUFXLEtBQUs7QUFBQSxNQUN4QztBQUFBLElBQ0YsQ0FDRjtBQUNBLFNBQUssY0FBYyxLQUFLLGdCQUFnQjtBQUFBLEVBQzFDO0FBQUEsRUFFQSw0QkFBNEI7QUFDMUIsU0FBSyxlQUFlLElBQUksVUFBVSxHQUFHLGlCQUFpQixZQUFZO0FBQ2hFLFVBQUksS0FBSyxTQUFTO0FBQVMsY0FBTSxVQUFVLElBQUk7QUFBQSxJQUNqRCxDQUFDO0FBQ0QsU0FBSyxjQUFjLEtBQUssWUFBWTtBQUFBLEVBQ3RDO0FBQUEsRUFFQSxNQUFNLFNBQXdCO0FBQzVCLFlBQVEsSUFBSSw0QkFBNEI7QUFFeEMsVUFBTSxLQUFLLGFBQWE7QUFDeEIsU0FBSyxjQUFjLElBQUksYUFBYSxJQUFJLENBQUM7QUFFekMsU0FBSyxLQUFLLElBQUksU0FBUyxJQUFJO0FBRTNCLFVBQU0sRUFBRSxhQUFhO0FBQ3JCLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsUUFDRTtBQUVKLFFBQUk7QUFBZ0IsV0FBSyxzQkFBc0IsSUFBSSxlQUFlLElBQUksQ0FBQztBQUN2RSxRQUFJO0FBQ0YsV0FBSyxzQkFBc0IsSUFBSSxrQkFBa0IsSUFBSSxDQUFDO0FBSXhELFFBQUksU0FBUyxxQkFBcUIsV0FBVztBQUFHLGVBQVMsdUJBQXVCLFVBQVUsU0FBUyxTQUFTO0FBQzVHLFFBQUksT0FBTyxTQUFTLFlBQVk7QUFBVyxlQUFTLFVBQVUsU0FBUyxVQUFVLFFBQVE7QUFFekYsU0FBSyxRQUFRO0FBQUEsTUFDWDtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1AsTUFBTTtBQUFBLFFBQ04sYUFBYTtBQUFBLFFBQ2IsWUFBWTtBQUFBLE1BQ2Q7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUCxNQUFNO0FBQUEsUUFDTixhQUFhO0FBQUEsUUFDYixZQUFZO0FBQUEsTUFDZDtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxRQUNQLE1BQU07QUFBQSxRQUNOLGFBQWE7QUFBQSxRQUNiLFlBQVk7QUFBQSxNQUNkO0FBQUEsSUFDRjtBQUVBLGVBQVcsRUFBRSxhQUFhLGlCQUFVLEtBQUssT0FBTztBQUM5QyxXQUFLLGFBQWEsT0FBTSxDQUFDLFNBQVMsSUFBSSxZQUFZLE1BQU0sSUFBSSxDQUFDO0FBQUEsSUFDL0Q7QUFFQSxtQ0FBUSxXQUFXLGFBQWE7QUFDaEMsbUNBQVEsWUFBWSxjQUFjO0FBRWxDLFVBQU0sYUFBYSxJQUFJO0FBQ3ZCLFNBQUssUUFBUSxNQUFNLFdBQVcsSUFBSTtBQUNsQyxTQUFLLFVBQVUsYUFBYSxJQUFJO0FBRWhDLFFBQUksVUFBVSxjQUFjLFlBQVk7QUFsSjVDO0FBbUpNLFlBQU0sVUFBVSxJQUFJLE1BQU0saUJBQWlCLEVBQUU7QUFDN0MsVUFBSSxZQUFLLFVBQUwsbUJBQVksUUFBUSxVQUFTLFNBQVM7QUFDeEMsY0FBTSxLQUFLLEdBQUk7QUFDZixhQUFLLFFBQVEsTUFBTSxXQUFXLElBQUk7QUFDbEMsYUFBSyxVQUFVLGFBQWEsSUFBSTtBQUFBLE1BQ2xDO0FBRUEsaUJBQVcsRUFBRSxZQUFZLGFBQU0saUJBQWlCLEtBQUs7QUFDbkQsWUFBSTtBQUFZLGdCQUFNLFNBQVMsT0FBTSxXQUFXO0FBRWxELFVBQUk7QUFBUyxjQUFNLFVBQVUsSUFBSTtBQUNqQyxXQUFLLDhCQUE4QjtBQUNuQyxXQUFLLDBCQUEwQjtBQUkvQixZQUFNLHdCQUNKLElBQUksU0FBUyxTQUFTO0FBQ3hCLFlBQU0sT0FBTywrREFBdUI7QUFFcEMsVUFBSSxPQUFPLFNBQVMsWUFBWTtBQUM5Qiw4QkFBc0IsV0FBVyxZQUFZO0FBQzNDLGdCQUFNLEtBQUs7QUFDWCxjQUFJLEtBQUssU0FBUyxtQkFBbUI7QUFDbkMsa0JBQU0sYUFBYSxJQUFJO0FBQ3ZCLGtCQUFNLGFBQWEsS0FBSyxrQkFBa0IsV0FBVztBQUNyRCxnQkFBSTtBQUFZLG9CQUFNLFdBQVcsS0FBSztBQUFBLFVBQ3hDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJLFVBQVUsaUJBQWlCLENBQUMsU0FBUztBQUN2QyxZQUFJLGdCQUFnQjtBQUVsQixlQUFLLEtBQUssWUFBWSxTQUFTLElBQUk7QUFBQSxNQUN2QyxDQUFDO0FBQUEsSUFDSCxDQUFDO0FBRUQsZUFBVyxFQUFFLGFBQU0sT0FBTyxpQkFBaUIsS0FBSyxPQUFPO0FBQ3JELFdBQUssV0FBVztBQUFBLFFBQ2QsSUFBSSxRQUFRO0FBQUEsUUFDWixNQUFNLFFBQVE7QUFBQSxRQUVkLGVBQWUsT0FBTyxhQUFzQjtBQUMxQyxjQUFJO0FBQVUsbUJBQU8sSUFBSSxVQUFVLGdCQUFnQixLQUFJLEVBQUUsV0FBVztBQUNwRSxnQkFBTSxTQUFTLE9BQU0sV0FBVztBQUFBLFFBQ2xDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLFNBQUssV0FBVztBQUFBLE1BQ2QsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sVUFBVSxNQUFNLElBQUksVUFBUyxJQUFJLEVBQUUsS0FBSztBQUFBLElBQzFDLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsTUFBTSxJQUFJLDJCQUEyQixJQUFJLEVBQUUsS0FBSztBQUFBLElBQzVELENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsWUFBWSxNQUFNLGFBQWEsSUFBSTtBQUFBLElBQy9DLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsWUFBWTtBQUNwQixpQkFBUyxzQkFBc0IsQ0FBQyxTQUFTO0FBQ3pDLGNBQU0sS0FBSyxhQUFhO0FBQ3hCLGNBQU0sVUFBVSxJQUFJO0FBQUEsTUFDdEI7QUFBQSxJQUNGLENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsWUFBWSxNQUFNLGNBQWMsSUFBSTtBQUFBLElBQ2hELENBQUM7QUFFRCxTQUFLLFdBQVc7QUFBQSxNQUNkLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFVBQVUsWUFBWSxNQUFNLG1CQUFtQixJQUFJO0FBQUEsSUFDckQsQ0FBQztBQUVELFNBQUssV0FBVztBQUFBLE1BQ2QsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sVUFBVSxZQUFZLE1BQU0sZUFBZSxJQUFJO0FBQUEsSUFDakQsQ0FBQztBQUVELFNBQUssV0FBVztBQUFBLE1BQ2QsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sVUFBVSxZQUFZLE1BQU0sZ0JBQWdCLElBQUk7QUFBQSxJQUNsRCxDQUFDO0FBRUQsS0FBQyxNQUFNLFFBQVEsUUFBUSxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQW9CO0FBQzFELFdBQUssV0FBVztBQUFBLFFBQ2QsSUFBSSxpQkFBaUI7QUFBQSxRQUNyQixNQUFNLGtCQUFrQjtBQUFBLFFBQ3hCLFVBQVUsWUFBWSxNQUFNLGVBQWUsTUFBTSxHQUFHO0FBQUEsTUFDdEQsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELGNBQVUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFrQjtBQUM5QyxXQUFLLFdBQVc7QUFBQSxRQUNkLElBQUkseUJBQXlCO0FBQUEsUUFDN0IsTUFBTSxpQkFBaUI7QUFBQSxRQUN2QixVQUFVLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSztBQUFBLE1BQ2hELENBQUM7QUFBQSxJQUNILENBQUM7QUFFRCxTQUFLLGNBQ0gsZUFBZSxJQUFJLEdBQ25CLDZCQUNBLE1BQU0sSUFBSSxVQUFTLElBQUksRUFBRSxLQUFLLENBQ2hDO0FBRUEsU0FBSyxtQ0FDSCxlQUNBLGVBQWUsSUFBSSxDQUNyQjtBQUVBLFVBQU0sY0FBYyxVQUFVLEdBQUc7QUFDakMsUUFBSSxhQUFhO0FBQ2YsV0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxhQUFhO0FBQ3hELGtCQUFZLGNBQWMsS0FBSyxPQUFPO0FBQUEsSUFDeEM7QUFFQSxTQUFLLE1BQU0sSUFBSSxNQUFNLElBQUk7QUFFekIsSUFBQyxRQUFPLFlBQVksS0FBSyxRQUN2QixLQUFLLFNBQVMsTUFBTSxPQUFPLE9BQU8sU0FBUztBQUFBLEVBQy9DO0FBQUEsRUFFQSxrQkFBa0IsT0FBNkI7QUFDN0MsVUFBTSxFQUFFLGdCQUFnQixLQUFLLE1BQU0sS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLEtBQUk7QUFDcEUsVUFBTSxTQUFTLElBQUksVUFBVSxnQkFBZ0IsS0FBSTtBQUNqRCxRQUFJLFVBQVUsT0FBTyxVQUFVLEdBQUc7QUFDaEMsWUFBTSxFQUFFLFNBQVMsT0FBTztBQUN4QixVQUFJLGdCQUFnQjtBQUFhLGVBQU87QUFBQSxJQUMxQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFXQSxXQUFpQjtBQUNmLFlBQVEsSUFBSSxXQUFXO0FBQ3ZCLFNBQUssTUFBTSxRQUFRLE9BQU8sU0FBUztBQUNqQyxVQUFJLFVBQVUsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTO0FBQ3pELGFBQUssT0FBTztBQUFBLE1BQ2QsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFNBQUssUUFBUSxRQUFRLENBQUMsVUFBVSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ2pELFFBQUksS0FBSyxTQUFTO0FBQ2hCLFlBQU0sY0FBYyxVQUFVLEdBQUc7QUFDakMsVUFBSSxhQUFhO0FBRWYsb0JBQVksWUFBWSxLQUFLLE9BQU87QUFBQSxNQUN0QztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvd2VicGFjay9ib290c3RyYXAiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jbGFzc25hbWVzL2RlZHVwZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtZnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1mcm9tLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctYXQuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2ljb24uanMiLCAibm9kZV9tb2R1bGVzL2ZlYXRoZXItaWNvbnMvZGlzdC93ZWJwYWNrOi9mZWF0aGVyL3NyYy9pY29ucy5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9mZWF0aGVyLWljb25zL2Rpc3Qvd2VicGFjazovZmVhdGhlci9zcmMvcmVwbGFjZS5qcyIsICJub2RlX21vZHVsZXMvZmVhdGhlci1pY29ucy9kaXN0L3dlYnBhY2s6L2ZlYXRoZXIvc3JjL3RvLXN2Zy5qcyIsICJub2RlX21vZHVsZXMvbG9nbGV2ZWwvbGliL2xvZ2xldmVsLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5L3NyYy91dGlscy5qcyIsICJub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXIuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3Rha2UuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2Vycm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaW5kaWNlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvYXR0cmlidXRlcy9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvb2JsaXRlcmF0b3IvY2hhaW4uanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2l0ZXJhdGlvbi9lZGdlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL25laWdoYm9ycy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvaXRlcmF0aW9uL2FkamFjZW5jeS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvc2VyaWFsaXphdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS9zcmMvZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3kvc3JjL2NsYXNzZXMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdXRpbHMvaXMtZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL3N1cHBvcnQuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2ZvcmVhY2guanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy90eXBlZC1hcnJheXMuanMiLCAibm9kZV9tb2R1bGVzL21uZW1vbmlzdC91dGlscy9pdGVyYWJsZXMuanMiLCAibm9kZV9tb2R1bGVzL29ibGl0ZXJhdG9yL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9tbmVtb25pc3QvZml4ZWQtZGVxdWUuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaG9sb2d5LXRyYXZlcnNhbC9iZnMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBob2xvZ3ktdHJhdmVyc2FsL2Rmcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhvbG9neS10cmF2ZXJzYWwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2VuZ2xpc2guanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL2Zvcm1hdHRlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvaW52YWxpZC5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL3pvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9zeXN0ZW1ab25lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvem9uZXMvSUFOQVpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9maXhlZE9mZnNldFpvbmUuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy96b25lcy9pbnZhbGlkWm9uZS5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvem9uZVV0aWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9zZXR0aW5ncy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2ltcGwvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9yZWdleFBhcnNlci5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2R1cmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW50ZXJ2YWwuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbmZvLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWZmLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9kaWdpdHMuanMiLCAibm9kZV9tb2R1bGVzL2x1eG9uL3NyYy9pbXBsL3Rva2VuUGFyc2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvaW1wbC9jb252ZXJzaW9ucy5qcyIsICJub2RlX21vZHVsZXMvbHV4b24vc3JjL2RhdGV0aW1lLmpzIiwgIm5vZGVfbW9kdWxlcy9sdXhvbi9zcmMvbHV4b24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCAic3JjL21haW4udHMiLCAibm9kZV9tb2R1bGVzL2p1Z2dsLWFwaS9kaXN0L2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvb2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzLmpzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL1ZpZXdzL01hdHJpeFZpZXcudHMiLCAic3JjL0RlYnVnZ2VyLnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUvaW50ZXJuYWwvaW5kZXgubWpzIiwgInNyYy9yZWZyZXNoSW5kZXgudHMiLCAic3JjL1V0aWxzL2dyYXBoVXRpbHMudHMiLCAic3JjL1V0aWxzL0hpZXJVdGlscy50cyIsICJzcmMvVXRpbHMvT2JzaWRpYW5VdGlscy50cyIsICJzcmMvVXRpbHMvZ2VuZXJhbFV0aWxzLnRzIiwgInNyYy9SZWxhdGlvbnMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGF2aWV3Tm90ZXMudHMiLCAic3JjL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvRGF0ZU5vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RlbmRyb25Ob3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9Gb2xkZXJOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyYXJjaHlOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9KdWdnbExpbmtzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0xpbmtOb3Rlcy50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9SZWdleE5vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RhZ05vdGVzLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1RyYXZlcnNlTm90ZXMudHMiLCAic3JjL1ZpZXdzL1RyYWlsVmlldy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvTmV4dFByZXYuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvVHJhaWxHcmlkLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9UcmFpbEdyaWQuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1RyYWlsUGF0aC5zdmVsdGUiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0p1Z2dsLnRzIiwgInNyYy9Db21tYW5kcy9DcmVhdGVJbmRleC50cyIsICJzcmMvQ29tcG9uZW50cy9KdWdnbEJ1dHRvbi5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL0p1Z2dsQnV0dG9uLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvSnVnZ2xEZXB0aC5zdmVsdGUiLCAic3JjL3NyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeEJ1dHRvbnMuc3ZlbHRlIiwgInNyYy9zcmMvQ29tcG9uZW50cy9NYXRyaXguc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL01hdHJpeC5zdmVsdGUiLCAic3JjL0FQSS50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9IaWVyTm90ZU1vZGFsLnRzIiwgInNyYy9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJhcmNoeU5vdGVNYW5pcHVsYXRvci50cyIsICJzcmMvQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9Nb2RpZnlIaWVySXRlbU1vZGFsLnRzIiwgInNyYy9zcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9Nb2RpZnlITkl0ZW1Db21wLnN2ZWx0ZSIsICJzcmMvQ29kZWJsb2Nrcy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvUmVuZGVyTWFya2Rvd24uc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1JlbmRlck1hcmtkb3duLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ0JUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9DQlRyZWUuc3ZlbHRlIiwgInNyYy9Db21tYW5kcy9qdW1wVG9GaXJzdERpci50cyIsICJzcmMvQ29tbWFuZHMvdGhyZWFkaW5nLnRzIiwgInNyYy9Db21tYW5kcy9Xcml0ZUJDcy50cyIsICJzcmMvRmllbGRTdWdnZXN0b3IudHMiLCAic3JjL1JlbGF0aW9uU3VnZ2VzdG9yLnRzIiwgInNyYy9TZXR0aW5ncy9CcmVhZGNydW1ic1NldHRpbmdUYWIudHMiLCAic3JjL0NvbXBvbmVudHMvS29GaS5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0NyZWF0ZUluZGV4U2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0NTVlNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9EYXRhdmlld05vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGF0ZU5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvRGVidWdnaW5nU2V0dGluZ3MudHMiLCAic3JjL1NldHRpbmdzL0RlbmRyb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvR2VuZXJhbFNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlOb3RlU2V0dGluZ3MudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1VzZXJIaWVyYXJjaGllcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvVXNlckhpZXJhcmNoaWVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFMaXN0VWwuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFQbHVzLnN2ZWx0ZSIsICJub2RlX21vZHVsZXMvc3ZlbHRlLWljb25zL2ZhL0ZhUmVnVHJhc2hBbHQuc3ZlbHRlIiwgInNyYy9TZXR0aW5ncy9IaWVyYXJjaHlTZXR0aW5ncy50cyIsICJzcmMvc3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGUiLCAic3JjL1NldHRpbmdzL0p1bXBUb05leHRTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvTWF0cml4Vmlld1NldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9Ob1N5c3RlbVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9SZWdleE5vdGVTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvUmVsYXRpb25TZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVGFnTm90ZVNldHRpbmdzLnRzIiwgInNyYy9TZXR0aW5ncy9UaHJlYWRpbmdTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVHJhaWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvVmlzTW9kYWxTZXR0aW5ncy50cyIsICJzcmMvU2V0dGluZ3MvV3JpdGVCQ3NTZXR0aW5ncy50cyIsICJzcmMvVmlld3MvRHVja3NWaWV3LnRzIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFJbmZvLnN2ZWx0ZSIsICJzcmMvc3JjL0NvbXBvbmVudHMvRHVja3Muc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL0R1Y2tzLnN2ZWx0ZSIsICJzcmMvVmlld3MvVHJlZVZpZXcudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1NpZGVUcmVlLnN2ZWx0ZSIsICJzcmMvQ29tcG9uZW50cy9TaWRlVHJlZS5zdmVsdGUiLCAibm9kZV9tb2R1bGVzL3N2ZWx0ZS1pY29ucy9mYS9GYUZpcmUuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9zdmVsdGUtaWNvbnMvZmEvRmFSZWdTbm93Zmxha2Uuc3ZlbHRlIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYXNjZW5kaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvYmlzZWN0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9udW1iZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9iaXNlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy90aWNrcy5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21heC5qcyIsICJub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3JhbmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kaXNwYXRjaC9zcmMvZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY3JlYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbWF0Y2hlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdENoaWxkcmVuLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2V4aXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2pvaW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vcmRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VtcHR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3dpbmRvdy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jbGFzc2VkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yYWlzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbG93ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5zZXJ0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9kYXR1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pdGVyYXRvci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NvdXJjZUV2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3BvaW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL25vZHJhZy5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvZGVmaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY3ViZWhlbGl4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9udW1iZXJBcnJheS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL29iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3ZhbHVlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcm91bmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy90cmFuc2Zvcm0vZGVjb21wb3NlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvem9vbS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2N1YmVoZWxpeC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3F1YW50aXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lb3V0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi9pbnRlcnJ1cHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW50ZXJwb2xhdGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vYXR0ci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZGVsYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZHVyYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlVmFyeWluZy5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vcmVtb3ZlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3RBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlVHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdGV4dC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2N1YmljLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vdHJhbnNpdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1icnVzaC9zcmMvYnJ1c2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXBhdGgvc3JjL3BhdGguanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9hZGQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9jb3Zlci5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9leHRlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvZmluZC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Jvb3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvdmlzaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy92aXNpdEFmdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMveC5qcyIsICJub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3kuanMiLCAibm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9xdWFkdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvamlnZ2xlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY29sbGlkZS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2xpbmsuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9sY2cuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9zaW11bGF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbWFueUJvZHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0RGVjaW1hbC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9leHBvbmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRHcm91cC5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXROdW1lcmFscy5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRTcGVjaWZpZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHJpbS5qcyIsICJub2RlX21vZHVsZXMvZDMtZm9ybWF0L3NyYy9mb3JtYXRQcmVmaXhBdXRvLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2Zvcm1hdFJvdW5kZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvZm9ybWF0VHlwZXMuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvaWRlbnRpdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvbG9jYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL2RlZmF1bHRMb2NhbGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uRml4ZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWZvcm1hdC9zcmMvcHJlY2lzaW9uUHJlZml4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1mb3JtYXQvc3JjL3ByZWNpc2lvblJvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2NsdXN0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2NvdW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQmVmb3JlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9lYWNoQWZ0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2ZpbmQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L3N1bS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvc29ydC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvcGF0aC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvYW5jZXN0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9kZXNjZW5kYW50cy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvbGVhdmVzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2hpZXJhcmNoeS9saW5rcy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9oaWVyYXJjaHkvaXRlcmF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvaGllcmFyY2h5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL2FjY2Vzc29ycy5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3JvdW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvZGljZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy9wYXJ0aXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvc3RyYXRpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL3NsaWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1oaWVyYXJjaHkvc3JjL3RyZWVtYXAvc3F1YXJpZnkuanMiLCAibm9kZV9tb2R1bGVzL2QzLWhpZXJhcmNoeS9zcmMvdHJlZW1hcC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaGllcmFyY2h5L3NyYy90cmVlbWFwL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2luaXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9vcmRpbmFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvYmFuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS9zcmMvY29udGludW91cy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2NhbGUvc3JjL3RpY2tGb3JtYXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlL3NyYy9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvY29sb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zY2FsZS1jaHJvbWF0aWMvc3JjL2NhdGVnb3JpY2FsL2NhdGVnb3J5MTAuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNjYWxlLWNocm9tYXRpYy9zcmMvc2VxdWVudGlhbC1tdWx0aS9yYWluYm93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9tYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJjLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9saW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9wb2ludC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2xpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9jdXJ2ZS9yYWRpYWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNoYXBlL3NyYy9saW5lUmFkaWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvbGluay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2hhcGUvc3JjL2N1cnZlL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zaGFwZS9zcmMvY3VydmUvYnVuZGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvem9vbS5qcyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVmlzTW9kYWwudHMiLCAic3JjL3NyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9BcmNEaWFncmFtLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9DaXJjbGVQYWNraW5nLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9FZGdlQnVuZGxpbmcudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL0ZvcmNlRGlyZWN0ZWRHLnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9JY2ljbGUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1JhZGlhbFRyZWUudHMiLCAic3JjL1Zpc3VhbGlzYXRpb25zL1N1bmJ1cnN0LnRzIiwgInNyYy9WaXN1YWxpc2F0aW9ucy9UaWR5VHJlZS50cyIsICJzcmMvVmlzdWFsaXNhdGlvbnMvVHJlZU1hcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZmVhdGhlclwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJmZWF0aGVyXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsICIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwgIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjbGFzc05hbWVzID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvLyBkb24ndCBpbmhlcml0IGZyb20gT2JqZWN0IHNvIHdlIGNhbiBza2lwIGhhc093blByb3BlcnR5IGNoZWNrIGxhdGVyXG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTUxODMyOC9jcmVhdGluZy1qcy1vYmplY3Qtd2l0aC1vYmplY3QtY3JlYXRlbnVsbCNhbnN3ZXItMjEwNzkyMzJcblx0XHRmdW5jdGlvbiBTdG9yYWdlT2JqZWN0KCkge31cblx0XHRTdG9yYWdlT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0XHRmdW5jdGlvbiBfcGFyc2VBcnJheSAocmVzdWx0U2V0LCBhcnJheSkge1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRfcGFyc2UocmVzdWx0U2V0LCBhcnJheVtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdFx0ZnVuY3Rpb24gX3BhcnNlTnVtYmVyIChyZXN1bHRTZXQsIG51bSkge1xuXHRcdFx0cmVzdWx0U2V0W251bV0gPSB0cnVlO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIF9wYXJzZU9iamVjdCAocmVzdWx0U2V0LCBvYmplY3QpIHtcblx0XHRcdGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdGlmIChoYXNPd24uY2FsbChvYmplY3QsIGspKSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlIHRvIGZhbHNlIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQgdG8gYXZvaWQgY2hhbmdpbmcgb2JqZWN0IHN0cnVjdHVyZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vd3d3LnNtYXNoaW5nbWFnYXppbmUuY29tLzIwMTIvMTEvd3JpdGluZy1mYXN0LW1lbW9yeS1lZmZpY2llbnQtamF2YXNjcmlwdC8jZGUtcmVmZXJlbmNpbmctbWlzY29uY2VwdGlvbnNcblx0XHRcdFx0XHRyZXN1bHRTZXRba10gPSAhIW9iamVjdFtrXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBTUEFDRSA9IC9cXHMrLztcblx0XHRmdW5jdGlvbiBfcGFyc2VTdHJpbmcgKHJlc3VsdFNldCwgc3RyKSB7XG5cdFx0XHR2YXIgYXJyYXkgPSBzdHIuc3BsaXQoU1BBQ0UpO1xuXHRcdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuXHRcdFx0XHRyZXN1bHRTZXRbYXJyYXlbaV1dID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBfcGFyc2UgKHJlc3VsdFNldCwgYXJnKSB7XG5cdFx0XHRpZiAoIWFyZykgcmV0dXJuO1xuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHQvLyAnZm9vIGJhcidcblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRfcGFyc2VTdHJpbmcocmVzdWx0U2V0LCBhcmcpO1xuXG5cdFx0XHQvLyBbJ2ZvbycsICdiYXInLCAuLi5dXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0XHRfcGFyc2VBcnJheShyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vIHsgJ2Zvbyc6IHRydWUsIC4uLiB9XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdF9wYXJzZU9iamVjdChyZXN1bHRTZXQsIGFyZyk7XG5cblx0XHRcdC8vICcxMzAnXG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdF9wYXJzZU51bWJlcihyZXN1bHRTZXQsIGFyZyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gX2NsYXNzTmFtZXMgKCkge1xuXHRcdFx0Ly8gZG9uJ3QgbGVhayBhcmd1bWVudHNcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvd2lraS9PcHRpbWl6YXRpb24ta2lsbGVycyMzMi1sZWFraW5nLWFyZ3VtZW50c1xuXHRcdFx0dmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgYXJncyA9IEFycmF5KGxlbik7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjbGFzc1NldCA9IG5ldyBTdG9yYWdlT2JqZWN0KCk7XG5cdFx0XHRfcGFyc2VBcnJheShjbGFzc1NldCwgYXJncyk7XG5cblx0XHRcdHZhciBsaXN0ID0gW107XG5cblx0XHRcdGZvciAodmFyIGsgaW4gY2xhc3NTZXQpIHtcblx0XHRcdFx0aWYgKGNsYXNzU2V0W2tdKSB7XG5cdFx0XHRcdFx0bGlzdC5wdXNoKGspXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxpc3Quam9pbignICcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBfY2xhc3NOYW1lcztcblx0fSkoKTtcblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwgInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcnKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgQyA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgLy8gaWYgdGhlIHRhcmdldCBpcyBub3QgaXRlcmFibGUgb3IgaXQncyBhbiBhcnJheSB3aXRoIHRoZSBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIGEgc2ltcGxlIGNhc2VcbiAgaWYgKGl0ZXJhdG9yTWV0aG9kICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yTWV0aG9kLmNhbGwoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEMoKTtcbiAgICBmb3IgKDshKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmdcbiAgICAgICAgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSlcbiAgICAgICAgOiBzdGVwLnZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgfVxuICB9XG4gIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAidmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxuLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwgInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQpO1xuICAgIH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwgInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdmFyIHJldHVybk1ldGhvZCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0dXJuTWV0aG9kICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldHVybk1ldGhvZC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCAidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwgInZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbi8vIGdldHRpbmcgdGFnIGZyb20gRVM2KyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Bcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwgInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBleGlzdCA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGV4aXN0ID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCAiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsICJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYXJlZCgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiIsICJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCAidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsICJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCAidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9IDc7XG59KTtcbiIsICIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTtcbn0gOiBPYmplY3Q7XG4iLCAidmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtd2Vhay1tYXAnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgb2JqZWN0SGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCkge1xuICB2YXIgc3RvcmUgPSBuZXcgV2Vha01hcCgpO1xuICB2YXIgd21nZXQgPSBzdG9yZS5nZXQ7XG4gIHZhciB3bWhhcyA9IHN0b3JlLmhhcztcbiAgdmFyIHdtc2V0ID0gc3RvcmUuc2V0O1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgd21zZXQuY2FsbChzdG9yZSwgaXQsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWdldC5jYWxsKHN0b3JlLCBpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiB3bWhhcy5jYWxsKHN0b3JlLCBpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGhpZGUoaXQsIFNUQVRFLCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSkgPyBpdFtTVEFURV0gOiB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIG9iamVjdEhhcyhpdCwgU1RBVEUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICBoYXM6IGhhcyxcbiAgZW5mb3JjZTogZW5mb3JjZSxcbiAgZ2V0dGVyRm9yOiBnZXR0ZXJGb3Jcbn07XG4iLCAidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCAidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogdHlwZW9mIGRldGVjdGlvbiA9PSAnZnVuY3Rpb24nID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsICIndXNlIHN0cmljdCc7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxuLy8gYCVJdGVyYXRvclByb3RvdHlwZSVgIG9iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbmlmIChJdGVyYXRvclByb3RvdHlwZSA9PSB1bmRlZmluZWQpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5pZiAoIUlTX1BVUkUgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBJdGVyYXRvclByb3RvdHlwZTogSXRlcmF0b3JQcm90b3R5cGUsXG4gIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlNcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsICJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTtcbn0pO1xuIiwgInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgbmF0aXZlRnVuY3Rpb25Ub1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWwuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QobmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKFdlYWtNYXApKTtcbiIsICJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiIsICJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaSsrXSwgUHJvcGVydGllc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG5cbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgPyBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwgInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCAiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwgImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iLCAidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsICJ2YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBhcnJheUluZGV4T2YgPSBhcnJheUluY2x1ZGVzKGZhbHNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhcyhoaWRkZW5LZXlzLCBrZXkpICYmIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgInZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsICJ2YXIgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cycpO1xuXG4vLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3JyZWN0U2V0dGVyID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0O1xuICAgIHNldHRlci5jYWxsKHRlc3QsIFtdKTtcbiAgICBjb3JyZWN0U2V0dGVyID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMoTywgcHJvdG8pO1xuICAgIGlmIChjb3JyZWN0U2V0dGVyKSBzZXR0ZXIuY2FsbChPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhuYXRpdmVGdW5jdGlvblRvU3RyaW5nKS5zcGxpdCgndG9TdHJpbmcnKTtcblxuc2hhcmVkKCdpbnNwZWN0U291cmNlJywgZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xufSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgaGlkZSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBoaWRlKE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsICIvLyBgUmVxdWlyZU9iamVjdENvZXJjaWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgaGlkZShnbG9iYWwsIGtleSwgdmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdsb2JhbFtrZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsICJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwgInZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsICJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNldEdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZ2xvYmFsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjEuMycsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnXHUwMEE5IDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsICJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCAidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwgIi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCAidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwgInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCAidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsICJ2YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBwb3N0Zml4KS50b1N0cmluZygzNikpO1xufTtcbiIsICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhwcm90bykgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH1cbn07XG4iLCAidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCAidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mcm9tJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwgIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4LCB0cnVlKTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsICJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSwgZXZhbCkoXCJ0aGlzXCIpO1xyXG59IGNhdGNoIChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcbiIsICJpbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBERUZBVUxUX0FUVFJTIGZyb20gJy4vZGVmYXVsdC1hdHRycy5qc29uJztcblxuY2xhc3MgSWNvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbnRlbnRzLCB0YWdzID0gW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29udGVudHMgPSBjb250ZW50cztcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgIHRoaXMuYXR0cnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0FUVFJTLFxuICAgICAgLi4ueyBjbGFzczogYGZlYXRoZXIgZmVhdGhlci0ke25hbWV9YCB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFNWRyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhdHRyc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdmcoYXR0cnMgPSB7fSkge1xuICAgIGNvbnN0IGNvbWJpbmVkQXR0cnMgPSB7XG4gICAgICAuLi50aGlzLmF0dHJzLFxuICAgICAgLi4uYXR0cnMsXG4gICAgICAuLi57IGNsYXNzOiBjbGFzc25hbWVzKHRoaXMuYXR0cnMuY2xhc3MsIGF0dHJzLmNsYXNzKSB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gYDxzdmcgJHthdHRyc1RvU3RyaW5nKGNvbWJpbmVkQXR0cnMpfT4ke3RoaXMuY29udGVudHN9PC9zdmc+YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBJY29uYC5cbiAgICpcbiAgICogQWRkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIElmIG9sZCBjb2RlIGV4cGVjdHMgYGZlYXRoZXIuaWNvbnMuPG5hbWU+YFxuICAgKiB0byBiZSBhIHN0cmluZywgYHRvU3RyaW5nKClgIHdpbGwgZ2V0IGltcGxpY2l0bHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGF0dHJpYnV0ZXMgb2JqZWN0IHRvIHN0cmluZyBvZiBIVE1MIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJzVG9TdHJpbmcoYXR0cnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgIC5tYXAoa2V5ID0+IGAke2tleX09XCIke2F0dHJzW2tleV19XCJgKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCAiaW1wb3J0IEljb24gZnJvbSAnLi9pY29uJztcbmltcG9ydCBpY29ucyBmcm9tICcuLi9kaXN0L2ljb25zLmpzb24nO1xuaW1wb3J0IHRhZ3MgZnJvbSAnLi90YWdzLmpzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBPYmplY3Qua2V5cyhpY29ucylcbiAgLm1hcChrZXkgPT4gbmV3IEljb24oa2V5LCBpY29uc1trZXldLCB0YWdzW2tleV0pKVxuICAucmVkdWNlKChvYmplY3QsIGljb24pID0+IHtcbiAgICBvYmplY3RbaWNvbi5uYW1lXSA9IGljb247XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSwge30pO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcbmltcG9ydCB0b1N2ZyBmcm9tICcuL3RvLXN2Zyc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICcuL3JlcGxhY2UnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgaWNvbnMsIHRvU3ZnLCByZXBsYWNlIH07XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzL2RlZHVwZSc7XG5cbmltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBSZXBsYWNlIGFsbCBIVE1MIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGBkYXRhLWZlYXRoZXJgIGF0dHJpYnV0ZSB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZShhdHRycyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmVhdGhlci5yZXBsYWNlKClgIG9ubHkgd29ya3MgaW4gYSBicm93c2VyIGVudmlyb25tZW50LicpO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudHNUb1JlcGxhY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1mZWF0aGVyXScpO1xuXG4gIEFycmF5LmZyb20oZWxlbWVudHNUb1JlcGxhY2UpLmZvckVhY2goZWxlbWVudCA9PlxuICAgIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGF0dHJzKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCB3aXRoIFNWRyBtYXJrdXBcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBgZGF0YS1mZWF0aGVyYCBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVsZW1lbnQoZWxlbWVudCwgYXR0cnMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50QXR0cnMgPSBnZXRBdHRycyhlbGVtZW50KTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnRBdHRyc1snZGF0YS1mZWF0aGVyJ107XG4gIGRlbGV0ZSBlbGVtZW50QXR0cnNbJ2RhdGEtZmVhdGhlciddO1xuXG4gIGNvbnN0IHN2Z1N0cmluZyA9IGljb25zW25hbWVdLnRvU3ZnKHtcbiAgICAuLi5hdHRycyxcbiAgICAuLi5lbGVtZW50QXR0cnMsXG4gICAgLi4ueyBjbGFzczogY2xhc3NuYW1lcyhhdHRycy5jbGFzcywgZWxlbWVudEF0dHJzLmNsYXNzKSB9LFxuICB9KTtcbiAgY29uc3Qgc3ZnRG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFxuICAgIHN2Z1N0cmluZyxcbiAgICAnaW1hZ2Uvc3ZnK3htbCcsXG4gICk7XG4gIGNvbnN0IHN2Z0VsZW1lbnQgPSBzdmdEb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcblxuICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHN2Z0VsZW1lbnQsIGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBIVE1MIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRBdHRycyhlbGVtZW50KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcykucmVkdWNlKChhdHRycywgYXR0cikgPT4ge1xuICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIHJldHVybiBhdHRycztcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlO1xuIiwgImltcG9ydCBpY29ucyBmcm9tICcuL2ljb25zJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gU1ZHIHN0cmluZy5cbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB0b1N2ZyhuYW1lLCBhdHRycyA9IHt9KSB7XG4gIGNvbnNvbGUud2FybihcbiAgICAnZmVhdGhlci50b1N2ZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZygpIGluc3RlYWQuJyxcbiAgKTtcblxuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZXF1aXJlZCBga2V5YCAoaWNvbiBuYW1lKSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4nKTtcbiAgfVxuXG4gIGlmICghaWNvbnNbbmFtZV0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gaWNvbiBtYXRjaGluZyAnJHtcbiAgICAgICAgbmFtZVxuICAgICAgfScuIFNlZSB0aGUgY29tcGxldGUgbGlzdCBvZiBpY29ucyBhdCBodHRwczovL2ZlYXRoZXJpY29ucy5jb21gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaWNvbnNbbmFtZV0udG9TdmcoYXR0cnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1N2ZztcbiIsICIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgdmFyIGlzSUUgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgJiYgKHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSB1bmRlZmluZWRUeXBlKSAmJiAoXG4gICAgICAgIC9UcmlkZW50XFwvfE1TSUUgLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICk7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhY2UoKSBkb2Vzbid0IHByaW50IHRoZSBtZXNzYWdlIGluIElFLCBzbyBmb3IgdGhhdCBjYXNlIHdlIG5lZWQgdG8gd3JhcCBpdFxuICAgIGZ1bmN0aW9uIHRyYWNlRm9ySUUoKSB7XG4gICAgICAgIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUubG9nLmFwcGx5KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gb2xkIElFLCBuYXRpdmUgY29uc29sZSBtZXRob2RzIHRoZW1zZWx2ZXMgZG9uJ3QgaGF2ZSBhcHBseSgpLlxuICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5hcHBseShjb25zb2xlLmxvZywgW2NvbnNvbGUsIGFyZ3VtZW50c10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zb2xlLnRyYWNlKSBjb25zb2xlLnRyYWNlKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICd0cmFjZScgJiYgaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNlRm9ySUU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZVttZXRob2ROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCBtZXRob2ROYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZChjb25zb2xlLCAnbG9nJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbm9vcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZXNlIHByaXZhdGUgZnVuY3Rpb25zIGFsd2F5cyBuZWVkIGB0aGlzYCB0byBiZSBzZXQgcHJvcGVybHlcblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VMb2dnaW5nTWV0aG9kcyhsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXRob2ROYW1lID0gbG9nTWV0aG9kc1tpXTtcbiAgICAgICAgICAgIHRoaXNbbWV0aG9kTmFtZV0gPSAoaSA8IGxldmVsKSA/XG4gICAgICAgICAgICAgICAgbm9vcCA6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBsb2cubG9nIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWdcbiAgICAgICAgdGhpcy5sb2cgPSB0aGlzLmRlYnVnO1xuICAgIH1cblxuICAgIC8vIEluIG9sZCBJRSB2ZXJzaW9ucywgdGhlIGNvbnNvbGUgaXNuJ3QgcHJlc2VudCB1bnRpbCB5b3UgZmlyc3Qgb3BlbiBpdC5cbiAgICAvLyBXZSBidWlsZCByZWFsTWV0aG9kKCkgcmVwbGFjZW1lbnRzIGhlcmUgdGhhdCByZWdlbmVyYXRlIGxvZ2dpbmcgbWV0aG9kc1xuICAgIGZ1bmN0aW9uIGVuYWJsZUxvZ2dpbmdXaGVuQ29uc29sZUFycml2ZXMobWV0aG9kTmFtZSwgbGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHRoaXMsIGxldmVsLCBsb2dnZXJOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2UgdXNlIGNsb3NlbHkgYm91bmQgcmVhbCBtZXRob2RzIHdoZXJldmVyIHBvc3NpYmxlLCBhbmRcbiAgICAvLyBvdGhlcndpc2Ugd2Ugd2FpdCBmb3IgYSBjb25zb2xlIHRvIGFwcGVhciwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRNZXRob2RGYWN0b3J5KG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICAgIHJldHVybiByZWFsTWV0aG9kKG1ldGhvZE5hbWUpIHx8XG4gICAgICAgICAgICAgICBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9nZ2VyKG5hbWUsIGRlZmF1bHRMZXZlbCwgZmFjdG9yeSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGN1cnJlbnRMZXZlbDtcbiAgICAgIGRlZmF1bHRMZXZlbCA9IGRlZmF1bHRMZXZlbCA9PSBudWxsID8gXCJXQVJOXCIgOiBkZWZhdWx0TGV2ZWw7XG5cbiAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJsb2dsZXZlbFwiO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICBzdG9yYWdlS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUgfHwgIXN0b3JhZ2VLZXkpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjbGVhclBlcnNpc3RlZExldmVsKCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlIHx8ICFzdG9yYWdlS2V5KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cblxuICAgICAgICAgIC8vIFVzZSBzZXNzaW9uIGNvb2tpZSBhcyBmYWxsYmFja1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPVxuICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdG9yYWdlS2V5KSArIFwiPTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQ1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAqXG4gICAgICAgKiBQdWJsaWMgbG9nZ2VyIEFQSSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGltdGVycnkvbG9nbGV2ZWwgZm9yIGRldGFpbHNcbiAgICAgICAqXG4gICAgICAgKi9cblxuICAgICAgc2VsZi5uYW1lID0gbmFtZTtcblxuICAgICAgc2VsZi5sZXZlbHMgPSB7IFwiVFJBQ0VcIjogMCwgXCJERUJVR1wiOiAxLCBcIklORk9cIjogMiwgXCJXQVJOXCI6IDMsXG4gICAgICAgICAgXCJFUlJPUlwiOiA0LCBcIlNJTEVOVFwiOiA1fTtcblxuICAgICAgc2VsZi5tZXRob2RGYWN0b3J5ID0gZmFjdG9yeSB8fCBkZWZhdWx0TWV0aG9kRmFjdG9yeTtcblxuICAgICAgc2VsZi5nZXRMZXZlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudExldmVsO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCwgcGVyc2lzdCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwic3RyaW5nXCIgJiYgc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXZlbCA9IHNlbGYubGV2ZWxzW2xldmVsLnRvVXBwZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsID09PSBcIm51bWJlclwiICYmIGxldmVsID49IDAgJiYgbGV2ZWwgPD0gc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICBpZiAocGVyc2lzdCAhPT0gZmFsc2UpIHsgIC8vIGRlZmF1bHRzIHRvIHRydWVcbiAgICAgICAgICAgICAgICAgIHBlcnNpc3RMZXZlbElmUG9zc2libGUobGV2ZWwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcGxhY2VMb2dnaW5nTWV0aG9kcy5jYWxsKHNlbGYsIGxldmVsLCBuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSB1bmRlZmluZWRUeXBlICYmIGxldmVsIDwgc2VsZi5sZXZlbHMuU0lMRU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJObyBjb25zb2xlIGF2YWlsYWJsZSBmb3IgbG9nZ2luZ1wiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgXCJsb2cuc2V0TGV2ZWwoKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGxldmVsOiBcIiArIGxldmVsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuc2V0RGVmYXVsdExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgICAgZGVmYXVsdExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgaWYgKCFnZXRQZXJzaXN0ZWRMZXZlbCgpKSB7XG4gICAgICAgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnJlc2V0TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5zZXRMZXZlbChkZWZhdWx0TGV2ZWwsIGZhbHNlKTtcbiAgICAgICAgICBjbGVhclBlcnNpc3RlZExldmVsKCk7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLmVuYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlRSQUNFLCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZGlzYWJsZUFsbCA9IGZ1bmN0aW9uKHBlcnNpc3QpIHtcbiAgICAgICAgICBzZWxmLnNldExldmVsKHNlbGYubGV2ZWxzLlNJTEVOVCwgcGVyc2lzdCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIHJpZ2h0IGxldmVsXG4gICAgICB2YXIgaW5pdGlhbExldmVsID0gZ2V0UGVyc2lzdGVkTGV2ZWwoKTtcbiAgICAgIGlmIChpbml0aWFsTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxMZXZlbCA9IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICgodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIgJiYgdHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHx8IG5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGEgbmFtZSB3aGVuIGNyZWF0aW5nIGEgbG9nZ2VyLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXTtcbiAgICAgICAgaWYgKCFsb2dnZXIpIHtcbiAgICAgICAgICBsb2dnZXIgPSBfbG9nZ2Vyc0J5TmFtZVtuYW1lXSA9IG5ldyBMb2dnZXIoXG4gICAgICAgICAgICBuYW1lLCBkZWZhdWx0TG9nZ2VyLmdldExldmVsKCksIGRlZmF1bHRMb2dnZXIubWV0aG9kRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlcjtcbiAgICB9O1xuXG4gICAgLy8gR3JhYiB0aGUgY3VycmVudCBnbG9iYWwgbG9nIHZhcmlhYmxlIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG4gICAgdmFyIF9sb2cgPSAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSkgPyB3aW5kb3cubG9nIDogdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRMb2dnZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gdW5kZWZpbmVkVHlwZSAmJlxuICAgICAgICAgICAgICAgd2luZG93LmxvZyA9PT0gZGVmYXVsdExvZ2dlcikge1xuICAgICAgICAgICAgd2luZG93LmxvZyA9IF9sb2c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdExvZ2dlcjtcbiAgICB9O1xuXG4gICAgZGVmYXVsdExvZ2dlci5nZXRMb2dnZXJzID0gZnVuY3Rpb24gZ2V0TG9nZ2VycygpIHtcbiAgICAgICAgcmV0dXJuIF9sb2dnZXJzQnlOYW1lO1xuICAgIH07XG5cbiAgICAvLyBFUzYgZGVmYXVsdCBleHBvcnQsIGZvciBjb21wYXRpYmlsaXR5XG4gICAgZGVmYXVsdExvZ2dlclsnZGVmYXVsdCddID0gZGVmYXVsdExvZ2dlcjtcblxuICAgIHJldHVybiBkZWZhdWx0TG9nZ2VyO1xufSkpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIENvbGxlY3Rpb24gb2YgaGVscGZ1bCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBPYmplY3QuYXNzaWduLWxpa2UgcG9seWZpbGwuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSB0YXJnZXQgICAgICAgLSBGaXJzdCBvYmplY3QuXG4gKiBAcGFyYW0gIHtvYmplY3R9IFsuLi5vYmplY3RzXSAtIE9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGFzc2lnblBvbHlmaWxsKCkge1xuICBjb25zdCB0YXJnZXQgPSBhcmd1bWVudHNbMF07XG5cbiAgZm9yIChsZXQgaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKCFhcmd1bWVudHNbaV0pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGFyZ3VtZW50c1tpXSkgdGFyZ2V0W2tdID0gYXJndW1lbnRzW2ldW2tdO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubGV0IGFzc2lnbiA9IGFzc2lnblBvbHlmaWxsO1xuXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicpIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbmV4cG9ydCB7YXNzaWdufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIGZpcnN0IG1hdGNoaW5nIGVkZ2UgZm9yIGdpdmVuIHBhdGguXG4gKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSBleGlzdGVuY2Ugb2Ygc291cmNlICYgdGFyZ2V0LiBUaGlzXG4gKiBtdXN0IGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgZ3JhcGggIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAqIEBwYXJhbSAge2FueX0gICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUgICAtIFR5cGUgb2YgdGhlIGVkZ2UgKG1peGVkLCBkaXJlY3RlZCBvciB1bmRpcmVjdGVkKS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdFZGdlKGdyYXBoLCBzb3VyY2UsIHRhcmdldCwgdHlwZSkge1xuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpO1xuXG4gIGxldCBlZGdlID0gbnVsbDtcblxuICBpZiAoIXNvdXJjZURhdGEpIHJldHVybiBlZGdlO1xuXG4gIGlmICh0eXBlID09PSAnbWl4ZWQnKSB7XG4gICAgZWRnZSA9XG4gICAgICAoc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XSkgfHxcbiAgICAgIChzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgJiYgc291cmNlRGF0YS51bmRpcmVjdGVkW3RhcmdldF0pO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkaXJlY3RlZCcpIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS5vdXQgJiYgc291cmNlRGF0YS5vdXRbdGFyZ2V0XTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlID0gc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgR3JhcGggaW1wbGVtZW50YXRpb24gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7bWl4ZWR9ICAgdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgbyAtIFRhcmdldCBPYmplY3QuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvKSB7XG4gIGxldCBrO1xuXG4gIGZvciAoayBpbiBvKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFwicHJpdmF0ZVwiIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgYnkgY29uY2VhbGluZyBpdFxuICogdXNpbmcgdGhlIGBlbnVtZXJhYmxlYCBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAgIC0gTWVtYmVyIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgJiB0aGUgZ2l2ZW4gZ2V0dGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIHRhcmdldCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBuYW1lICAgLSBNZW1iZXIgbmFtZS5cbiAqIEBwYXJhbSB7bWl4ZWR9ICAgIHZhbHVlICAtIFRoZSBhdHRhY2hlZCBnZXR0ZXIgb3IgZml4ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT25seVByb3BlcnR5KHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9O1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLmdldCA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSB2YWx1ZTtcbiAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBjb25zdGl0dXRlIHZhbGlkIGhpbnRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBoaW50cyAtIFRhcmdldCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUhpbnRzKGhpbnRzKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChoaW50cykpIHJldHVybiBmYWxzZTtcblxuICBpZiAoaGludHMuYXR0cmlidXRlcyAmJiAhQXJyYXkuaXNBcnJheShoaW50cy5hdHRyaWJ1dGVzKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBnZW5lcmF0aW5nIGluY3JlbWVudGFsIGlkcyBmb3IgZWRnZXMuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSgpIHtcbiAgbGV0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpICYgMHhmZjtcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIHJldHVybiBpKys7XG4gIH07XG59XG4iLCAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEl0ZXJhdG9yIENsYXNzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBTaW1wbGUgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBsaWJyYXJ5J3MgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogSXRlcmF0b3IgY2xhc3MuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0IC0gTmV4dCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICBpZiAodHlwZW9mIG5leHQgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9pdGVyYXRvcjogZXhwZWN0aW5nIGEgZnVuY3Rpb24hJyk7XG5cbiAgdGhpcy5uZXh0ID0gbmV4dDtcbn1cblxuLyoqXG4gKiBJZiBzeW1ib2xzIGFyZSBzdXBwb3J0ZWQsIHdlIGFkZCBgbmV4dGAgdG8gYFN5bWJvbC5pdGVyYXRvcmAuXG4gKi9cbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJylcbiAgSXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9mIHRoZSBnaXZlbiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtICB7YW55Li4ufSB2YWx1ZXMgLSBWYWx1ZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3Iub2YgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgIGwgPSBhcmdzLmxlbmd0aCxcbiAgICBpID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IGFyZ3NbaSsrXX07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3IuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7ZG9uZTogdHJ1ZX07XG4gIH0pO1xuXG4gIHJldHVybiBpdGVyYXRvcjtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGdpdmVuIGluZGV4ZWQgc2VxdWVuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfEFycmF5fSBzZXF1ZW5jZSAtIFRhcmdldCBzZXF1ZW5jZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5mcm9tU2VxdWVuY2UgPSBmdW5jdGlvbiAoc2VxdWVuY2UpIHtcbiAgdmFyIGkgPSAwLFxuICAgIGwgPSBzZXF1ZW5jZS5sZW5ndGg7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIHJldHVybiB7ZG9uZTogZmFsc2UsIHZhbHVlOiBzZXF1ZW5jZVtpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0gIHthbnl9IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5JdGVyYXRvci5pcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRvcikgcmV0dXJuIHRydWU7XG5cbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUubmV4dCA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gSXRlcmF0b3I7XG4iLCAiZXhwb3J0cy5BUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCc7XG5leHBvcnRzLlNZTUJPTF9TVVBQT1JUID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCc7XG4iLCAiLyoqXG4gKiBPYmxpdGVyYXRvciBJdGVyIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEZ1bmN0aW9uIGNvZXJjaW5nIHZhbHVlcyB0byBhbiBpdGVyYXRvci4gSXQgY2FuIGJlIHF1aXRlIHVzZWZ1bCB3aGVuIG5lZWRpbmdcbiAqIHRvIGhhbmRsZSBpdGVyYWJsZXMgYW5kIGl0ZXJhdG9ycyB0aGUgc2FtZSB3YXkuXG4gKi9cbnZhciBJdGVyYXRvciA9IHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG5mdW5jdGlvbiBpdGVyT3JOdWxsKHRhcmdldCkge1xuICAvLyBJbmRleGVkIHNlcXVlbmNlXG4gIGlmIChcbiAgICB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyB8fFxuICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSB8fFxuICAgIChBUlJBWV9CVUZGRVJfU1VQUE9SVCAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodGFyZ2V0KSlcbiAgKVxuICAgIHJldHVybiBJdGVyYXRvci5mcm9tU2VxdWVuY2UodGFyZ2V0KTtcblxuICAvLyBJbnZhbGlkIHZhbHVlXG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIC8vIEl0ZXJhYmxlXG4gIGlmIChTWU1CT0xfU1VQUE9SVCAmJiB0eXBlb2YgdGFyZ2V0W1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cbiAgLy8gSXRlcmF0b3IgZHVjay10eXBpbmdcbiAgaWYgKHR5cGVvZiB0YXJnZXQubmV4dCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHRhcmdldDtcblxuICAvLyBJbnZhbGlkIG9iamVjdFxuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpdGVyKHRhcmdldCkge1xuICB2YXIgaXRlcmF0b3IgPSBpdGVyT3JOdWxsKHRhcmdldCk7XG5cbiAgaWYgKCFpdGVyYXRvcilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnb2JsaXRlcmF0b3I6IHRhcmdldCBpcyBub3QgaXRlcmFibGUgbm9yIGEgdmFsaWQgaXRlcmF0b3IuJ1xuICAgICk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcbiIsICIvKiBlc2xpbnQgbm8tY29uc3RhbnQtY29uZGl0aW9uOiAwICovXG4vKipcbiAqIE9ibGl0ZXJhdG9yIFRha2UgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogRnVuY3Rpb24gdGFraW5nIG4gb3IgZXZlcnkgdmFsdWUgb2YgdGhlIGdpdmVuIGl0ZXJhdG9yIGFuZCByZXR1cm5zIHRoZW1cbiAqIGludG8gYW4gYXJyYXkuXG4gKi9cbnZhciBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogVGFrZS5cbiAqXG4gKiBAcGFyYW0gIHtJdGVyYWJsZX0gaXRlcmFibGUgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgW25dICAgICAgLSBPcHRpb25hbCBudW1iZXIgb2YgaXRlbXMgdG8gdGFrZS5cbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRha2UoaXRlcmFibGUsIG4pIHtcbiAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IG4gOiBJbmZpbml0eSxcbiAgICBhcnJheSA9IGwgIT09IEluZmluaXR5ID8gbmV3IEFycmF5KGwpIDogW10sXG4gICAgc3RlcCxcbiAgICBpID0gMDtcblxuICB2YXIgaXRlcmF0b3IgPSBpdGVyKGl0ZXJhYmxlKTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChpID09PSBsKSByZXR1cm4gYXJyYXk7XG5cbiAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgaWYgKGkgIT09IG4pIGFycmF5Lmxlbmd0aCA9IGk7XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICBhcnJheVtpKytdID0gc3RlcC52YWx1ZTtcbiAgfVxufTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgQ3VzdG9tIEVycm9yc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlZmluaW5nIGN1c3RvbSBlcnJvcnMgZm9yIGVhc2Ugb2YgdXNlICYgZWFzeSB1bml0IHRlc3RzIGFjcm9zc1xuICogaW1wbGVtZW50YXRpb25zIChub3JtYWxpemVkIHR5cG9sb2d5IHJhdGhlciB0aGFuIHJlbHlpbmcgb24gZXJyb3JcbiAqIG1lc3NhZ2VzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNvcnJlY3QgZXJyb3Igd2FzIGZvdW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubmFtZSA9ICdHcmFwaEVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciBleHRlbmRzIEdyYXBoRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yJztcblxuICAgIC8vIFRoaXMgaXMgVjggc3BlY2lmaWMgdG8gZW5oYW5jZSBzdGFjayByZWFkYWJpbGl0eVxuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09ICdmdW5jdGlvbicpXG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yXG4gICAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdOb3RGb3VuZEdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdEZvdW5kR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVc2FnZUdyYXBoRXJyb3IgZXh0ZW5kcyBHcmFwaEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdVc2FnZUdyYXBoRXJyb3InO1xuXG4gICAgLy8gVGhpcyBpcyBWOCBzcGVjaWZpYyB0byBlbmhhbmNlIHN0YWNrIHJlYWRhYmlsaXR5XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFVzYWdlR3JhcGhFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEludGVybmFsIERhdGEgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSW50ZXJuYWwgY2xhc3NlcyBob3BlZnVsbHkgcmVkdWNlZCB0byBzdHJ1Y3RzIGJ5IGVuZ2luZXMgJiBzdG9yaW5nXG4gKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIG5vZGVzICYgZWRnZXMuXG4gKlxuICogTm90ZSB0aGF0IHRob3NlIGNsYXNzZXMgZG9uJ3QgcmVseSBvbiB0aGUgYGNsYXNzYCBrZXl3b3JkIHRvIGF2b2lkIHNvbWVcbiAqIGNydWZ0IGludHJvZHVjZWQgYnkgbW9zdCBvZiBFUzIwMTUgdHJhbnNwaWxlcnMuXG4gKi9cblxuLyoqXG4gKiBNaXhlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNaXhlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuTWl4ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy51bmRpcmVjdGVkRGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG4gIHRoaXMudW5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG4gIHRoaXMudW5kaXJlY3RlZCA9IHt9O1xufTtcblxuLyoqXG4gKiBEaXJlY3RlZE5vZGVEYXRhIGNsYXNzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTm9kZSdzIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuRGlyZWN0ZWROb2RlRGF0YS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIERlZ3JlZXNcbiAgdGhpcy5pbkRlZ3JlZSA9IDA7XG4gIHRoaXMub3V0RGVncmVlID0gMDtcbiAgdGhpcy5kaXJlY3RlZFNlbGZMb29wcyA9IDA7XG5cbiAgLy8gSW5kaWNlc1xuICB0aGlzLmluID0ge307XG4gIHRoaXMub3V0ID0ge307XG59O1xuXG5EaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS51cGdyYWRlVG9NaXhlZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG4vKipcbiAqIFVuZGlyZWN0ZWROb2RlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyAtIE5vZGUncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gVW5kaXJlY3RlZE5vZGVEYXRhKGtleSwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gIHRoaXMuY2xlYXIoKTtcbn1cblxuVW5kaXJlY3RlZE5vZGVEYXRhLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVncmVlc1xuICB0aGlzLnVuZGlyZWN0ZWREZWdyZWUgPSAwO1xuICB0aGlzLnVuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy51bmRpcmVjdGVkID0ge307XG59O1xuXG5VbmRpcmVjdGVkTm9kZURhdGEucHJvdG90eXBlLnVwZ3JhZGVUb01peGVkID0gZnVuY3Rpb24gKCkge1xuICAvLyBEZWdyZWVzXG4gIHRoaXMuaW5EZWdyZWUgPSAwO1xuICB0aGlzLm91dERlZ3JlZSA9IDA7XG4gIHRoaXMuZGlyZWN0ZWRTZWxmTG9vcHMgPSAwO1xuXG4gIC8vIEluZGljZXNcbiAgdGhpcy5pbiA9IHt9O1xuICB0aGlzLm91dCA9IHt9O1xufTtcblxuLyoqXG4gKiBFZGdlRGF0YSBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9ICBzdHJpbmcgICAgICAgLSBUaGUgZWRnZSdzIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgc291cmNlICAgICAgIC0gU291cmNlIG9mIHRoZSBlZGdlLlxuICogQHBhcmFtIHtzdHJpbmd9ICB0YXJnZXQgICAgICAgLSBUYXJnZXQgb2YgdGhlIGVkZ2UuXG4gKiBAcGFyYW0ge29iamVjdH0gIGF0dHJpYnV0ZXMgICAtIEVkZ2UncyBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRWRnZURhdGEodW5kaXJlY3RlZCwga2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAvLyBBdHRyaWJ1dGVzXG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICB0aGlzLnVuZGlyZWN0ZWQgPSB1bmRpcmVjdGVkO1xuXG4gIC8vIEV4dHJlbWl0aWVzXG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgSW5kZXhlcyBGdW5jdGlvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQnVuY2ggb2YgZnVuY3Rpb25zIHVzZWQgdG8gY29tcHV0ZSBvciBjbGVhciBpbmRleGVzLlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gdXBkYXRpbmcgdGhlICdzdHJ1Y3R1cmUnIGluZGV4IHdpdGggdGhlIGdpdmVuIGVkZ2UncyBkYXRhLlxuICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIHRoZSBtdWx0aSBncmFwaCwgcmVsYXRlZCBlZGdlcyBhcmUgc3RvcmVkIGluIGFcbiAqIHNldCB0aGF0IGlzIHRoZSBzYW1lIGZvciBBIC0+IEIgJiBCIDwtIEEuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7RWRnZURhdGF9IGVkZ2VEYXRhICAgLSBBZGRlZCBlZGdlJ3MgZGF0YS5cbiAqIEBwYXJhbSB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0ge05vZGVEYXRhfSB0YXJnZXREYXRhIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RydWN0dXJlSW5kZXgoXG4gIGdyYXBoLFxuICB1bmRpcmVjdGVkLFxuICBlZGdlRGF0YSxcbiAgc291cmNlLFxuICB0YXJnZXQsXG4gIHNvdXJjZURhdGEsXG4gIHRhcmdldERhdGFcbikge1xuICBjb25zdCBtdWx0aSA9IGdyYXBoLm11bHRpO1xuXG4gIGxldCBvdXRLZXkgPSAnb3V0JztcbiAgbGV0IGluS2V5ID0gJ2luJztcblxuICBpZiAodW5kaXJlY3RlZCkgb3V0S2V5ID0gaW5LZXkgPSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IGFkaiwgY29udGFpbmVyO1xuXG4gIGlmIChtdWx0aSkge1xuICAgIC8vIEhhbmRsaW5nIHNvdXJjZVxuICAgIGFkaiA9IHNvdXJjZURhdGFbb3V0S2V5XTtcbiAgICBjb250YWluZXIgPSBhZGpbdGFyZ2V0XTtcblxuICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgY29udGFpbmVyID0gbmV3IFNldCgpO1xuICAgICAgYWRqW3RhcmdldF0gPSBjb250YWluZXI7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLmFkZChlZGdlRGF0YSk7XG5cbiAgICAvLyBJZiBzZWxmTG9vcCwgd2UgYnJlYWsgaGVyZVxuICAgIGlmIChzb3VyY2UgPT09IHRhcmdldCAmJiB1bmRpcmVjdGVkKSByZXR1cm47XG5cbiAgICAvLyBIYW5kbGluZyB0YXJnZXQgKHdlIHdvbid0IGFkZCB0aGUgZWRnZSBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHRha2VuXG4gICAgLy8gY2FyZSBvZiB3aXRoIHNvdXJjZSBhYm92ZSlcbiAgICBhZGogPSB0YXJnZXREYXRhW2luS2V5XTtcbiAgICBpZiAodHlwZW9mIGFkaltzb3VyY2VdID09PSAndW5kZWZpbmVkJykgYWRqW3NvdXJjZV0gPSBjb250YWluZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gSGFuZGxpbmcgc291cmNlXG4gICAgc291cmNlRGF0YVtvdXRLZXldW3RhcmdldF0gPSBlZGdlRGF0YTtcblxuICAgIC8vIElmIHNlbGZMb29wLCB3ZSBicmVhayBoZXJlXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0ICYmIHVuZGlyZWN0ZWQpIHJldHVybjtcblxuICAgIC8vIEhhbmRsaW5nIHRhcmdldFxuICAgIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV0gPSBlZGdlRGF0YTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSAnc3RydWN0dXJlJyBpbmRleCBkYXRhIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGVkZ2UuXG4gKlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0VkZ2VEYXRhfSBlZGdlRGF0YSAtIERyb3BwZWQgZWRnZSdzIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckVkZ2VGcm9tU3RydWN0dXJlSW5kZXgoZ3JhcGgsIHVuZGlyZWN0ZWQsIGVkZ2VEYXRhKSB7XG4gIGNvbnN0IG11bHRpID0gZ3JhcGgubXVsdGk7XG5cbiAgY29uc3Qge3NvdXJjZTogc291cmNlRGF0YSwgdGFyZ2V0OiB0YXJnZXREYXRhfSA9IGVkZ2VEYXRhO1xuXG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZURhdGEua2V5LFxuICAgIHRhcmdldCA9IHRhcmdldERhdGEua2V5O1xuXG4gIC8vIE5PVEU6IHNpbmNlIHRoZSBlZGdlIHNldCBpcyB0aGUgc2FtZSBmb3Igc291cmNlICYgdGFyZ2V0LCB3ZSBjYW4gb25seVxuICAvLyBhZmZlY3Qgc291cmNlXG4gIGNvbnN0IG91dEtleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnb3V0JyxcbiAgICBzb3VyY2VJbmRleCA9IHNvdXJjZURhdGFbb3V0S2V5XTtcblxuICBjb25zdCBpbktleSA9IHVuZGlyZWN0ZWQgPyAndW5kaXJlY3RlZCcgOiAnaW4nO1xuXG4gIGlmICh0YXJnZXQgaW4gc291cmNlSW5kZXgpIHtcbiAgICBpZiAobXVsdGkpIHtcbiAgICAgIGNvbnN0IHNldCA9IHNvdXJjZUluZGV4W3RhcmdldF07XG5cbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMSkge1xuICAgICAgICBkZWxldGUgc291cmNlSW5kZXhbdGFyZ2V0XTtcbiAgICAgICAgZGVsZXRlIHRhcmdldERhdGFbaW5LZXldW3NvdXJjZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXQuZGVsZXRlKGVkZ2VEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgZGVsZXRlIHNvdXJjZUluZGV4W3RhcmdldF07XG4gIH1cblxuICBpZiAobXVsdGkpIHJldHVybjtcblxuICBjb25zdCB0YXJnZXRJbmRleCA9IHRhcmdldERhdGFbaW5LZXldO1xuXG4gIGRlbGV0ZSB0YXJnZXRJbmRleFtzb3VyY2VdO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNsZWFyaW5nIHRoZSB3aG9sZSAnc3RydWN0dXJlJyBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSBncmFwaCAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU3RydWN0dXJlSW5kZXgoZ3JhcGgpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgbGV0IHN0ZXA7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBzdGVwLnZhbHVlLmNsZWFyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIHVwZ3JhZGUgYSBzaW1wbGUgYHN0cnVjdHVyZWAgaW5kZXggdG8gYSBtdWx0aSBvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgZ3JhcGggLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpKGdyYXBoKSB7XG4gIGdyYXBoLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBub2RlKSA9PiB7XG4gICAgLy8gRGlyZWN0ZWRcbiAgICBpZiAoZGF0YS5vdXQpIHtcbiAgICAgIGZvciAoY29uc3QgbmVpZ2hib3IgaW4gZGF0YS5vdXQpIHtcbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLm91dFtuZWlnaGJvcl0pO1xuICAgICAgICBkYXRhLm91dFtuZWlnaGJvcl0gPSBlZGdlcztcbiAgICAgICAgZ3JhcGguX25vZGVzLmdldChuZWlnaGJvcikuaW5bbm9kZV0gPSBlZGdlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVbmRpcmVjdGVkXG4gICAgaWYgKGRhdGEudW5kaXJlY3RlZCkge1xuICAgICAgZm9yIChjb25zdCBuZWlnaGJvciBpbiBkYXRhLnVuZGlyZWN0ZWQpIHtcbiAgICAgICAgaWYgKG5laWdoYm9yID4gbm9kZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGVkZ2VzLmFkZChkYXRhLnVuZGlyZWN0ZWRbbmVpZ2hib3JdKTtcbiAgICAgICAgZGF0YS51bmRpcmVjdGVkW25laWdoYm9yXSA9IGVkZ2VzO1xuICAgICAgICBncmFwaC5fbm9kZXMuZ2V0KG5laWdoYm9yKS51bmRpcmVjdGVkW25vZGVdID0gZWRnZXM7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTm9kZSBBdHRyaWJ1dGVzIG1ldGhvZHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YXNzaWduLCBpc1BsYWluT2JqZWN0fSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsIE5vdEZvdW5kR3JhcGhFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuY29uc3QgTk9ERSA9IDA7XG5jb25zdCBTT1VSQ0UgPSAxO1xuY29uc3QgVEFSR0VUID0gMjtcbmNvbnN0IE9QUE9TSVRFID0gMztcblxuZnVuY3Rpb24gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gIGdyYXBoLFxuICBtZXRob2QsXG4gIG1vZGUsXG4gIG5vZGVPckVkZ2UsXG4gIG5hbWVPckVkZ2UsXG4gIGFkZDEsXG4gIGFkZDJcbikge1xuICBsZXQgbm9kZURhdGEsIGVkZ2VEYXRhLCBhcmcxLCBhcmcyO1xuXG4gIG5vZGVPckVkZ2UgPSAnJyArIG5vZGVPckVkZ2U7XG5cbiAgaWYgKG1vZGUgPT09IE5PREUpIHtcbiAgICBub2RlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQobm9kZU9yRWRnZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlT3JFZGdlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhcmcxID0gbmFtZU9yRWRnZTtcbiAgICBhcmcyID0gYWRkMTtcbiAgfSBlbHNlIGlmIChtb2RlID09PSBPUFBPU0lURSkge1xuICAgIG5hbWVPckVkZ2UgPSAnJyArIG5hbWVPckVkZ2U7XG5cbiAgICBlZGdlRGF0YSA9IGdyYXBoLl9lZGdlcy5nZXQobmFtZU9yRWRnZSk7XG5cbiAgICBpZiAoIWVkZ2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtuYW1lT3JFZGdlfVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBzb3VyY2UgPSBlZGdlRGF0YS5zb3VyY2Uua2V5O1xuICAgIGNvbnN0IHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gc291cmNlKSB7XG4gICAgICBub2RlRGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcbiAgICB9IGVsc2UgaWYgKG5vZGVPckVkZ2UgPT09IHRhcmdldCkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBub2RlIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgXCIke25hbWVPckVkZ2V9XCIgZWRnZSAoJHtzb3VyY2V9LCAke3RhcmdldH0pLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXJnMSA9IGFkZDE7XG4gICAgYXJnMiA9IGFkZDI7XG4gIH0gZWxzZSB7XG4gICAgZWRnZURhdGEgPSBncmFwaC5fZWRnZXMuZ2V0KG5vZGVPckVkZ2UpO1xuXG4gICAgaWYgKCFlZGdlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZU9yRWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKG1vZGUgPT09IFNPVVJDRSkge1xuICAgICAgbm9kZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVEYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuICAgIH1cblxuICAgIGFyZzEgPSBuYW1lT3JFZGdlO1xuICAgIGFyZzIgPSBhZGQxO1xuICB9XG5cbiAgcmV0dXJuIFtub2RlRGF0YSwgYXJnMSwgYXJnMl07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVHZXR0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UpIHtcbiAgICBjb25zdCBbZGF0YV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2VcbiAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlU2V0dGVyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSwgYWRkMikge1xuICAgIGNvbnN0IFtkYXRhLCBuYW1lLCB2YWx1ZV0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxLFxuICAgICAgYWRkMlxuICAgICk7XG5cbiAgICBkYXRhLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxLCBhZGQyKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWUsIHVwZGF0ZXJdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMSxcbiAgICAgIGFkZDJcbiAgICApO1xuXG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiB1cGRhdGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YS5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHZhbHVlID0gdXBkYXRlcihhdHRyaWJ1dGVzW25hbWVdKTtcblxuICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiBkYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXIoQ2xhc3MsIG1ldGhvZCwgbW9kZSkge1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChub2RlT3JFZGdlLCBuYW1lT3JFZGdlLCBhZGQxKSB7XG4gICAgY29uc3QgW2RhdGEsIG5hbWVdID0gZmluZFJlbGV2YW50Tm9kZURhdGEoXG4gICAgICB0aGlzLFxuICAgICAgbWV0aG9kLFxuICAgICAgbW9kZSxcbiAgICAgIG5vZGVPckVkZ2UsXG4gICAgICBuYW1lT3JFZGdlLFxuICAgICAgYWRkMVxuICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRhY2hOb2RlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGRhdGEuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIG1vZGUpIHtcbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAobm9kZU9yRWRnZSwgbmFtZU9yRWRnZSwgYWRkMSkge1xuICAgIGNvbnN0IFtkYXRhLCBhdHRyaWJ1dGVzXSA9IGZpbmRSZWxldmFudE5vZGVEYXRhKFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIG1vZGUsXG4gICAgICBub2RlT3JFZGdlLFxuICAgICAgbmFtZU9yRWRnZSxcbiAgICAgIGFkZDFcbiAgICApO1xuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGFzc2lnbihkYXRhLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE5vZGVBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCBtb2RlKSB7XG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKG5vZGVPckVkZ2UsIG5hbWVPckVkZ2UsIGFkZDEpIHtcbiAgICBjb25zdCBbZGF0YSwgdXBkYXRlcl0gPSBmaW5kUmVsZXZhbnROb2RlRGF0YShcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICBtb2RlLFxuICAgICAgbm9kZU9yRWRnZSxcbiAgICAgIG5hbWVPckVkZ2UsXG4gICAgICBhZGQxXG4gICAgKTtcblxuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgTk9ERV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoTm9kZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaE5vZGVBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIE5PREVfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3Igbm9kZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnTm9kZScpLCBOT0RFKTtcblxuICAgIC8vIEZvciBzb3VyY2VzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ1NvdXJjZScpLCBTT1VSQ0UpO1xuXG4gICAgLy8gRm9yIHRhcmdldHNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnVGFyZ2V0JyksIFRBUkdFVCk7XG5cbiAgICAvLyBGb3Igb3Bwb3NpdGVzXG4gICAgYXR0YWNoZXIoR3JhcGgsIG5hbWUoJ09wcG9zaXRlJyksIE9QUE9TSVRFKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBHcmFwaG9sb2d5IEVkZ2UgQXR0cmlidXRlcyBtZXRob2RzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Fzc2lnbiwgaXNQbGFpbk9iamVjdCwgZ2V0TWF0Y2hpbmdFZGdlfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7XG4gIEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLFxuICBOb3RGb3VuZEdyYXBoRXJyb3IsXG4gIFVzYWdlR3JhcGhFcnJvclxufSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgZ2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHttaXhlZH0gICAgICAgICAgLSBUaGUgYXR0cmlidXRlJ3MgdmFsdWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuYXR0cmlidXRlc1tuYW1lXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlcyBnZXR0ZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSB0YXJnZXQgZWxlbWVudCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAtIFRoZSBlbGVtZW50J3MgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhcmd1bWVudHNbMV07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09ICh0eXBlID09PSAndW5kaXJlY3RlZCcpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiICR7dHlwZX0gZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLmF0dHJpYnV0ZXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSBjaGVja2VyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZUNoZWNrZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGlzIHNldCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKlxuICAgKiBBcml0eSAzIChvbmx5IGZvciBlZGdlcyk6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIHNvdXJjZSAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZGF0YS5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgc2V0dGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlc2lyZWQgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge21peGVkfSAgdmFsdWUgICAtIE5ldyBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gU291cmNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lICAgLSBBdHRyaWJ1dGUncyBuYW1lLlxuICAgKiBAcGFyYW0gIHttaXhlZH0gIHZhbHVlICAgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIG5hbWU7XG5cbiAgICAgIG5hbWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1szXTtcblxuICAgICAgZGF0YSA9IGdldE1hdGNoaW5nRWRnZSh0aGlzLCBzb3VyY2UsIHRhcmdldCwgdHlwZSk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCBhbiBlZGdlIGZvciB0aGUgZ2l2ZW4gcGF0aCAoXCIke3NvdXJjZX1cIiAtIFwiJHt0YXJnZXR9XCIpLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9ICcnICsgZWxlbWVudDtcbiAgICAgIGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWU7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogQXR0YWNoIGFuIGF0dHJpYnV0ZSB1cGRhdGVyIG1ldGhvZCBvbnRvIHRoZSBwcm92aWRlZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAgIC0gVGFyZ2V0IGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbWV0aG9kICAgICAgICAtIE1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgdHlwZSAgICAgICAgICAtIFR5cGUgb2YgdGhlIGVkZ2UgdG8gZmluZC5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZVVwZGF0ZXIoQ2xhc3MsIG1ldGhvZCwgdHlwZSkge1xuICAvKipcbiAgICogVXBkYXRlIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkgdXNpbmdcbiAgICogdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgZWxlbWVudCAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdG9vIG1hbnkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIHVwZGF0ZXIpIHtcbiAgICBsZXQgZGF0YTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgZmluZCB0aGlzIHR5cGUgb2YgZWRnZXMgaW4geW91ciAke3RoaXMudHlwZX0gZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMykge1xuICAgICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IHVzZSBhIHtzb3VyY2UsdGFyZ2V0fSBjb21ibyB3aGVuIGFza2luZyBhYm91dCBhbiBlZGdlJ3MgYXR0cmlidXRlcyBpbiBhIE11bHRpR3JhcGggc2luY2Ugd2UgY2Fubm90IGluZmVyIHRoZSBvbmUgeW91IHdhbnQgaW5mb3JtYXRpb24gYWJvdXQuYFxuICAgICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2UgPSAnJyArIGVsZW1lbnQsXG4gICAgICAgIHRhcmdldCA9ICcnICsgbmFtZTtcblxuICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXTtcbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbM107XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHVwZGF0ZXIgc2hvdWxkIGJlIGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzW25hbWVdID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXNbbmFtZV0pO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAnc2V0JyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVtb3ZlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVSZW1vdmVyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZGVzaXJlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBuYW1lICAgIC0gQXR0cmlidXRlJ3MgbmFtZS5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBTb3VyY2UgZWxlbWVudC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgICAtIEF0dHJpYnV0ZSdzIG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBuYW1lO1xuXG4gICAgICBuYW1lID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBkZWxldGUgZGF0YS5hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgcmVwbGFjZXIgbWV0aG9kIG9udG8gdGhlIHByb3ZpZGVkIGNsYXNzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzICAgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gICBtZXRob2QgICAgICAgIC0gTWV0aG9kIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gICB0eXBlICAgICAgICAgIC0gVHlwZSBvZiB0aGUgZWRnZSB0byBmaW5kLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXR0cmlidXRlc1JlcGxhY2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbGVtZW50IChub2RlIG9yIGVkZ2UpLlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVsZW1lbnQgICAgLSBUYXJnZXQgZWxlbWVudC5cbiAgICogQHBhcmFtICB7b2JqZWN0fSBhdHRyaWJ1dGVzIC0gTmV3IGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBOZXcgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0b28gbWFueSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXMgbm90IGZvdW5kLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlcykge1xuICAgIGxldCBkYXRhO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCBmaW5kIHRoaXMgdHlwZSBvZiBlZGdlcyBpbiB5b3VyICR7dGhpcy50eXBlfSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjYW5ub3QgdXNlIGEge3NvdXJjZSx0YXJnZXR9IGNvbWJvIHdoZW4gYXNraW5nIGFib3V0IGFuIGVkZ2UncyBhdHRyaWJ1dGVzIGluIGEgTXVsdGlHcmFwaCBzaW5jZSB3ZSBjYW5ub3QgaW5mZXIgdGhlIG9uZSB5b3Ugd2FudCBpbmZvcm1hdGlvbiBhYm91dC5gXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgZWxlbWVudCxcbiAgICAgICAgdGFyZ2V0ID0gJycgKyBhdHRyaWJ1dGVzO1xuXG4gICAgICBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICBkYXRhID0gZ2V0TWF0Y2hpbmdFZGdlKHRoaXMsIHNvdXJjZSwgdGFyZ2V0LCB0eXBlKTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIGFuIGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXRoIChcIiR7c291cmNlfVwiIC0gXCIke3RhcmdldH1cIikuYFxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gJycgKyBlbGVtZW50O1xuICAgICAgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlbGVtZW50KTtcblxuICAgICAgaWYgKCFkYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBwcm92aWRlZCBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ3JlcGxhY2UnLFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn1cblxuLyoqXG4gKiBBdHRhY2ggYW4gYXR0cmlidXRlIG1lcmdlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWVyZ2VyKENsYXNzLCBtZXRob2QsIHR5cGUpIHtcbiAgLyoqXG4gICAqIE1lcmdlIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCAobm9kZSBvciBlZGdlKS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBlbGVtZW50ICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gbWVyZ2UuXG4gICAqXG4gICAqIEFyaXR5IDMgKG9ubHkgZm9yIGVkZ2VzKTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlICAgICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge29iamVjdH0gIGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGVzKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIGF0dHJpYnV0ZXM7XG5cbiAgICAgIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYXR0cmlidXRlcykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC5gXG4gICAgICApO1xuXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgZGF0YS51bmRpcmVjdGVkICE9PSAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWxlbWVudH1cIiAke3R5cGV9IGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBhc3NpZ24oZGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBrZXk6IGRhdGEua2V5LFxuICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG4vKipcbiAqIEF0dGFjaCBhbiBhdHRyaWJ1dGUgdXBkYXRlciBtZXRob2Qgb250byB0aGUgcHJvdmlkZWQgY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG1ldGhvZCAgICAgICAgLSBNZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHR5cGUgICAgICAgICAgLSBUeXBlIG9mIHRoZSBlZGdlIHRvIGZpbmQuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlcihDbGFzcywgbWV0aG9kLCB0eXBlKSB7XG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIGVsZW1lbnQgKG5vZGUgb3IgZWRnZSkuXG4gICAqXG4gICAqIEFyaXR5IDI6XG4gICAqIEBwYXJhbSAge2FueX0gICAgICBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQXJpdHkgMyAob25seSBmb3IgZWRnZXMpOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAtIFNvdXJjZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAtIFRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIFVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm4ge0dyYXBofSAgICAgICAgICAgIC0gUmV0dXJucyBpdHNlbGYgZm9yIGNoYWluaW5nLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRvbyBtYW55IGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpcyBub3QgZm91bmQuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIChlbGVtZW50LCB1cGRhdGVyKSB7XG4gICAgbGV0IGRhdGE7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY2Fubm90IGZpbmQgdGhpcyB0eXBlIG9mIGVkZ2VzIGluIHlvdXIgJHt0aGlzLnR5cGV9IGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke21ldGhvZH06IGNhbm5vdCB1c2UgYSB7c291cmNlLHRhcmdldH0gY29tYm8gd2hlbiBhc2tpbmcgYWJvdXQgYW4gZWRnZSdzIGF0dHJpYnV0ZXMgaW4gYSBNdWx0aUdyYXBoIHNpbmNlIHdlIGNhbm5vdCBpbmZlciB0aGUgb25lIHlvdSB3YW50IGluZm9ybWF0aW9uIGFib3V0LmBcbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc291cmNlID0gJycgKyBlbGVtZW50LFxuICAgICAgICB0YXJnZXQgPSAnJyArIHVwZGF0ZXI7XG5cbiAgICAgIHVwZGF0ZXIgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIGRhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHR5cGUpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgYW4gZWRnZSBmb3IgdGhlIGdpdmVuIHBhdGggKFwiJHtzb3VyY2V9XCIgLSBcIiR7dGFyZ2V0fVwiKS5gXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQ7XG4gICAgICBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWRhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bWV0aG9kfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtlbGVtZW50fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke21ldGhvZH06IHByb3ZpZGVkIHVwZGF0ZXIgaXMgbm90IGEgZnVuY3Rpb24uYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIGRhdGEudW5kaXJlY3RlZCAhPT0gKHR5cGUgPT09ICd1bmRpcmVjdGVkJykpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHttZXRob2R9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VsZW1lbnR9XCIgJHt0eXBlfSBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGtleTogZGF0YS5rZXksXG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBvZiBtZXRob2RzIHRvIGF0dGFjaC5cbiAqL1xuY29uc3QgRURHRV9BVFRSSUJVVEVTX01FVEhPRFMgPSBbXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBnZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZUdldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgZ2V0JHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc0dldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgaGFzJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVDaGVja2VyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGBzZXQke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVNldHRlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZWAsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVVcGRhdGVyXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBlbGVtZW50ID0+IGByZW1vdmUke2VsZW1lbnR9QXR0cmlidXRlYCxcbiAgICBhdHRhY2hlcjogYXR0YWNoRWRnZUF0dHJpYnV0ZVJlbW92ZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYHJlcGxhY2Uke2VsZW1lbnR9QXR0cmlidXRlc2AsXG4gICAgYXR0YWNoZXI6IGF0dGFjaEVkZ2VBdHRyaWJ1dGVzUmVwbGFjZXJcbiAgfSxcbiAge1xuICAgIG5hbWU6IGVsZW1lbnQgPT4gYG1lcmdlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc01lcmdlclxuICB9LFxuICB7XG4gICAgbmFtZTogZWxlbWVudCA9PiBgdXBkYXRlJHtlbGVtZW50fUF0dHJpYnV0ZXNgLFxuICAgIGF0dGFjaGVyOiBhdHRhY2hFZGdlQXR0cmlidXRlc1VwZGF0ZXJcbiAgfVxuXTtcblxuLyoqXG4gKiBBdHRhY2ggZXZlcnkgYXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHMgdG8gYSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIFRhcmdldCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKSB7XG4gIEVER0VfQVRUUklCVVRFU19NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKHtuYW1lLCBhdHRhY2hlcn0pIHtcbiAgICAvLyBGb3IgZWRnZXNcbiAgICBhdHRhY2hlcihHcmFwaCwgbmFtZSgnRWRnZScpLCAnbWl4ZWQnKTtcblxuICAgIC8vIEZvciBkaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdEaXJlY3RlZEVkZ2UnKSwgJ2RpcmVjdGVkJyk7XG5cbiAgICAvLyBGb3IgdW5kaXJlY3RlZCBlZGdlc1xuICAgIGF0dGFjaGVyKEdyYXBoLCBuYW1lKCdVbmRpcmVjdGVkRWRnZScpLCAndW5kaXJlY3RlZCcpO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIENoYWluIEZ1bmN0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBWYXJpYWRpYyBmdW5jdGlvbiBjb21iaW5pbmcgdGhlIGdpdmVuIGl0ZXJhYmxlcy5cbiAqL1xudmFyIEl0ZXJhdG9yID0gcmVxdWlyZSgnLi9pdGVyYXRvci5qcycpLFxuICBpdGVyID0gcmVxdWlyZSgnLi9pdGVyLmpzJyk7XG5cbi8qKlxuICogQ2hhaW4uXG4gKlxuICogQHBhcmFtICB7Li4uSXRlcmF0b3J9IGl0ZXJhYmxlcyAtIFRhcmdldCBpdGVyYWJsZXMuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjaGFpbigpIHtcbiAgdmFyIGl0ZXJhYmxlcyA9IGFyZ3VtZW50cyxcbiAgICBjdXJyZW50LFxuICAgIGkgPSAtMTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIGl0ZXJhdGUoKSB7XG4gICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICBpKys7XG5cbiAgICAgIGlmIChpID49IGl0ZXJhYmxlcy5sZW5ndGgpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICAgIGN1cnJlbnQgPSBpdGVyKGl0ZXJhYmxlc1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIHN0ZXAgPSBjdXJyZW50Lm5leHQoKTtcblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuIGl0ZXJhdGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcDtcbiAgfSk7XG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBFZGdlIEl0ZXJhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlciBhXG4gKiBncmFwaCdzIGVkZ2VzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge0ludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yLCBOb3RGb3VuZEdyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IEVER0VTX0lURVJBVElPTiA9IFtcbiAge1xuICAgIG5hbWU6ICdlZGdlcycsXG4gICAgdHlwZTogJ21peGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luRWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0RWRnZXMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnb3V0J1xuICB9LFxuICB7XG4gICAgbmFtZTogJ2luYm91bmRFZGdlcycsXG4gICAgdHlwZTogJ21peGVkJyxcbiAgICBkaXJlY3Rpb246ICdpbidcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdvdXRib3VuZEVkZ2VzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAndW5kaXJlY3RlZEVkZ2VzJyxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBGdW5jdGlvbiBjb2xsZWN0aW5nIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gIHthcnJheX0gIGVkZ2VzICAtIEVkZ2VzIGFycmF5IHRvIHBvcHVsYXRlLlxuICogQHBhcmFtICB7b2JqZWN0fSBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBUaGUgZm91bmQgZWRnZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTaW1wbGUoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSBlZGdlcy5wdXNoKG9iamVjdFtrXS5rZXkpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0TXVsdGkoZWRnZXMsIG9iamVjdCkge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KVxuICAgIG9iamVjdFtrXS5mb3JFYWNoKGVkZ2VEYXRhID0+IGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoU2ltcGxlKG9iamVjdCwgY2FsbGJhY2ssIGF2b2lkKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBpZiAoayA9PT0gYXZvaWQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoTXVsdGkob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBvYmplY3Rba10uZm9yRWFjaChlZGdlRGF0YSA9PlxuICAgICAgY2FsbGJhY2soXG4gICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZyb20gdGhlIGdpdmVuIG9iamVjdCB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1wbGUob2JqZWN0LCBjYWxsYmFjaywgYXZvaWQpIHtcbiAgbGV0IHNob3VsZEJyZWFrID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGlmIChrID09PSBhdm9pZCkgY29udGludWU7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGZpbmRNdWx0aShvYmplY3QsIGNhbGxiYWNrLCBhdm9pZCkge1xuICBsZXQgaXRlcmF0b3IsIHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2UsIHRhcmdldDtcblxuICBsZXQgc2hvdWxkQnJlYWsgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGsgPT09IGF2b2lkKSBjb250aW51ZTtcblxuICAgIGl0ZXJhdG9yID0gb2JqZWN0W2tdLnZhbHVlcygpO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICAgIHRhcmdldCA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2Uua2V5LFxuICAgICAgICB0YXJnZXQua2V5LFxuICAgICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICk7XG5cbiAgICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhLmtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhdG9yKG9iamVjdCwgYXZvaWQpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCksXG4gICAgbCA9IGtleXMubGVuZ3RoO1xuXG4gIGxldCBpbm5lciA9IG51bGwsXG4gICAgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuICAgIGxldCBlZGdlRGF0YTtcblxuICAgIGlmIChpbm5lcikge1xuICAgICAgY29uc3Qgc3RlcCA9IGlubmVyLm5leHQoKTtcblxuICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICBpbm5lciA9IG51bGw7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgICBjb25zdCBrID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGsgPT09IGF2b2lkKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICBpbm5lciA9IGVkZ2VEYXRhLnZhbHVlcygpO1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgZWRnZTogZWRnZURhdGEua2V5LFxuICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2U6IGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICAgIHRhcmdldDogZWRnZURhdGEudGFyZ2V0LmtleSxcbiAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZXM6IGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgICB1bmRpcmVjdGVkOiBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY29sbGVjdGluZyBlZGdlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgZWRnZXMgIC0gRWRnZXMgYXJyYXkgdG8gcG9wdWxhdGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9iamVjdCAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gIGsgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgIC0gVGhlIGZvdW5kIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Rm9yS2V5U2ltcGxlKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzLnB1c2goZWRnZURhdGEua2V5KTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZvcktleU11bHRpKGVkZ2VzLCBvYmplY3QsIGspIHtcbiAgY29uc3QgZWRnZXNEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZXNEYXRhKSByZXR1cm47XG5cbiAgZWRnZXNEYXRhLmZvckVhY2goZWRnZURhdGEgPT4gZWRnZXMucHVzaChlZGdlRGF0YS5rZXkpKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB1c2luZ1xuICogYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge21peGVkfSAgICBrICAgICAgICAtIE5laWdoYm9yIGtleS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoRm9yS2V5U2ltcGxlKG9iamVjdCwgaywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgaWYgKCFlZGdlRGF0YSkgcmV0dXJuO1xuXG4gIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgY2FsbGJhY2soXG4gICAgZWRnZURhdGEua2V5LFxuICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgc291cmNlRGF0YS5rZXksXG4gICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGVkZ2VzRGF0YS5mb3JFYWNoKGVkZ2VEYXRhID0+XG4gICAgY2FsbGJhY2soXG4gICAgICBlZGdlRGF0YS5rZXksXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICBlZGdlRGF0YS5zb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBpdGVyYXRpbmcgb3ZlciB0aGUgZWdkZXMgZnJvbSB0aGUgb2JqZWN0IGF0IGdpdmVuIGtleSB0byBtYXRjaFxuICogb25lIG9mIHRoZW0uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9ICAgb2JqZWN0ICAgLSBUYXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAqL1xuZnVuY3Rpb24gZmluZEZvcktleVNpbXBsZShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gIGlmICghZWRnZURhdGEpIHJldHVybjtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gIGlmIChcbiAgICBjYWxsYmFjayhcbiAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgIGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgZWRnZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgKVxuICAgIHJldHVybiBlZGdlRGF0YS5rZXk7XG59XG5cbmZ1bmN0aW9uIGZpbmRGb3JLZXlNdWx0aShvYmplY3QsIGssIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGVkZ2VzRGF0YSA9IG9iamVjdFtrXTtcblxuICBpZiAoIWVkZ2VzRGF0YSkgcmV0dXJuO1xuXG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZWRnZXNEYXRhLnZhbHVlcygpO1xuICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICBzaG91bGRCcmVhayA9IGNhbGxiYWNrKFxuICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnNvdXJjZS5rZXksXG4gICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICBlZGdlRGF0YS50YXJnZXQuYXR0cmlidXRlcyxcbiAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBlZ2RlcyBmcm9tIHRoZSBvYmplY3QgYXQgZ2l2ZW4ga2V5LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBvYmplY3QgICAtIFRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gIHttaXhlZH0gICAgayAgICAgICAgLSBOZWlnaGJvciBrZXkuXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSXRlcmF0b3JGb3JLZXkob2JqZWN0LCBrKSB7XG4gIGNvbnN0IHYgPSBvYmplY3Rba107XG5cbiAgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHYudmFsdWVzKCk7XG5cbiAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHNvdXJjZTogZWRnZURhdGEuc291cmNlLmtleSxcbiAgICAgICAgICB0YXJnZXQ6IGVkZ2VEYXRhLnRhcmdldC5rZXksXG4gICAgICAgICAgc291cmNlQXR0cmlidXRlczogZWRnZURhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0QXR0cmlidXRlczogZWRnZURhdGEudGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdW5kaXJlY3RlZDogZWRnZURhdGEudW5kaXJlY3RlZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIEl0ZXJhdG9yLm9mKFtcbiAgICB2LmtleSxcbiAgICB2LmF0dHJpYnV0ZXMsXG4gICAgdi5zb3VyY2Uua2V5LFxuICAgIHYudGFyZ2V0LmtleSxcbiAgICB2LnNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgIHYudGFyZ2V0LmF0dHJpYnV0ZXNcbiAgXSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHJldHVybiB7YXJyYXl9ICAgICAgICAgLSBBcnJheSBvZiBlZGdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWRnZUFycmF5KGdyYXBoLCB0eXBlKSB7XG4gIGlmIChncmFwaC5zaXplID09PSAwKSByZXR1cm4gW107XG5cbiAgaWYgKHR5cGUgPT09ICdtaXhlZCcgfHwgdHlwZSA9PT0gZ3JhcGgudHlwZSkge1xuICAgIGlmICh0eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGdyYXBoLl9lZGdlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UoZ3JhcGguX2VkZ2VzLmtleXMoKSwgZ3JhcGguX2VkZ2VzLnNpemUpO1xuICB9XG5cbiAgY29uc3Qgc2l6ZSA9XG4gICAgdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnID8gZ3JhcGgudW5kaXJlY3RlZFNpemUgOiBncmFwaC5kaXJlY3RlZFNpemU7XG5cbiAgY29uc3QgbGlzdCA9IG5ldyBBcnJheShzaXplKSxcbiAgICBtYXNrID0gdHlwZSA9PT0gJ3VuZGlyZWN0ZWQnO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX2VkZ2VzLnZhbHVlcygpO1xuXG4gIGxldCBpID0gMDtcbiAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChkYXRhLnVuZGlyZWN0ZWQgPT09IG1hc2spIGxpc3RbaSsrXSA9IGRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hFZGdlKGdyYXBoLCB0eXBlLCBjYWxsYmFjaykge1xuICBpZiAoZ3JhcGguc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBsZXQgc3RlcCwgZGF0YTtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fZWRnZXMudmFsdWVzKCk7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgIGlmIChzaG91bGRGaWx0ZXIgJiYgZGF0YS51bmRpcmVjdGVkICE9PSBtYXNrKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHtrZXksIGF0dHJpYnV0ZXMsIHNvdXJjZSwgdGFyZ2V0fSA9IGRhdGE7XG5cbiAgICBjYWxsYmFjayhcbiAgICAgIGtleSxcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBzb3VyY2Uua2V5LFxuICAgICAgdGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZS5hdHRyaWJ1dGVzLFxuICAgICAgdGFyZ2V0LmF0dHJpYnV0ZXMsXG4gICAgICBkYXRhLnVuZGlyZWN0ZWRcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBncmFwaCdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2sgdG8gbWF0Y2ggb25lIG9mXG4gKiB0aGVtLlxuICpcbiAqIEBwYXJhbSAge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBHcmFwaCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZShncmFwaCwgdHlwZSwgY2FsbGJhY2spIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybjtcblxuICBjb25zdCBzaG91bGRGaWx0ZXIgPSB0eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IGdyYXBoLnR5cGU7XG4gIGNvbnN0IG1hc2sgPSB0eXBlID09PSAndW5kaXJlY3RlZCc7XG5cbiAgbGV0IHN0ZXAsIGRhdGE7XG4gIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgIGRhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qge2tleSwgYXR0cmlidXRlcywgc291cmNlLCB0YXJnZXR9ID0gZGF0YTtcblxuICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICBrZXksXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgc291cmNlLmtleSxcbiAgICAgIHRhcmdldC5rZXksXG4gICAgICBzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgIHRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgZGF0YS51bmRpcmVjdGVkXG4gICAgKTtcblxuICAgIGlmIChzaG91bGRCcmVhaykgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjcmVhdGluZyBhbiBpdGVyYXRvciBvZiBlZGdlcyBmb3IgdGhlIGdpdmVuIHR5cGUuXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgIGdyYXBoIC0gVGFyZ2V0IEdyYXBoIGluc3RhbmNlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3IoZ3JhcGgsIHR5cGUpIHtcbiAgaWYgKGdyYXBoLnNpemUgPT09IDApIHJldHVybiBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGNvbnN0IHNob3VsZEZpbHRlciA9IHR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gZ3JhcGgudHlwZTtcbiAgY29uc3QgbWFzayA9IHR5cGUgPT09ICd1bmRpcmVjdGVkJztcblxuICBjb25zdCBpdGVyYXRvciA9IGdyYXBoLl9lZGdlcy52YWx1ZXMoKTtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgbGV0IHN0ZXAsIGRhdGE7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmIChzdGVwLmRvbmUpIHJldHVybiBzdGVwO1xuXG4gICAgICBkYXRhID0gc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHNob3VsZEZpbHRlciAmJiBkYXRhLnVuZGlyZWN0ZWQgIT09IG1hc2spIGNvbnRpbnVlO1xuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGVkZ2U6IGRhdGEua2V5LFxuICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgc291cmNlOiBkYXRhLnNvdXJjZS5rZXksXG4gICAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleSxcbiAgICAgIHNvdXJjZUF0dHJpYnV0ZXM6IGRhdGEuc291cmNlLmF0dHJpYnV0ZXMsXG4gICAgICB0YXJnZXRBdHRyaWJ1dGVzOiBkYXRhLnRhcmdldC5hdHRyaWJ1dGVzLFxuICAgICAgdW5kaXJlY3RlZDogZGF0YS51bmRpcmVjdGVkXG4gICAgfTtcblxuICAgIHJldHVybiB7dmFsdWUsIGRvbmU6IGZhbHNlfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgZWRnZXMgZm9yIHRoZSBnaXZlbiB0eXBlICYgdGhlIGdpdmVuIG5vZGUuXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIGNvbnN0IGVkZ2VzID0gW107XG5cbiAgY29uc3QgZm4gPSBtdWx0aSA/IGNvbGxlY3RNdWx0aSA6IGNvbGxlY3RTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSBmbihlZGdlcywgbm9kZURhdGEuaW4pO1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIGZuKGVkZ2VzLCBub2RlRGF0YS5vdXQpO1xuXG4gICAgLy8gSGFuZGxpbmcgc2VsZiBsb29wIGVkZ2UgY2FzZVxuICAgIGlmICghZGlyZWN0aW9uICYmIG5vZGVEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihub2RlRGF0YS5rZXkpLCAxKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4oZWRnZXMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzIHVzaW5nIGEgY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7Ym9vbGVhbn0gIG11bHRpICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpIG9yIG5vdC5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgLSBUeXBlIG9mIGVkZ2VzIHRvIHJldHJpZXZlLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JOb2RlKG11bHRpLCB0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICBjb25zdCBmbiA9IG11bHRpID8gZm9yRWFjaE11bHRpIDogZm9yRWFjaFNpbXBsZTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIGZuKG5vZGVEYXRhLmluLCBjYWxsYmFjayk7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKG5vZGVEYXRhLm91dCwgY2FsbGJhY2ssICFkaXJlY3Rpb24gPyBub2RlRGF0YS5rZXkgOiBudWxsKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjayB0byBtYXRjaCBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkgb3Igbm90LlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBmaW5kRWRnZUZvck5vZGUobXVsdGksIHR5cGUsIGRpcmVjdGlvbiwgbm9kZURhdGEsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kTXVsdGkgOiBmaW5kU2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZm4obm9kZURhdGEub3V0LCBjYWxsYmFjaywgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvdW5kID0gZm4obm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXMgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZURhdGEgIC0gVGFyZ2V0IG5vZGUncyBkYXRhLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVkZ2VJdGVyYXRvckZvck5vZGUodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSkge1xuICBsZXQgaXRlcmF0b3IgPSBJdGVyYXRvci5lbXB0eSgpO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnb3V0JyAmJiB0eXBlb2Ygbm9kZURhdGEuaW4gIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEuaW4pKTtcbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nICYmIHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihcbiAgICAgICAgaXRlcmF0b3IsXG4gICAgICAgIGNyZWF0ZUl0ZXJhdG9yKG5vZGVEYXRhLm91dCwgIWRpcmVjdGlvbiA/IG5vZGVEYXRhLmtleSA6IG51bGwpXG4gICAgICApO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcgJiYgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3Iobm9kZURhdGEudW5kaXJlY3RlZCkpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGNyZWF0aW5nIGFuIGFycmF5IG9mIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcmV0dXJuIHthcnJheX0gICAgICAgICAgICAgICAtIEFycmF5IG9mIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlQXJyYXlGb3JQYXRoKHR5cGUsIG11bHRpLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEsIHRhcmdldCkge1xuICBjb25zdCBmbiA9IG11bHRpID8gY29sbGVjdEZvcktleU11bHRpIDogY29sbGVjdEZvcktleVNpbXBsZTtcblxuICBjb25zdCBlZGdlcyA9IFtdO1xuXG4gIGlmICh0eXBlICE9PSAndW5kaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEuaW4gIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ291dCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS5pbiwgdGFyZ2V0KTtcblxuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJylcbiAgICAgIGZuKGVkZ2VzLCBzb3VyY2VEYXRhLm91dCwgdGFyZ2V0KTtcblxuICAgIC8vIEhhbmRsaW5nIHNlbGYgbG9vcCBlZGdlIGNhc2VcbiAgICBpZiAoIWRpcmVjdGlvbiAmJiBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzID4gMClcbiAgICAgIGVkZ2VzLnNwbGljZShlZGdlcy5sYXN0SW5kZXhPZihzb3VyY2VEYXRhLmtleSksIDEpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEudW5kaXJlY3RlZCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICBmbihlZGdlcywgc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQpO1xuICB9XG5cbiAgcmV0dXJuIGVkZ2VzO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBtdWx0aSAgICAgIC0gV2hldGhlciB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uICAtIEluIG9yIG91dD9cbiAqIEBwYXJhbSAge05vZGVEYXRhfSBzb3VyY2VEYXRhIC0gU291cmNlIG5vZGUncyBkYXRhLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHRhcmdldCAgICAgLSBUYXJnZXQgbm9kZS5cbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAgIC0gRnVuY3Rpb24gdG8gY2FsbC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEVkZ2VGb3JQYXRoKFxuICB0eXBlLFxuICBtdWx0aSxcbiAgZGlyZWN0aW9uLFxuICBzb3VyY2VEYXRhLFxuICB0YXJnZXQsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgZm4gPSBtdWx0aSA/IGZvckVhY2hGb3JLZXlNdWx0aSA6IGZvckVhY2hGb3JLZXlTaW1wbGU7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5pbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZGlyZWN0aW9uICE9PSAnb3V0JylcbiAgICAgIGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHNvdXJjZURhdGEua2V5ICE9PSB0YXJnZXQpXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZURhdGEub3V0ICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdpbicpXG4gICAgICAgIGZuKHNvdXJjZURhdGEub3V0LCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgZm4oc291cmNlRGF0YS51bmRpcmVjdGVkLCB0YXJnZXQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gcGF0aCB1c2luZyBhIGNhbGxiYWNrIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgICAtIFR5cGUgb2YgZWRnZXMgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gIHtib29sZWFufSAgbXVsdGkgICAgICAtIFdoZXRoZXIgdGhlIGdyYXBoIGlzIG11bHRpLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAgLSBJbiBvciBvdXQ/XG4gKiBAcGFyYW0gIHtOb2RlRGF0YX0gc291cmNlRGF0YSAtIFNvdXJjZSBub2RlJ3MgZGF0YS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0YXJnZXQgICAgIC0gVGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgICAtIEZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRFZGdlRm9yUGF0aCh0eXBlLCBtdWx0aSwgZGlyZWN0aW9uLCBzb3VyY2VEYXRhLCB0YXJnZXQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGZuID0gbXVsdGkgPyBmaW5kRm9yS2V5TXVsdGkgOiBmaW5kRm9yS2V5U2ltcGxlO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3VuZCA9IGZuKHNvdXJjZURhdGEuaW4sIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlRGF0YS5rZXkgIT09IHRhcmdldClcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIGRpcmVjdGlvbiAhPT0gJ2luJykge1xuICAgICAgICBmb3VuZCA9IGZuKFxuICAgICAgICAgIHNvdXJjZURhdGEub3V0LFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAhZGlyZWN0aW9uID8gc291cmNlRGF0YS5rZXkgOiBudWxsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZm91bmQgPSBmbihzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldCwgY2FsbGJhY2spO1xuXG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbi8qKlxuICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG92ZXIgZWRnZXMgZm9yIHRoZSBnaXZlbiBwYXRoLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlICAgICAgIC0gVHlwZSBvZiBlZGdlcyB0byByZXRyaWV2ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gICBkaXJlY3Rpb24gIC0gSW4gb3Igb3V0P1xuICogQHBhcmFtICB7Tm9kZURhdGF9IHNvdXJjZURhdGEgLSBTb3VyY2Ugbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdGFyZ2V0ICAgICAtIFRhcmdldCBub2RlLlxuICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrICAgLSBGdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KSB7XG4gIGxldCBpdGVyYXRvciA9IEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLmluICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgZGlyZWN0aW9uICE9PSAnb3V0JyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEuaW5cbiAgICApXG4gICAgICBpdGVyYXRvciA9IGNoYWluKGl0ZXJhdG9yLCBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLmluLCB0YXJnZXQpKTtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzb3VyY2VEYXRhLm91dCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIGRpcmVjdGlvbiAhPT0gJ2luJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEub3V0XG4gICAgKVxuICAgICAgaXRlcmF0b3IgPSBjaGFpbihpdGVyYXRvciwgY3JlYXRlSXRlcmF0b3JGb3JLZXkoc291cmNlRGF0YS5vdXQsIHRhcmdldCkpO1xuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygc291cmNlRGF0YS51bmRpcmVjdGVkICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdGFyZ2V0IGluIHNvdXJjZURhdGEudW5kaXJlY3RlZFxuICAgIClcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVJdGVyYXRvckZvcktleShzb3VyY2VEYXRhLnVuZGlyZWN0ZWQsIHRhcmdldClcbiAgICAgICk7XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3I7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGFuIGVkZ2UgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlQXJyYXlDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gYXJyYXkgb2YgY2VydGFpbiBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMDogUmV0dXJuIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqXG4gICAqIEFyaXR5IDE6IFJldHVybiBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlICAgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQXJpdHkgMjogUmV0dXJuIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBAcmV0dXJuIHthcnJheXxudW1iZXJ9IC0gVGhlIGVkZ2VzIG9yIHRoZSBudW1iZXIgb2YgZWRnZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSlcbiAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNyZWF0ZUVkZ2VBcnJheSh0aGlzLCB0eXBlKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgYSBub2RlJ3MgZWRnZXNcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlQXJyYXlGb3JOb2RlKFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBub2RlRGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUFycmF5Rm9yUGF0aChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBzb3VyY2VEYXRhLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDAsIDEgb3IgMiBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBhIGVkZ2UgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZm9yRWFjaE5hbWUgPSAnZm9yRWFjaCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgYnkgYXBwbHlpbmcgdGhlIGdpdmVuXG4gICAqIGNhbGxiYWNrLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpIHJldHVybjtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjYWxsYmFjayA9IHNvdXJjZTtcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZSh0aGlzLCB0eXBlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgY2FsbGJhY2sgPSB0YXJnZXQ7XG5cbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke2ZvckVhY2hOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciBhIG5vZGUncyBlZGdlc1xuICAgICAgLy8gVE9ETzogbWF5YmUgYXR0YWNoIHRoZSBzdWIgbWV0aG9kIHRvIHRoZSBpbnN0YW5jZSBkeW5hbWljYWxseT9cbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvck5vZGUoXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIG5vZGVEYXRhLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7Zm9yRWFjaE5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBmb3JFYWNoRWRnZUZvclBhdGgoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMubXVsdGksXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgc291cmNlRGF0YSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IHRvbyBtYW55IGFyZ3VtZW50cyAoZXhwZWN0aW5nIDEsIDIgb3IgMyBhbmQgZ290ICR7YXJndW1lbnRzLmxlbmd0aH0pLmBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBtYXBwaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGJ5IGFwcGx5aW5nIHRoZSBnaXZlblxuICAgKiBjYWxsYmFjay5cbiAgICpcbiAgICogQXJpdHkgMTogTWFwIGFsbCB0aGUgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogTWFwIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogTWFwIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgdGFyZ2V0ICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIGNvbnN0IG1hcE5hbWUgPSAnbWFwJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG5cbiAgQ2xhc3MucHJvdG90eXBlW21hcE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGxldCByZXN1bHQ7XG5cbiAgICAvLyBXZSBrbm93IHRoZSByZXN1bHQgbGVuZ3RoIGJlZm9yZWhhbmRcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBsZW5ndGggPSAwO1xuXG4gICAgICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykgbGVuZ3RoICs9IHRoaXMudW5kaXJlY3RlZFNpemU7XG4gICAgICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSBsZW5ndGggKz0gdGhpcy5kaXJlY3RlZFNpemU7XG5cbiAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG4gICAgICBsZXQgaSA9IDA7XG5cbiAgICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgcmVzdWx0IGxlbmd0aCBiZWZvcmVoYW5kXG4gICAgLy8gVE9ETzogd2UgY2FuIGluIHNvbWUgaW5zdGFuY2VzIG9mIHNpbXBsZSBncmFwaHMsIGtub3dpbmcgZGVncmVlXG4gICAgZWxzZSB7XG4gICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGVcbiAgICogZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEZpbHRlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMjogRmlsdGVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQXJpdHkgMzogRmlsdGVyIHRoZSByZWxldmFudCBlZGdlcyBhY3Jvc3MgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBzb3VyY2UgICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcHJlZGljYXRlIC0gUHJlZGljYXRlIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBmaWx0ZXJOYW1lID0gJ2ZpbHRlcicgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtmaWx0ZXJOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgaWYgKGNhbGxiYWNrKGUsIGVhLCBzLCB0LCBzYSwgdGEsIHUpKSByZXN1bHQucHVzaChlKTtcbiAgICB9KTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIGdyYXBoJ3MgcmVsZXZhbnQgZWRnZXMgdXNpbmcgdGhlIHByb3ZpZGVkIGFjY3VtdWxhdG9yXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBSZWR1Y2UgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDI6IFJlZHVjZSBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEFyaXR5IDM6IFJlZHVjZSB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgICAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGFjY3VtdWxhdG9yICAtIEFjY3VtdWxhdG9yIHRvIHVzZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIGluaXRpYWxWYWx1ZSAtIEluaXRpYWwgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgcmVkdWNlTmFtZSA9ICdyZWR1Y2UnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbcmVkdWNlTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMiB8fCBhcmdzLmxlbmd0aCA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoZXhwZWN0aW5nIDIsIDMgb3IgNCBhbmQgZ290ICR7YXJncy5sZW5ndGh9KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMl0gIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7cmVkdWNlTmFtZX06IG1pc3NpbmcgaW5pdGlhbCB2YWx1ZS4gWW91IG11c3QgcHJvdmlkZSBpdCBiZWNhdXNlIHRoZSBjYWxsYmFjayB0YWtlcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGFuZCB3ZSBjYW5ub3QgaW5mZXIgdGhlIGluaXRpYWwgdmFsdWUgZnJvbSB0aGUgZmlyc3QgaXRlcmF0aW9uLCBhcyB5b3UgY291bGQgd2l0aCBhIHNpbXBsZSBhcnJheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBjYWxsYmFjaztcbiAgICBsZXQgaW5pdGlhbFZhbHVlO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICBpbml0aWFsVmFsdWUgPSBhcmdzWzFdO1xuICAgICAgYXJncyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbMl07XG4gICAgICBhcmdzID0gW2FyZ3NbMF1dO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJnc1syXTtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IGFyZ3NbM107XG4gICAgICBhcmdzID0gW2FyZ3NbMF0sIGFyZ3NbMV1dO1xuICAgIH1cblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBicmVha2FibGUgZWRnZSBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoXG4gKiBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZEVkZ2UoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgZmluZEVkZ2VOYW1lID0gJ2ZpbmQnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIG1hdGNoXG4gICAqIG9uZSBvZiB0aGVtIHVzaW5nIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBDbGFzcy5wcm90b3R5cGVbZmluZEVkZ2VOYW1lXSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY2FsbGJhY2sgPSBzb3VyY2U7XG4gICAgICByZXR1cm4gZmluZEVkZ2UodGhpcywgdHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIGNhbGxiYWNrID0gdGFyZ2V0O1xuXG4gICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgICBpZiAodHlwZW9mIG5vZGVEYXRhID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICAvLyBUT0RPOiBtYXliZSBhdHRhY2ggdGhlIHN1YiBtZXRob2QgdG8gdGhlIGluc3RhbmNlIGR5bmFtaWNhbGx5P1xuICAgICAgcmV0dXJuIGZpbmRFZGdlRm9yTm9kZShcbiAgICAgICAgdGhpcy5tdWx0aSxcbiAgICAgICAgdHlwZSA9PT0gJ21peGVkJyA/IHRoaXMudHlwZSA6IHR5cGUsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbm9kZURhdGEsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLl9ub2Rlcy5oYXModGFyZ2V0KSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtmaW5kRWRnZU5hbWV9OiAgY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXRlcmF0aW5nIG92ZXIgdGhlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0XG4gICAgICByZXR1cm4gZmluZEVkZ2VGb3JQYXRoKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLm11bHRpLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIHNvdXJjZURhdGEsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7ZmluZEVkZ2VOYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMSwgMiBvciAzIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFueSBvbmUgb2YgdGhlbSBtYXRjaGVzIHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIEFyaXR5IDE6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDI6IEl0ZXJhdGUgb3ZlciBhbGwgb2YgYSBub2RlJ3MgcmVsZXZhbnQgZWRnZXMuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEFyaXR5IDM6IEl0ZXJhdGUgb3ZlciB0aGUgcmVsZXZhbnQgZWRnZXMgYWNyb3NzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgc291cmNlICAgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHRhcmdldCAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtzb21lTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuXG4gICAgYXJncy5wdXNoKChlLCBlYSwgcywgdCwgc2EsIHRhLCB1KSA9PiB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZEVkZ2VOYW1lXS5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIHJlbGV2YW50IGVkZ2VzIGluIG9yZGVyIHRvIGFzc2VydFxuICAgKiB3aGV0aGVyIGFsbCBvZiB0aGVtIG1hdGNoZSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBBcml0eSAxOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgYWxsIG9mIGEgbm9kZSdzIHJlbGV2YW50IGVkZ2VzLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBBcml0eSAzOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgIHNvdXJjZSAgIC0gU291cmNlIG5vZGUuXG4gICAqIEBwYXJhbSAge2FueX0gICAgICB0YXJnZXQgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSwgLTEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtldmVyeU5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgIGFyZ3MucHVzaCgoZSwgZWEsIHMsIHQsIHNhLCB0YSwgdSkgPT4ge1xuICAgICAgcmV0dXJuICFjYWxsYmFjayhlLCBlYSwgcywgdCwgc2EsIHRhLCB1KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kRWRnZU5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYW4gZWRnZSBpdGVyYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hFZGdlSXRlcmF0b3JDcmVhdG9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZTogb3JpZ2luYWxOYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgbmFtZSA9IG9yaWdpbmFsTmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIGVkZ2VzLlxuICAgKlxuICAgKiBBcml0eSAwOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWxldmFudCBlZGdlcy5cbiAgICpcbiAgICogQXJpdHkgMTogSXRlcmF0ZSBvdmVyIGFsbCBvZiBhIG5vZGUncyByZWxldmFudCBlZGdlcy5cbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgICAtIFRhcmdldCBub2RlLlxuICAgKlxuICAgKiBBcml0eSAyOiBJdGVyYXRlIG92ZXIgdGhlIHJlbGV2YW50IGVkZ2VzIGFjcm9zcyB0aGUgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtICB7YW55fSAgIHNvdXJjZSAtIFNvdXJjZSBub2RlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgdGFyZ2V0IC0gVGFyZ2V0IG5vZGUuXG4gICAqXG4gICAqIEByZXR1cm4ge2FycmF5fG51bWJlcn0gLSBUaGUgZWRnZXMgb3IgdGhlIG51bWJlciBvZiBlZGdlcy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIEl0ZXJhdG9yLmVtcHR5KCk7XG5cbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3IodGhpcywgdHlwZSk7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG5cbiAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGluZyBvdmVyIGEgbm9kZSdzIGVkZ2VzXG4gICAgICByZXR1cm4gY3JlYXRlRWRnZUl0ZXJhdG9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIHNvdXJjZURhdGEpO1xuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBzb3VyY2UgPSAnJyArIHNvdXJjZTtcbiAgICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghc291cmNlRGF0YSlcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgICBgR3JhcGguJHtuYW1lfTogIGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7c291cmNlfVwiIHNvdXJjZSBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06ICBjb3VsZCBub3QgZmluZCB0aGUgXCIke3RhcmdldH1cIiB0YXJnZXQgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuXG4gICAgICAvLyBJdGVyYXRpbmcgb3ZlciB0aGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXRcbiAgICAgIHJldHVybiBjcmVhdGVFZGdlSXRlcmF0b3JGb3JQYXRoKHR5cGUsIGRpcmVjdGlvbiwgc291cmNlRGF0YSwgdGFyZ2V0KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdG9vIG1hbnkgYXJndW1lbnRzIChleHBlY3RpbmcgMCwgMSBvciAyIGFuZCBnb3QgJHthcmd1bWVudHMubGVuZ3RofSkuYFxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGV2ZXJ5IGVkZ2UgaXRlcmF0aW9uIG1ldGhvZCB0byB0aGUgR3JhcGggY2xhc3MuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gR3JhcGggLSBHcmFwaCBjbGFzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgRURHRVNfSVRFUkFUSU9OLmZvckVhY2goZGVzY3JpcHRpb24gPT4ge1xuICAgIGF0dGFjaEVkZ2VBcnJheUNyZWF0b3IoR3JhcGgsIGRlc2NyaXB0aW9uKTtcbiAgICBhdHRhY2hGb3JFYWNoRWRnZShHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmRFZGdlKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gICAgYXR0YWNoRWRnZUl0ZXJhdG9yQ3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgTmVpZ2hib3IgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBBdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSBHcmFwaCBjbGFzcyB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb3ZlclxuICogbmVpZ2hib3JzLlxuICovXG5pbXBvcnQgSXRlcmF0b3IgZnJvbSAnb2JsaXRlcmF0b3IvaXRlcmF0b3InO1xuaW1wb3J0IGNoYWluIGZyb20gJ29ibGl0ZXJhdG9yL2NoYWluJztcbmltcG9ydCB0YWtlIGZyb20gJ29ibGl0ZXJhdG9yL3Rha2UnO1xuXG5pbXBvcnQge05vdEZvdW5kR3JhcGhFcnJvciwgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogRGVmaW5pdGlvbnMuXG4gKi9cbmNvbnN0IE5FSUdIQk9SU19JVEVSQVRJT04gPSBbXG4gIHtcbiAgICBuYW1lOiAnbmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnaW5OZWlnaGJvcnMnLFxuICAgIHR5cGU6ICdkaXJlY3RlZCcsXG4gICAgZGlyZWN0aW9uOiAnaW4nXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnb3V0TmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdpbmJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ2luJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ291dGJvdW5kTmVpZ2hib3JzJyxcbiAgICB0eXBlOiAnbWl4ZWQnLFxuICAgIGRpcmVjdGlvbjogJ291dCdcbiAgfSxcbiAge1xuICAgIG5hbWU6ICdkaXJlY3RlZE5laWdoYm9ycycsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogJ3VuZGlyZWN0ZWROZWlnaGJvcnMnLFxuICAgIHR5cGU6ICd1bmRpcmVjdGVkJ1xuICB9XG5dO1xuXG4vKipcbiAqIEZ1bmN0aW9uIG1lcmdpbmcgbmVpZ2hib3JzIGludG8gdGhlIGdpdmVuIHNldCBpdGVyYXRpbmcgb3ZlciB0aGUgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QmFzaWNTZXR9IG5laWdoYm9ycyAtIE5laWdoYm9ycyBzZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gICBvYmplY3QgICAgLSBUYXJnZXQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBtZXJnZShuZWlnaGJvcnMsIG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IG5laWdoYm9yIGluIG9iamVjdCkgbmVpZ2hib3JzLmFkZChuZWlnaGJvcik7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gY3JlYXRpbmcgYW4gYXJyYXkgb2YgcmVsZXZhbnQgbmVpZ2hib3JzIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICBkaXJlY3Rpb24gLSBEaXJlY3Rpb24uXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICAgICAgIC0gVGhlIGxpc3Qgb2YgbmVpZ2hib3JzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVOZWlnaGJvckFycmF5Rm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIE9iamVjdC5rZXlzKG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gT2JqZWN0LmtleXMobm9kZURhdGFbZGlyZWN0aW9uXSk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IG5laWdoYm9ycyA9IG5ldyBTZXQoKTtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIG1lcmdlKG5laWdoYm9ycywgbm9kZURhdGEuaW4pO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLm91dCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBtZXJnZShuZWlnaGJvcnMsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpO1xuICB9XG5cbiAgcmV0dXJuIHRha2UobmVpZ2hib3JzLnZhbHVlcygpLCBuZWlnaGJvcnMuc2l6ZSk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgdGhlIGdpdmVuIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYVxuICogY2FsbGJhY2suXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlLFxuICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgIGNvbnN0IG5laWdoYm9yRGF0YSA9IHNvdXJjZURhdGEgPT09IG5vZGVEYXRhID8gdGFyZ2V0RGF0YSA6IHNvdXJjZURhdGE7XG5cbiAgICBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgb2JqZWN0LCBjYWxsYmFjaykge1xuICBmb3IgKGNvbnN0IGsgaW4gb2JqZWN0KSB7XG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tdO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNhbGxiYWNrKG5laWdoYm9yRGF0YS5rZXksIG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIHRoZSBnaXZlbiBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIG1hdGNoXG4gKiBvbmUgb2YgdGhlbSB1c2luZyBhIHByZWRpY2F0ZWQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgIHR5cGUgICAgICAtIFR5cGUgb2YgbmVpZ2hib3JzLlxuICogQHBhcmFtICB7c3RyaW5nfSAgIGRpcmVjdGlvbiAtIERpcmVjdGlvbi5cbiAqIEBwYXJhbSAge2FueX0gICAgICBub2RlRGF0YSAgLSBUYXJnZXQgbm9kZSdzIGRhdGEuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICovXG5mdW5jdGlvbiBmaW5kSW5PYmplY3Qobm9kZURhdGEsIG9iamVjdCwgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBrIGluIG9iamVjdCkge1xuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrXTtcblxuICAgIGlmIChlZGdlRGF0YSBpbnN0YW5jZW9mIFNldCkgZWRnZURhdGEgPSBlZGdlRGF0YS52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gZWRnZURhdGEuc291cmNlO1xuICAgIGNvbnN0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgY29uc3Qgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhuZWlnaGJvckRhdGEua2V5LCBuZWlnaGJvckRhdGEuYXR0cmlidXRlcyk7XG5cbiAgICBpZiAoc2hvdWxkQnJlYWspIHJldHVybiBuZWlnaGJvckRhdGEua2V5O1xuICB9XG5cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBvYmplY3QsIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3QgayBpbiBvYmplY3QpIHtcbiAgICBsZXQgZWRnZURhdGEgPSBvYmplY3Rba107XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIGlmICh2aXNpdGVkLmhhcyhuZWlnaGJvckRhdGEua2V5KSkgY29udGludWU7XG5cbiAgICB2aXNpdGVkLmFkZChuZWlnaGJvckRhdGEua2V5KTtcblxuICAgIGNvbnN0IHNob3VsZEJyZWFrID0gY2FsbGJhY2sobmVpZ2hib3JEYXRhLmtleSwgbmVpZ2hib3JEYXRhLmF0dHJpYnV0ZXMpO1xuXG4gICAgaWYgKHNob3VsZEJyZWFrKSByZXR1cm4gbmVpZ2hib3JEYXRhLmtleTtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaE5laWdoYm9yRm9yTm9kZSh0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhLCBjYWxsYmFjaykge1xuICAvLyBJZiB3ZSB3YW50IG9ubHkgdW5kaXJlY3RlZCBvciBpbiBvciBvdXQsIHdlIGNhbiByb2xsIHNvbWUgb3B0aW1pemF0aW9uc1xuICBpZiAodHlwZSAhPT0gJ21peGVkJykge1xuICAgIGlmICh0eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gZm9yRWFjaEluT2JqZWN0KG5vZGVEYXRhLCBub2RlRGF0YVtkaXJlY3Rpb25dLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbiwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uICE9PSAnaW4nKSB7XG4gICAgICBmb3JFYWNoSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5vdXQsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgIGZvckVhY2hJbk9iamVjdE9uY2UodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQsIGNhbGxiYWNrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kTmVpZ2hib3IodHlwZSwgZGlyZWN0aW9uLCBub2RlRGF0YSwgY2FsbGJhY2spIHtcbiAgLy8gSWYgd2Ugd2FudCBvbmx5IHVuZGlyZWN0ZWQgb3IgaW4gb3Igb3V0LCB3ZSBjYW4gcm9sbCBzb21lIG9wdGltaXphdGlvbnNcbiAgaWYgKHR5cGUgIT09ICdtaXhlZCcpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCwgY2FsbGJhY2spO1xuXG4gICAgaWYgKHR5cGVvZiBkaXJlY3Rpb24gPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGZpbmRJbk9iamVjdChub2RlRGF0YSwgbm9kZURhdGFbZGlyZWN0aW9uXSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gRWxzZSB3ZSBuZWVkIHRvIGtlZXAgYSBzZXQgb2YgbmVpZ2hib3JzIG5vdCB0byByZXR1cm4gZHVwbGljYXRlc1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldCgpO1xuXG4gIGxldCBmb3VuZDtcblxuICBpZiAodHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ291dCcpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEuaW4sIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGZvdW5kID0gZmluZEluT2JqZWN0T25jZSh2aXNpdGVkLCBub2RlRGF0YSwgbm9kZURhdGEub3V0LCBjYWxsYmFjayk7XG5cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgZm91bmQgPSBmaW5kSW5PYmplY3RPbmNlKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS51bmRpcmVjdGVkLCBjYWxsYmFjayk7XG5cbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gbm9kZSdzIHJlbGV2YW50IG5laWdoYm9ycy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZSAgICAgIC0gVHlwZSBvZiBuZWlnaGJvcnMuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgZGlyZWN0aW9uIC0gRGlyZWN0aW9uLlxuICogQHBhcmFtICB7YW55fSAgICAgIG5vZGVEYXRhICAtIFRhcmdldCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgb2JqZWN0KSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLFxuICAgIGwgPSBrZXlzLmxlbmd0aDtcblxuICBsZXQgaSA9IDA7XG5cbiAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGkgPj0gbCkgcmV0dXJuIHtkb25lOiB0cnVlfTtcblxuICAgIGxldCBlZGdlRGF0YSA9IG9iamVjdFtrZXlzW2krK11dO1xuXG4gICAgaWYgKGVkZ2VEYXRhIGluc3RhbmNlb2YgU2V0KSBlZGdlRGF0YSA9IGVkZ2VEYXRhLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgIGNvbnN0IHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2UsXG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgY29uc3QgbmVpZ2hib3JEYXRhID0gc291cmNlRGF0YSA9PT0gbm9kZURhdGEgPyB0YXJnZXREYXRhIDogc291cmNlRGF0YTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlOiB7bmVpZ2hib3I6IG5laWdoYm9yRGF0YS5rZXksIGF0dHJpYnV0ZXM6IG5laWdoYm9yRGF0YS5hdHRyaWJ1dGVzfVxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG9iamVjdCkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KSxcbiAgICBsID0ga2V5cy5sZW5ndGg7XG5cbiAgbGV0IGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgbGV0IGVkZ2VEYXRhID0gb2JqZWN0W2tleXNbaSsrXV07XG5cbiAgICBpZiAoZWRnZURhdGEgaW5zdGFuY2VvZiBTZXQpIGVkZ2VEYXRhID0gZWRnZURhdGEudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IGVkZ2VEYXRhLnNvdXJjZSxcbiAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICBjb25zdCBuZWlnaGJvckRhdGEgPSBzb3VyY2VEYXRhID09PSBub2RlRGF0YSA/IHRhcmdldERhdGEgOiBzb3VyY2VEYXRhO1xuXG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5laWdoYm9yRGF0YS5rZXkpKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgdmlzaXRlZC5hZGQobmVpZ2hib3JEYXRhLmtleSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZToge25laWdoYm9yOiBuZWlnaGJvckRhdGEua2V5LCBhdHRyaWJ1dGVzOiBuZWlnaGJvckRhdGEuYXR0cmlidXRlc31cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcih0eXBlLCBkaXJlY3Rpb24sIG5vZGVEYXRhKSB7XG4gIC8vIElmIHdlIHdhbnQgb25seSB1bmRpcmVjdGVkIG9yIGluIG9yIG91dCwgd2UgY2FuIHJvbGwgc29tZSBvcHRpbWl6YXRpb25zXG4gIGlmICh0eXBlICE9PSAnbWl4ZWQnKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJdGVyYXRvcihub2RlRGF0YSwgbm9kZURhdGEudW5kaXJlY3RlZCk7XG5cbiAgICBpZiAodHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICByZXR1cm4gY3JlYXRlT2JqZWN0SXRlcmF0b3Iobm9kZURhdGEsIG5vZGVEYXRhW2RpcmVjdGlvbl0pO1xuICB9XG5cbiAgbGV0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAvLyBFbHNlIHdlIG5lZWQgdG8ga2VlcCBhIHNldCBvZiBuZWlnaGJvcnMgbm90IHRvIHJldHVybiBkdXBsaWNhdGVzXG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgIGlmIChkaXJlY3Rpb24gIT09ICdvdXQnKSB7XG4gICAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgICBpdGVyYXRvcixcbiAgICAgICAgY3JlYXRlRGVkdXBlZE9iamVjdEl0ZXJhdG9yKHZpc2l0ZWQsIG5vZGVEYXRhLCBub2RlRGF0YS5pbilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJlY3Rpb24gIT09ICdpbicpIHtcbiAgICAgIGl0ZXJhdG9yID0gY2hhaW4oXG4gICAgICAgIGl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLm91dClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICBpdGVyYXRvciA9IGNoYWluKFxuICAgICAgaXRlcmF0b3IsXG4gICAgICBjcmVhdGVEZWR1cGVkT2JqZWN0SXRlcmF0b3IodmlzaXRlZCwgbm9kZURhdGEsIG5vZGVEYXRhLnVuZGlyZWN0ZWQpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvcjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgYXJyYXkgY3JlYXRvciBtZXRob2QgdG8gdGhlIEdyYXBoIHByb3RvdHlwZS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzcyAgICAgICAtIFRhcmdldCBjbGFzcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc2NyaXB0aW9uIC0gTWV0aG9kIGRlc2NyaXB0aW9uLlxuICovXG5mdW5jdGlvbiBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihDbGFzcywgZGVzY3JpcHRpb24pIHtcbiAgY29uc3Qge25hbWUsIHR5cGUsIGRpcmVjdGlvbn0gPSBkZXNjcmlwdGlvbjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGFuIGFycmF5IG9mIGNlcnRhaW4gbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgbm9kZSAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEByZXR1cm4ge2FycmF5fSAtIFRoZSBuZWlnaGJvcnMgb2YgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIG5vZGUgaXMgbm90IGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodHlwZSAhPT0gJ21peGVkJyAmJiB0aGlzLnR5cGUgIT09ICdtaXhlZCcgJiYgdHlwZSAhPT0gdGhpcy50eXBlKVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtuYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JBcnJheUZvck5vZGUoXG4gICAgICB0eXBlID09PSAnbWl4ZWQnID8gdGhpcy50eXBlIDogdHlwZSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIG5vZGVEYXRhXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRm9yRWFjaE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGZvckVhY2hOYW1lID0gJ2ZvckVhY2gnICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxLCAtMSk7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZvckVhY2hOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmb3JFYWNoTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgZm9yRWFjaE5laWdoYm9yRm9yTm9kZShcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG1hcHBpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBtYXBOYW1lID0gJ21hcCcgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVttYXBOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIFRPRE86IG9wdGltaXplIHdoZW4gc2l6ZSBpcyBrbm93biBiZWZvcmVoYW5kXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2sobiwgYSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZmlsdGVyaW5nIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdXNpbmcgYSBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZmlsdGVyTmFtZSA9ICdmaWx0ZXInICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcblxuICBDbGFzcy5wcm90b3R5cGVbZmlsdGVyTmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHRoaXNbZm9yRWFjaE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICBpZiAoY2FsbGJhY2sobiwgYSkpIHJlc3VsdC5wdXNoKG4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gcmVkdWNpbmcgdGhlIHJlbGV2YW50IG5laWdoYm9ycyB1c2luZyBhIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCByZWR1Y2VOYW1lID0gJ3JlZHVjZScgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuXG4gIENsYXNzLnByb3RvdHlwZVtyZWR1Y2VOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaywgaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtyZWR1Y2VOYW1lfTogbWlzc2luZyBpbml0aWFsIHZhbHVlLiBZb3UgbXVzdCBwcm92aWRlIGl0IGJlY2F1c2UgdGhlIGNhbGxiYWNrIHRha2VzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgYW5kIHdlIGNhbm5vdCBpbmZlciB0aGUgaW5pdGlhbCB2YWx1ZSBmcm9tIHRoZSBmaXJzdCBpdGVyYXRpb24sIGFzIHlvdSBjb3VsZCB3aXRoIGEgc2ltcGxlIGFycmF5LmBcbiAgICAgICk7XG5cbiAgICBsZXQgYWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG5cbiAgICB0aGlzW2ZvckVhY2hOYW1lXShub2RlLCAobiwgYSkgPT4ge1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbiwgYSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gYXR0YWNoaW5nIGEgYnJlYWthYmxlIG5laWdoYm9ycyBjYWxsYmFjayBpdGVyYXRvciBtZXRob2QgdG8gdGhlXG4gKiBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoRmluZE5laWdoYm9yKENsYXNzLCBkZXNjcmlwdGlvbikge1xuICBjb25zdCB7bmFtZSwgdHlwZSwgZGlyZWN0aW9ufSA9IGRlc2NyaXB0aW9uO1xuXG4gIGNvbnN0IGNhcGl0YWxpemVkU2luZ3VsYXIgPSBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEsIC0xKTtcblxuICBjb25zdCBmaW5kTmFtZSA9ICdmaW5kJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHVzaW5nIGEgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAtIFRhcmdldCBub2RlLlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byB1c2UuXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgQ2xhc3MucHJvdG90eXBlW2ZpbmROYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gICAgaWYgKHR5cGUgIT09ICdtaXhlZCcgJiYgdGhpcy50eXBlICE9PSAnbWl4ZWQnICYmIHR5cGUgIT09IHRoaXMudHlwZSkgcmV0dXJuO1xuXG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlRGF0YSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguJHtmaW5kTmFtZX06IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgLy8gSGVyZSwgd2Ugd2FudCB0byBpdGVyYXRlIG92ZXIgYSBub2RlJ3MgcmVsZXZhbnQgbmVpZ2hib3JzXG4gICAgcmV0dXJuIGZpbmROZWlnaGJvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGEsXG4gICAgICBjYWxsYmFja1xuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzIHRvIGZpbmQgaWYgYW55IG9mIHRoZW1cbiAgICogbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gdXNlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZXJlIGFyZSB0b28gbWFueSBhcmd1bWVudHMuXG4gICAqL1xuICBjb25zdCBzb21lTmFtZSA9ICdzb21lJyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW3NvbWVOYW1lXSA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpc1tmaW5kTmFtZV0obm9kZSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZSByZWxldmFudCBuZWlnaGJvcnMgdG8gZmluZCBpZiBhbGwgb2YgdGhlbVxuICAgKiBtYXRjaGUgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgIG5vZGUgICAgIC0gVGFyZ2V0IG5vZGUuXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgYXJndW1lbnRzLlxuICAgKi9cbiAgY29uc3QgZXZlcnlOYW1lID0gJ2V2ZXJ5JyArIGNhcGl0YWxpemVkU2luZ3VsYXI7XG5cbiAgQ2xhc3MucHJvdG90eXBlW2V2ZXJ5TmFtZV0gPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXNbZmluZE5hbWVdKG5vZGUsIChuLCBhKSA9PiB7XG4gICAgICByZXR1cm4gIWNhbGxiYWNrKG4sIGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBhdHRhY2hpbmcgYSBuZWlnaGJvcnMgY2FsbGJhY2sgaXRlcmF0b3IgbWV0aG9kIHRvIHRoZSBHcmFwaCBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gQ2xhc3MgICAgICAgLSBUYXJnZXQgY2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gICBkZXNjcmlwdGlvbiAtIE1ldGhvZCBkZXNjcmlwdGlvbi5cbiAqL1xuZnVuY3Rpb24gYXR0YWNoTmVpZ2hib3JJdGVyYXRvckNyZWF0b3IoQ2xhc3MsIGRlc2NyaXB0aW9uKSB7XG4gIGNvbnN0IHtuYW1lLCB0eXBlLCBkaXJlY3Rpb259ID0gZGVzY3JpcHRpb247XG5cbiAgY29uc3QgaXRlcmF0b3JOYW1lID0gbmFtZS5zbGljZSgwLCAtMSkgKyAnRW50cmllcyc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgcmVsZXZhbnQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgbm9kZSAgICAgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGFyZ3VtZW50cy5cbiAgICovXG4gIENsYXNzLnByb3RvdHlwZVtpdGVyYXRvck5hbWVdID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0eXBlICE9PSAnbWl4ZWQnICYmIHRoaXMudHlwZSAhPT0gJ21peGVkJyAmJiB0eXBlICE9PSB0aGlzLnR5cGUpXG4gICAgICByZXR1cm4gSXRlcmF0b3IuZW1wdHkoKTtcblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICh0eXBlb2Ygbm9kZURhdGEgPT09ICd1bmRlZmluZWQnKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7aXRlcmF0b3JOYW1lfTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBIZXJlLCB3ZSB3YW50IHRvIGl0ZXJhdGUgb3ZlciBhIG5vZGUncyByZWxldmFudCBuZWlnaGJvcnNcbiAgICByZXR1cm4gY3JlYXRlTmVpZ2hib3JJdGVyYXRvcihcbiAgICAgIHR5cGUgPT09ICdtaXhlZCcgPyB0aGlzLnR5cGUgOiB0eXBlLFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgbm9kZURhdGFcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGF0dGFjaGluZyBldmVyeSBuZWlnaGJvciBpdGVyYXRpb24gbWV0aG9kIHRvIHRoZSBHcmFwaCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBHcmFwaCAtIEdyYXBoIGNsYXNzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpIHtcbiAgTkVJR0hCT1JTX0lURVJBVElPTi5mb3JFYWNoKGRlc2NyaXB0aW9uID0+IHtcbiAgICBhdHRhY2hOZWlnaGJvckFycmF5Q3JlYXRvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZvckVhY2hOZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaEZpbmROZWlnaGJvcihHcmFwaCwgZGVzY3JpcHRpb24pO1xuICAgIGF0dGFjaE5laWdoYm9ySXRlcmF0b3JDcmVhdG9yKEdyYXBoLCBkZXNjcmlwdGlvbik7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogR3JhcGhvbG9neSBBZGphY2VuY3kgSXRlcmF0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEF0dGFjaGluZyBzb21lIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFcbiAqIGdyYXBoJ3MgYWRqYWNlbmN5LlxuICovXG5cbi8qKlxuICogRnVuY3Rpb24gaXRlcmF0aW5nIG92ZXIgYSBzaW1wbGUgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoXG4gIGJyZWFrYWJsZSxcbiAgYXNzeW1ldHJpYyxcbiAgZGlzY29ubmVjdGVkTm9kZXMsXG4gIGdyYXBoLFxuICBjYWxsYmFja1xuKSB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gZ3JhcGguX25vZGVzLnZhbHVlcygpO1xuXG4gIGNvbnN0IHR5cGUgPSBncmFwaC50eXBlO1xuXG4gIGxldCBzdGVwLCBzb3VyY2VEYXRhLCBuZWlnaGJvciwgYWRqLCBlZGdlRGF0YSwgdGFyZ2V0RGF0YSwgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBoYXNFZGdlcyA9IHRydWU7XG4gICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIHRhcmdldERhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS5rZXksXG4gICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBhZGogPSBzb3VyY2VEYXRhLnVuZGlyZWN0ZWQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGlmIChhc3N5bWV0cmljICYmIHNvdXJjZURhdGEua2V5ID4gbmVpZ2hib3IpIGNvbnRpbnVlO1xuXG4gICAgICAgIGVkZ2VEYXRhID0gYWRqW25laWdoYm9yXTtcbiAgICAgICAgdGFyZ2V0RGF0YSA9IGVkZ2VEYXRhLnRhcmdldDtcblxuICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgIGhhc0VkZ2VzID0gdHJ1ZTtcbiAgICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICB0YXJnZXREYXRhLmtleSxcbiAgICAgICAgICBzb3VyY2VEYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLmtleSxcbiAgICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYnJlYWthYmxlICYmIHNob3VsZEJyZWFrKSByZXR1cm4gZWRnZURhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGl0ZXJhdGluZyBvdmVyIGEgbXVsdGkgZ3JhcGgncyBhZGphY2VuY3kgdXNpbmcgYSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59ICBicmVha2FibGUgICAgICAgICAtIENhbiB3ZSBicmVhaz9cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gIGFzc3ltZXRyaWMgICAgICAgIC0gV2hldGhlciB0byBlbWl0IHVuZGlyZWN0ZWQgZWRnZXMgb25seSBvbmNlLlxuICogQHBhcmFtIHtib29sZWFufSAgZGlzY29ubmVjdGVkTm9kZXMgLSBXaGV0aGVyIHRvIGVtaXQgZGlzY29ubmVjdGVkIG5vZGVzLlxuICogQHBhcmFtIHtHcmFwaH0gICAgZ3JhcGggICAgICAgICAgICAgLSBUYXJnZXQgR3JhcGggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2NhbGxiYWNrfSBmdW5jdGlvbiAgICAgICAgICAtIEl0ZXJhdGlvbiBjYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hBZGphY2VuY3lNdWx0aShcbiAgYnJlYWthYmxlLFxuICBhc3N5bWV0cmljLFxuICBkaXNjb25uZWN0ZWROb2RlcyxcbiAgZ3JhcGgsXG4gIGNhbGxiYWNrXG4pIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbiAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbiAgbGV0IHN0ZXA7XG4gIGxldCBzb3VyY2VEYXRhO1xuICBsZXQgbmVpZ2hib3I7XG4gIGxldCBjb250YWluZXI7XG4gIGxldCBjb250YWluZXJTdGVwO1xuICBsZXQgYWRqO1xuICBsZXQgZWRnZURhdGE7XG4gIGxldCB0YXJnZXREYXRhO1xuICBsZXQgc2hvdWxkQnJlYWs7XG5cbiAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICBsZXQgaGFzRWRnZXMgPSBmYWxzZTtcblxuICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG5cbiAgICAgIGZvciAobmVpZ2hib3IgaW4gYWRqKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGFkaltuZWlnaGJvcl0udmFsdWVzKCk7XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICgoY29udGFpbmVyU3RlcCA9IGNvbnRhaW5lci5uZXh0KCkpLCBjb250YWluZXJTdGVwLmRvbmUgIT09IHRydWUpXG4gICAgICAgICkge1xuICAgICAgICAgIGVkZ2VEYXRhID0gY29udGFpbmVyU3RlcC52YWx1ZTtcbiAgICAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcblxuICAgICAgZm9yIChuZWlnaGJvciBpbiBhZGopIHtcbiAgICAgICAgaWYgKGFzc3ltZXRyaWMgJiYgc291cmNlRGF0YS5rZXkgPiBuZWlnaGJvcikgY29udGludWU7XG5cbiAgICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgKChjb250YWluZXJTdGVwID0gY29udGFpbmVyLm5leHQoKSksIGNvbnRhaW5lclN0ZXAuZG9uZSAhPT0gdHJ1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZWRnZURhdGEgPSBjb250YWluZXJTdGVwLnZhbHVlO1xuICAgICAgICAgIHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0RGF0YS5rZXkgIT09IG5laWdoYm9yKSB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4gICAgICAgICAgaGFzRWRnZXMgPSB0cnVlO1xuICAgICAgICAgIHNob3VsZEJyZWFrID0gY2FsbGJhY2soXG4gICAgICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgICAgIHRhcmdldERhdGEua2V5LFxuICAgICAgICAgICAgc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICAgICAgZWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIGVkZ2VEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpc2Nvbm5lY3RlZE5vZGVzICYmICFoYXNFZGdlcykge1xuICAgICAgc2hvdWxkQnJlYWsgPSBjYWxsYmFjayhcbiAgICAgICAgc291cmNlRGF0YS5rZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcblxuICAgICAgaWYgKGJyZWFrYWJsZSAmJiBzaG91bGRCcmVhaykgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuXG4vLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQWRqYWNlbmN5SXRlcmF0b3JTaW1wbGUoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBhZGosXG4vLyAgICAgb2Zmc2V0O1xuXG4vLyAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gbmV4dCgpIHtcbi8vICAgICBsZXQgc3RlcDtcblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ291dGVyJykge1xuLy8gICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuLy8gICAgICAgaWYgKHN0ZXAuZG9uZSA9PT0gdHJ1ZSkgcmV0dXJuIHN0ZXA7XG5cbi8vICAgICAgIHNvdXJjZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4vLyAgICAgICBzdGF0ZSA9ICdkaXJlY3RlZCc7XG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgaWYgKHR5cGUgPT09ICd1bmRpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS5vdXQ7XG4vLyAgICAgICBuZWlnaGJvcnMgPSBPYmplY3Qua2V5cyhzb3VyY2VEYXRhLm91dCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGlmIChzdGF0ZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGVkJykge1xuLy8gICAgICAgICBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIGFkaiA9IHNvdXJjZURhdGEudW5kaXJlY3RlZDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEudW5kaXJlY3RlZCk7XG4vLyAgICAgICBvZmZzZXQgPSAwO1xuLy8gICAgICAgc3RhdGUgPSAnaW5uZXItdW5kaXJlY3RlZCc7XG4vLyAgICAgfVxuXG4vLyAgICAgLy8gSW5uZXJcbi8vICAgICBpZiAob2Zmc2V0ID49IG5laWdoYm9ycy5sZW5ndGgpIHtcbi8vICAgICAgIGlmIChzdGF0ZSA9PT0gJ2lubmVyLXVuZGlyZWN0ZWQnKSBzdGF0ZSA9ICdvdXRlcic7XG4vLyAgICAgICBlbHNlIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuXG4vLyAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgIH1cblxuLy8gICAgIGNvbnN0IG5laWdoYm9yID0gbmVpZ2hib3JzW29mZnNldCsrXTtcbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IGFkaltuZWlnaGJvcl07XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2VLZXk6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkamFjZW5jeUl0ZXJhdG9yTXVsdGkoZ3JhcGgpIHtcbi8vICAgY29uc3QgaXRlcmF0b3IgPSBncmFwaC5fbm9kZXMudmFsdWVzKCk7XG5cbi8vICAgY29uc3QgdHlwZSA9IGdyYXBoLnR5cGU7XG5cbi8vICAgbGV0IHN0YXRlID0gJ291dGVyJyxcbi8vICAgICBzb3VyY2VEYXRhLFxuLy8gICAgIG5laWdoYm9ycyxcbi8vICAgICBjb250YWluZXIgPSBudWxsLFxuLy8gICAgIGFkaixcbi8vICAgICBvZmZzZXQ7XG5cbi8vICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbiBuZXh0KCkge1xuLy8gICAgIGxldCBzdGVwO1xuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnb3V0ZXInKSB7XG4vLyAgICAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4vLyAgICAgICBpZiAoc3RlcC5kb25lID09PSB0cnVlKSByZXR1cm4gc3RlcDtcblxuLy8gICAgICAgc291cmNlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbi8vICAgICAgIHN0YXRlID0gJ2RpcmVjdGVkJztcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICBpZiAodHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ3VuZGlyZWN0ZWQnO1xuLy8gICAgICAgICByZXR1cm4gbmV4dCgpO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICBhZGogPSBzb3VyY2VEYXRhLm91dDtcbi8vICAgICAgIG5laWdoYm9ycyA9IE9iamVjdC5rZXlzKHNvdXJjZURhdGEub3V0KTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci1kaXJlY3RlZCc7XG5cbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgaWYgKHN0YXRlID09PSAndW5kaXJlY3RlZCcpIHtcbi8vICAgICAgIGlmICh0eXBlID09PSAnZGlyZWN0ZWQnKSB7XG4vLyAgICAgICAgIHN0YXRlID0gJ291dGVyJztcbi8vICAgICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgYWRqID0gc291cmNlRGF0YS51bmRpcmVjdGVkO1xuLy8gICAgICAgbmVpZ2hib3JzID0gT2JqZWN0LmtleXMoc291cmNlRGF0YS51bmRpcmVjdGVkKTtcbi8vICAgICAgIG9mZnNldCA9IDA7XG4vLyAgICAgICBzdGF0ZSA9ICdpbm5lci11bmRpcmVjdGVkJztcbi8vICAgICB9XG5cbi8vICAgICAvLyBJbm5lclxuLy8gICAgIGlmICghY29udGFpbmVyICYmIG9mZnNldCA+PSBuZWlnaGJvcnMubGVuZ3RoKSB7XG4vLyAgICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJykgc3RhdGUgPSAnb3V0ZXInO1xuLy8gICAgICAgZWxzZSBzdGF0ZSA9ICd1bmRpcmVjdGVkJztcblxuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBpZiAoIWNvbnRhaW5lcikge1xuLy8gICAgICAgY29uc3QgbmVpZ2hib3IgPSBuZWlnaGJvcnNbb2Zmc2V0KytdO1xuLy8gICAgICAgY29udGFpbmVyID0gYWRqW25laWdoYm9yXS52YWx1ZXMoKTtcbi8vICAgICAgIHJldHVybiBuZXh0KCk7XG4vLyAgICAgfVxuXG4vLyAgICAgc3RlcCA9IGNvbnRhaW5lci5uZXh0KCk7XG5cbi8vICAgICBpZiAoc3RlcC5kb25lKSB7XG4vLyAgICAgICBjb250YWluZXIgPSBudWxsO1xuLy8gICAgICAgcmV0dXJuIG5leHQoKTtcbi8vICAgICB9XG5cbi8vICAgICBjb25zdCBlZGdlRGF0YSA9IHN0ZXAudmFsdWU7XG4vLyAgICAgbGV0IHRhcmdldERhdGEgPSBlZGdlRGF0YS50YXJnZXQ7XG5cbi8vICAgICBpZiAoc3RhdGUgPT09ICdpbm5lci11bmRpcmVjdGVkJyAmJiB0YXJnZXREYXRhLmtleSA9PT0gc291cmNlRGF0YS5rZXkpXG4vLyAgICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEuc291cmNlO1xuXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGRvbmU6IGZhbHNlLFxuLy8gICAgICAgdmFsdWU6IHtcbi8vICAgICAgICAgc291cmNlOiBzb3VyY2VEYXRhLmtleSxcbi8vICAgICAgICAgdGFyZ2V0OiB0YXJnZXREYXRhLmtleSxcbi8vICAgICAgICAgc291cmNlQXR0cmlidXRlczogc291cmNlRGF0YS5hdHRyaWJ1dGVzLFxuLy8gICAgICAgICB0YXJnZXRBdHRyaWJ1dGVzOiB0YXJnZXREYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIGVkZ2U6IGVkZ2VEYXRhLmtleSxcbi8vICAgICAgICAgZWRnZUF0dHJpYnV0ZXM6IGVkZ2VEYXRhLmF0dHJpYnV0ZXMsXG4vLyAgICAgICAgIHVuZGlyZWN0ZWQ6IGVkZ2VEYXRhLnVuZGlyZWN0ZWRcbi8vICAgICAgIH1cbi8vICAgICB9O1xuLy8gICB9KTtcbi8vIH1cbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgU2VyaWFsaXphdGlvbiBVdGlsaXRpZXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQ29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byB2YWxpZGF0ZSBpbXBvcnQtZXhwb3J0IGZvcm1hdHMgJiB0byBvdXB1dFxuICogdGhlbSBmcm9tIGludGVybmFsIGdyYXBoIGRhdGEuXG4gKlxuICogU2VyaWFsaXplZCBOb2RlOlxuICoge2tleSwgP2F0dHJpYnV0ZXN9XG4gKlxuICogU2VyaWFsaXplZCBFZGdlOlxuICoge2tleT8sIHNvdXJjZSwgdGFyZ2V0LCBhdHRyaWJ1dGVzPywgdW5kaXJlY3RlZD99XG4gKlxuICogU2VyaWFsaXplZCBHcmFwaDpcbiAqIHtub2Rlc1tdLCBlZGdlcz9bXX1cbiAqL1xuaW1wb3J0IHthc3NpZ24sIGlzUGxhaW5PYmplY3QsIGlzRW1wdHl9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgbm9kZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIG5vZGUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIG5vZGUncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBub2RlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVOb2RlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge2tleX07XG5cbiAgaWYgKCFpc0VtcHR5KGRhdGEuYXR0cmlidXRlcykpXG4gICAgc2VyaWFsaXplZC5hdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkYXRhLmF0dHJpYnV0ZXMpO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgaW50ZXJuYWwgZWRnZSBkYXRhIGludG8gYSBzZXJpYWxpemVkIGVkZ2UuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBrZXkgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgLSBJbnRlcm5hbCBlZGdlJ3MgZGF0YS5cbiAqIEByZXR1cm4ge2FycmF5fSAgICAgICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSkge1xuICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgIGtleSxcbiAgICBzb3VyY2U6IGRhdGEuc291cmNlLmtleSxcbiAgICB0YXJnZXQ6IGRhdGEudGFyZ2V0LmtleVxuICB9O1xuXG4gIGlmICghaXNFbXB0eShkYXRhLmF0dHJpYnV0ZXMpKVxuICAgIHNlcmlhbGl6ZWQuYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgZGF0YS5hdHRyaWJ1dGVzKTtcblxuICBpZiAoZGF0YS51bmRpcmVjdGVkKSBzZXJpYWxpemVkLnVuZGlyZWN0ZWQgPSB0cnVlO1xuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHNlcmlhbGl6ZWQgbm9kZS5cbiAqXG4gKiBAcGFyYW0gIHttaXhlZH0gdmFsdWUgLSBUYXJnZXQgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VyaWFsaXplZE5vZGUodmFsdWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgcmV0dXJuICdub3Qtb2JqZWN0JztcblxuICBpZiAoISgna2V5JyBpbiB2YWx1ZSkpIHJldHVybiAnbm8ta2V5JztcblxuICBpZiAoXG4gICAgJ2F0dHJpYnV0ZXMnIGluIHZhbHVlICYmXG4gICAgKCFpc1BsYWluT2JqZWN0KHZhbHVlLmF0dHJpYnV0ZXMpIHx8IHZhbHVlLmF0dHJpYnV0ZXMgPT09IG51bGwpXG4gIClcbiAgICByZXR1cm4gJ2ludmFsaWQtYXR0cmlidXRlcyc7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc2VyaWFsaXplZCBlZGdlLlxuICpcbiAqIEBwYXJhbSAge21peGVkfSB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZXJpYWxpemVkRWRnZSh2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gJ25vdC1vYmplY3QnO1xuXG4gIGlmICghKCdzb3VyY2UnIGluIHZhbHVlKSkgcmV0dXJuICduby1zb3VyY2UnO1xuXG4gIGlmICghKCd0YXJnZXQnIGluIHZhbHVlKSkgcmV0dXJuICduby10YXJnZXQnO1xuXG4gIGlmIChcbiAgICAnYXR0cmlidXRlcycgaW4gdmFsdWUgJiZcbiAgICAoIWlzUGxhaW5PYmplY3QodmFsdWUuYXR0cmlidXRlcykgfHwgdmFsdWUuYXR0cmlidXRlcyA9PT0gbnVsbClcbiAgKVxuICAgIHJldHVybiAnaW52YWxpZC1hdHRyaWJ1dGVzJztcblxuICBpZiAoJ3VuZGlyZWN0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51bmRpcmVjdGVkICE9PSAnYm9vbGVhbicpXG4gICAgcmV0dXJuICdpbnZhbGlkLXVuZGlyZWN0ZWQnO1xuXG4gIHJldHVybiBudWxsO1xufVxuIiwgIi8qIGVzbGludCBuby1uZXN0ZWQtdGVybmFyeTogMCAqL1xuLyoqXG4gKiBHcmFwaG9sb2d5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBncmFwaG9sb2d5IHNwZWNzLlxuICovXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBJdGVyYXRvciBmcm9tICdvYmxpdGVyYXRvci9pdGVyYXRvcic7XG5pbXBvcnQgdGFrZSBmcm9tICdvYmxpdGVyYXRvci90YWtlJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuaW1wb3J0IHtcbiAgTWl4ZWROb2RlRGF0YSxcbiAgRGlyZWN0ZWROb2RlRGF0YSxcbiAgVW5kaXJlY3RlZE5vZGVEYXRhLFxuICBFZGdlRGF0YVxufSBmcm9tICcuL2RhdGEnO1xuXG5pbXBvcnQge1xuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleCxcbiAgY2xlYXJFZGdlRnJvbVN0cnVjdHVyZUluZGV4LFxuICBjbGVhclN0cnVjdHVyZUluZGV4LFxuICB1cGdyYWRlU3RydWN0dXJlSW5kZXhUb011bHRpXG59IGZyb20gJy4vaW5kaWNlcyc7XG5cbmltcG9ydCBhdHRhY2hOb2RlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL25vZGVzJztcbmltcG9ydCBhdHRhY2hFZGdlQXR0cmlidXRlc01ldGhvZHMgZnJvbSAnLi9hdHRyaWJ1dGVzL2VkZ2VzJztcbmltcG9ydCBhdHRhY2hFZGdlSXRlcmF0aW9uTWV0aG9kcyBmcm9tICcuL2l0ZXJhdGlvbi9lZGdlcyc7XG5pbXBvcnQgYXR0YWNoTmVpZ2hib3JJdGVyYXRpb25NZXRob2RzIGZyb20gJy4vaXRlcmF0aW9uL25laWdoYm9ycyc7XG5pbXBvcnQge1xuICBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlLFxuICBmb3JFYWNoQWRqYWNlbmN5TXVsdGlcbn0gZnJvbSAnLi9pdGVyYXRpb24vYWRqYWNlbmN5JztcblxuaW1wb3J0IHtcbiAgc2VyaWFsaXplTm9kZSxcbiAgc2VyaWFsaXplRWRnZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkTm9kZSxcbiAgdmFsaWRhdGVTZXJpYWxpemVkRWRnZVxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5pbXBvcnQge1xuICBhc3NpZ24sXG4gIGdldE1hdGNoaW5nRWRnZSxcbiAgaXNHcmFwaCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgcHJpdmF0ZVByb3BlcnR5LFxuICByZWFkT25seVByb3BlcnR5LFxuICBpbmNyZW1lbnRhbElkU3RhcnRpbmdGcm9tUmFuZG9tQnl0ZSxcbiAgdmFsaWRhdGVIaW50c1xufSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDb25zdGFudHMuXG4gKi9cbmNvbnN0IElOU1RBTkNFX0lEID0gaW5jcmVtZW50YWxJZFN0YXJ0aW5nRnJvbVJhbmRvbUJ5dGUoKTtcblxuLyoqXG4gKiBFbnVtcy5cbiAqL1xuY29uc3QgVFlQRVMgPSBuZXcgU2V0KFsnZGlyZWN0ZWQnLCAndW5kaXJlY3RlZCcsICdtaXhlZCddKTtcblxuY29uc3QgRU1JVFRFUl9QUk9QUyA9IG5ldyBTZXQoW1xuICAnZG9tYWluJyxcbiAgJ19ldmVudHMnLFxuICAnX2V2ZW50c0NvdW50JyxcbiAgJ19tYXhMaXN0ZW5lcnMnXG5dKTtcblxuY29uc3QgRURHRV9BRERfTUVUSE9EUyA9IFtcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZVxuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifURpcmVjdGVkRWRnZWAsXG4gICAgZ2VuZXJhdGVLZXk6IHRydWUsXG4gICAgdHlwZTogJ2RpcmVjdGVkJ1xuICB9LFxuICB7XG4gICAgbmFtZTogdmVyYiA9PiBgJHt2ZXJifVVuZGlyZWN0ZWRFZGdlYCxcbiAgICBnZW5lcmF0ZUtleTogdHJ1ZSxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1FZGdlV2l0aEtleWBcbiAgfSxcbiAge1xuICAgIG5hbWU6IHZlcmIgPT4gYCR7dmVyYn1EaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAnZGlyZWN0ZWQnXG4gIH0sXG4gIHtcbiAgICBuYW1lOiB2ZXJiID0+IGAke3ZlcmJ9VW5kaXJlY3RlZEVkZ2VXaXRoS2V5YCxcbiAgICB0eXBlOiAndW5kaXJlY3RlZCdcbiAgfVxuXTtcblxuLyoqXG4gKiBEZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRTID0ge1xuICBhbGxvd1NlbGZMb29wczogdHJ1ZSxcbiAgbXVsdGk6IGZhbHNlLFxuICB0eXBlOiAnbWl4ZWQnXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBHcmFwaCBjbGFzcyBmb3IgdmFyaW91cyBtZXRob2RzLlxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gYWRkIGEgbm9kZSB0byB0aGUgZ2l2ZW4gZ3JhcGhcbiAqXG4gKiBAcGFyYW0gIHtHcmFwaH0gICBncmFwaCAgICAgICAgICAgLSBUYXJnZXQgZ3JhcGguXG4gKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAgICAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAqIEBwYXJhbSAge29iamVjdH0gIFthdHRyaWJ1dGVzXSAgICAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gKiBAcmV0dXJuIHtOb2RlRGF0YX0gICAgICAgICAgICAgICAgLSBDcmVhdGVkIG5vZGUgZGF0YS5cbiAqL1xuZnVuY3Rpb24gYWRkTm9kZShncmFwaCwgbm9kZSwgYXR0cmlidXRlcykge1xuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguYWRkTm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBTdHJpbmcgY29lcmNpb25cbiAgbm9kZSA9ICcnICsgbm9kZTtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKGdyYXBoLl9ub2Rlcy5oYXMobm9kZSkpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5hZGROb2RlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBhbHJlYWR5IGV4aXN0IGluIHRoZSBncmFwaC5gXG4gICAgKTtcblxuICBjb25zdCBkYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Mobm9kZSwgYXR0cmlidXRlcyk7XG5cbiAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgLy8gRW1pdHRpbmdcbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgdGhlIGFib3ZlIGJ1dCB3aXRob3V0IHNhbml0eSBjaGVja3MgYmVjYXVzZSB3ZSBjYWxsIHRoaXMgaW4gY29udGV4dHNcbiAqIHdoZXJlIG5lY2Vzc2FyeSBjaGVja3Mgd2VyZSBhbHJlYWR5IGRvbmUuXG4gKi9cbmZ1bmN0aW9uIHVuc2FmZUFkZE5vZGUoZ3JhcGgsIG5vZGUsIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3QgZGF0YSA9IG5ldyBncmFwaC5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gIGdyYXBoLl9ub2Rlcy5zZXQobm9kZSwgZGF0YSk7XG5cbiAgZ3JhcGguZW1pdCgnbm9kZUFkZGVkJywge1xuICAgIGtleTogbm9kZSxcbiAgICBhdHRyaWJ1dGVzXG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHJldHVybiB7YW55fSAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGVkZ2UuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgb2YgdGhlIHdyb25nIHR5cGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYW4gb2JqZWN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGFscmVhZHkgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIGFkZEVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzXG4pIHtcbiAgLy8gQ2hlY2tpbmcgdmFsaWRpdHkgb2Ygb3BlcmF0aW9uXG4gIGlmICghdW5kaXJlY3RlZCAmJiBncmFwaC50eXBlID09PSAndW5kaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhIGRpcmVjdGVkIGVkZ2UgdG8gYW4gdW5kaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGRVbmRpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmICh1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICdkaXJlY3RlZCcpXG4gICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC4ke25hbWV9OiB5b3UgY2Fubm90IGFkZCBhbiB1bmRpcmVjdGVkIGVkZ2UgdG8gYSBkaXJlY3RlZCBncmFwaC4gVXNlIHRoZSAjLmFkZEVkZ2Ugb3IgIy5hZGREaXJlY3RlZEVkZ2UgaW5zdGVhZC5gXG4gICAgKTtcblxuICBpZiAoYXR0cmlidXRlcyAmJiAhaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogaW52YWxpZCBhdHRyaWJ1dGVzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGJ1dCBnb3QgXCIke2F0dHJpYnV0ZXN9XCJgXG4gICAgKTtcblxuICAvLyBDb2VyY2lvbiBvZiBzb3VyY2UgJiB0YXJnZXQ6XG4gIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICB0YXJnZXQgPSAnJyArIHRhcmdldDtcbiAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBjb25zdCBzb3VyY2VEYXRhID0gZ3JhcGguX25vZGVzLmdldChzb3VyY2UpLFxuICAgIHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG5cbiAgaWYgKCFzb3VyY2VEYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogc291cmNlIG5vZGUgXCIke3NvdXJjZX1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgaWYgKCF0YXJnZXREYXRhKVxuICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguJHtuYW1lfTogdGFyZ2V0IG5vZGUgXCIke3RhcmdldH1cIiBub3QgZm91bmQuYFxuICAgICk7XG5cbiAgLy8gTXVzdCB0aGUgZ3JhcGggZ2VuZXJhdGUgYW4gaWQgZm9yIHRoaXMgZWRnZT9cbiAgY29uc3QgZXZlbnREYXRhID0ge1xuICAgIGtleTogbnVsbCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgYXR0cmlidXRlc1xuICB9O1xuXG4gIGlmIChtdXN0R2VuZXJhdGVLZXkpIHtcbiAgICAvLyBOT1RFOiBpbiB0aGlzIGNhc2Ugd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeVxuICAgIC8vIGV4aXN0IGFuZCBpcyBhbHJlYWR5IGNvcnJlY3RseSBjYXN0ZWQgYXMgYSBzdHJpbmdcbiAgICBlZGdlID0gZ3JhcGguX2VkZ2VLZXlHZW5lcmF0b3IoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb2VyY2lvbiBvZiBlZGdlIGtleVxuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICAvLyBIZXJlLCB3ZSBoYXZlIGEga2V5IGNvbGxpc2lvblxuICAgIGlmIChncmFwaC5fZWRnZXMuaGFzKGVkZ2UpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLiR7bmFtZX06IHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuICB9XG5cbiAgLy8gSGVyZSwgd2UgbWlnaHQgaGF2ZSBhIHNvdXJjZSAvIHRhcmdldCBjb2xsaXNpb25cbiAgaWYgKFxuICAgICFncmFwaC5tdWx0aSAmJlxuICAgICh1bmRpcmVjdGVkXG4gICAgICA/IHR5cGVvZiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgIDogdHlwZW9mIHNvdXJjZURhdGEub3V0W3RhcmdldF0gIT09ICd1bmRlZmluZWQnKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IGFuIGVkZ2UgbGlua2luZyBcIiR7c291cmNlfVwiIHRvIFwiJHt0YXJnZXR9XCIgYWxyZWFkeSBleGlzdHMuIElmIHlvdSByZWFsbHkgd2FudCB0byBhZGQgbXVsdGlwbGUgZWRnZXMgbGlua2luZyB0aG9zZSBub2RlcywgeW91IHNob3VsZCBjcmVhdGUgYSBtdWx0aSBncmFwaCBieSB1c2luZyB0aGUgJ211bHRpJyBvcHRpb24uYFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9yaW5nIHNvbWUgZGF0YVxuICBjb25zdCBlZGdlRGF0YSA9IG5ldyBFZGdlRGF0YShcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2UsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhLFxuICAgIGF0dHJpYnV0ZXNcbiAgKTtcblxuICAvLyBBZGRpbmcgdGhlIGVkZ2UgdG8gdGhlIGludGVybmFsIHJlZ2lzdGVyXG4gIGdyYXBoLl9lZGdlcy5zZXQoZWRnZSwgZWRnZURhdGEpO1xuXG4gIC8vIEluY3JlbWVudGluZyBub2RlIGRlZ3JlZSBjb3VudGVyc1xuICBpZiAoc291cmNlID09PSB0YXJnZXQpIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5kaXJlY3RlZFNlbGZMb29wcysrO1xuICAgICAgZ3JhcGguX2RpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgc291cmNlRGF0YS51bmRpcmVjdGVkRGVncmVlKys7XG4gICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRGF0YS5vdXREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUrKztcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGluZyByZWxldmFudCBpbmRleFxuICB1cGRhdGVTdHJ1Y3R1cmVJbmRleChcbiAgICBncmFwaCxcbiAgICB1bmRpcmVjdGVkLFxuICAgIGVkZ2VEYXRhLFxuICAgIHNvdXJjZSxcbiAgICB0YXJnZXQsXG4gICAgc291cmNlRGF0YSxcbiAgICB0YXJnZXREYXRhXG4gICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQpIGdyYXBoLl91bmRpcmVjdGVkU2l6ZSsrO1xuICBlbHNlIGdyYXBoLl9kaXJlY3RlZFNpemUrKztcblxuICAvLyBFbWl0dGluZ1xuICBldmVudERhdGEua2V5ID0gZWRnZTtcblxuICBncmFwaC5lbWl0KCdlZGdlQWRkZWQnLCBldmVudERhdGEpO1xuXG4gIHJldHVybiBlZGdlO1xufVxuXG4vKipcbiAqIEludGVybmFsIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBhcmJpdHJhcnkgZWRnZSB0byB0aGUgZ2l2ZW4gZ3JhcGguXG4gKlxuICogQHBhcmFtICB7R3JhcGh9ICAgZ3JhcGggICAgICAgICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY2hpbGQgbWV0aG9kIGZvciBlcnJvcnMuXG4gKiBAcGFyYW0gIHtib29sZWFufSBtdXN0R2VuZXJhdGVLZXkgLSBTaG91bGQgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gdW5kaXJlY3RlZCAgICAgIC0gV2hldGhlciB0aGUgZWRnZSBpcyB1bmRpcmVjdGVkLlxuICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAgICAgICAgICAgIC0gVGhlIGVkZ2UncyBrZXkuXG4gKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgICAgICAgICAgLSBUaGUgc291cmNlIG5vZGUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICB0YXJnZXQgICAgICAgICAgLSBUaGUgdGFyZ2V0IG5vZGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbYXR0cmlidXRlc10gICAgLSBPcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gW2FzVXBkYXRlcl0gICAgICAgLSBBcmUgd2UgdXBkYXRpbmcgb3IgbWVyZ2luZz9cbiAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgICAgICAtIFRoZSBlZGdlLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG9mIHRoZSB3cm9uZyB0eXBlLlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBtZXJnZUVkZ2UoXG4gIGdyYXBoLFxuICBuYW1lLFxuICBtdXN0R2VuZXJhdGVLZXksXG4gIHVuZGlyZWN0ZWQsXG4gIGVkZ2UsXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBhdHRyaWJ1dGVzLFxuICBhc1VwZGF0ZXJcbikge1xuICAvLyBDaGVja2luZyB2YWxpZGl0eSBvZiBvcGVyYXRpb25cbiAgaWYgKCF1bmRpcmVjdGVkICYmIGdyYXBoLnR5cGUgPT09ICd1bmRpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGEgZGlyZWN0ZWQgZWRnZSB0byBhbiB1bmRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZFVuZGlyZWN0ZWRFZGdlIGluc3RlYWQuYFxuICAgICk7XG5cbiAgaWYgKHVuZGlyZWN0ZWQgJiYgZ3JhcGgudHlwZSA9PT0gJ2RpcmVjdGVkJylcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHlvdSBjYW5ub3QgbWVyZ2UvdXBkYXRlIGFuIHVuZGlyZWN0ZWQgZWRnZSB0byBhIGRpcmVjdGVkIGdyYXBoLiBVc2UgdGhlICMubWVyZ2VFZGdlLyMudXBkYXRlRWRnZSBvciAjLmFkZERpcmVjdGVkRWRnZSBpbnN0ZWFkLmBcbiAgICApO1xuXG4gIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKGFzVXBkYXRlcikge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgdXBkYXRlciBmdW5jdGlvbi4gRXhwZWN0aW5nIGEgZnVuY3Rpb24gYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLiR7bmFtZX06IGludmFsaWQgYXR0cmlidXRlcy4gRXhwZWN0aW5nIGFuIG9iamVjdCBidXQgZ290IFwiJHthdHRyaWJ1dGVzfVwiYFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvZXJjaW9uIG9mIHNvdXJjZSAmIHRhcmdldDpcbiAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gIGxldCB1cGRhdGVyO1xuXG4gIGlmIChhc1VwZGF0ZXIpIHtcbiAgICB1cGRhdGVyID0gYXR0cmlidXRlcztcbiAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFncmFwaC5hbGxvd1NlbGZMb29wcyAmJiBzb3VyY2UgPT09IHRhcmdldClcbiAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLiR7bmFtZX06IHNvdXJjZSAmIHRhcmdldCBhcmUgdGhlIHNhbWUgKFwiJHtzb3VyY2V9XCIpLCB0aHVzIGNyZWF0aW5nIGEgbG9vcCBleHBsaWNpdGx5IGZvcmJpZGRlbiBieSB0aGlzIGdyYXBoICdhbGxvd1NlbGZMb29wcycgb3B0aW9uIHNldCB0byBmYWxzZS5gXG4gICAgKTtcblxuICBsZXQgc291cmNlRGF0YSA9IGdyYXBoLl9ub2Rlcy5nZXQoc291cmNlKTtcbiAgbGV0IHRhcmdldERhdGEgPSBncmFwaC5fbm9kZXMuZ2V0KHRhcmdldCk7XG4gIGxldCBlZGdlRGF0YTtcblxuICAvLyBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBkdXBsaWNhdGU/XG4gIGxldCBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YTtcblxuICBpZiAoIW11c3RHZW5lcmF0ZUtleSkge1xuICAgIGVkZ2VEYXRhID0gZ3JhcGguX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmIChlZGdlRGF0YSkge1xuICAgICAgLy8gSGVyZSwgd2UgbmVlZCB0byBlbnN1cmUsIGlmIHRoZSB1c2VyIGdhdmUgYSBrZXksIHRoYXQgc291cmNlICYgdGFyZ2V0XG4gICAgICAvLyBhcmUgY29oZXJlbnRcbiAgICAgIGlmIChcbiAgICAgICAgZWRnZURhdGEuc291cmNlLmtleSAhPT0gc291cmNlIHx8XG4gICAgICAgIGVkZ2VEYXRhLnRhcmdldC5rZXkgIT09IHRhcmdldCB8fFxuICAgICAgICAodW5kaXJlY3RlZCAmJlxuICAgICAgICAgIChlZGdlRGF0YS5zb3VyY2Uua2V5ICE9PSB0YXJnZXQgfHwgZWRnZURhdGEudGFyZ2V0LmtleSAhPT0gc291cmNlKSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAgIGBHcmFwaC4ke25hbWV9OiBpbmNvbnNpc3RlbmN5IGRldGVjdGVkIHdoZW4gYXR0ZW1wdGluZyB0byBtZXJnZSB0aGUgXCIke2VkZ2V9XCIgZWRnZSB3aXRoIFwiJHtzb3VyY2V9XCIgc291cmNlICYgXCIke3RhcmdldH1cIiB0YXJnZXQgdnMuIChcIiR7ZWRnZURhdGEuc291cmNlLmtleX1cIiwgXCIke2VkZ2VEYXRhLnRhcmdldC5rZXl9XCIpLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSBlZGdlRGF0YTtcbiAgICB9XG4gIH1cblxuICAvLyBIZXJlLCB3ZSBtaWdodCBoYXZlIGEgc291cmNlIC8gdGFyZ2V0IGNvbGxpc2lvblxuICBpZiAoIWFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhICYmICFncmFwaC5tdWx0aSAmJiBzb3VyY2VEYXRhKSB7XG4gICAgYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEgPSB1bmRpcmVjdGVkXG4gICAgICA/IHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdXG4gICAgICA6IHNvdXJjZURhdGEub3V0W3RhcmdldF07XG4gIH1cblxuICAvLyBIYW5kbGluZyBkdXBsaWNhdGVzXG4gIGlmIChhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YSkge1xuICAgIGNvbnN0IGluZm8gPSBbYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEua2V5LCBmYWxzZSwgZmFsc2UsIGZhbHNlXTtcblxuICAgIC8vIFdlIGNhbiBza2lwIHRoZSBhdHRyaWJ1dGUgbWVyZ2luZyBwYXJ0IGlmIHRoZSB1c2VyIGRpZCBub3QgcHJvdmlkZSB0aGVtXG4gICAgaWYgKGFzVXBkYXRlciA/ICF1cGRhdGVyIDogIWF0dHJpYnV0ZXMpIHJldHVybiBpbmZvO1xuXG4gICAgLy8gVXBkYXRpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBpZiAoYXNVcGRhdGVyKSB7XG4gICAgICBjb25zdCBvbGRBdHRyaWJ1dGVzID0gYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcztcbiAgICAgIGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXMgPSB1cGRhdGVyKG9sZEF0dHJpYnV0ZXMpO1xuXG4gICAgICBncmFwaC5lbWl0KCdlZGdlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgIHR5cGU6ICdyZXBsYWNlJyxcbiAgICAgICAga2V5OiBhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5rZXksXG4gICAgICAgIGF0dHJpYnV0ZXM6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1lcmdpbmcgdGhlIGF0dHJpYnV0ZXNcbiAgICBlbHNlIHtcbiAgICAgIGFzc2lnbihhbHJlYWR5RXhpc3RpbmdFZGdlRGF0YS5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgZ3JhcGguZW1pdCgnZWRnZUF0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgICBrZXk6IGFscmVhZHlFeGlzdGluZ0VkZ2VEYXRhLmtleSxcbiAgICAgICAgYXR0cmlidXRlczogYWxyZWFkeUV4aXN0aW5nRWRnZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgZGF0YTogYXR0cmlidXRlc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcyB8fCB7fTtcblxuICBpZiAoYXNVcGRhdGVyICYmIHVwZGF0ZXIpIGF0dHJpYnV0ZXMgPSB1cGRhdGVyKGF0dHJpYnV0ZXMpO1xuXG4gIC8vIE11c3QgdGhlIGdyYXBoIGdlbmVyYXRlIGFuIGlkIGZvciB0aGlzIGVkZ2U/XG4gIGNvbnN0IGV2ZW50RGF0YSA9IHtcbiAgICBrZXk6IG51bGwsXG4gICAgdW5kaXJlY3RlZCxcbiAgICBzb3VyY2UsXG4gICAgdGFyZ2V0LFxuICAgIGF0dHJpYnV0ZXNcbiAgfTtcblxuICBpZiAobXVzdEdlbmVyYXRlS2V5KSB7XG4gICAgLy8gTk9URTogaW4gdGhpcyBjYXNlIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUga2V5IGRvZXMgbm90IGFscmVhZHlcbiAgICAvLyBleGlzdCBhbmQgaXMgYWxyZWFkeSBjb3JyZWN0bHkgY2FzdGVkIGFzIGEgc3RyaW5nXG4gICAgZWRnZSA9IGdyYXBoLl9lZGdlS2V5R2VuZXJhdG9yKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNpb24gb2YgZWRnZSBrZXlcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgLy8gSGVyZSwgd2UgaGF2ZSBhIGtleSBjb2xsaXNpb25cbiAgICBpZiAoZ3JhcGguX2VkZ2VzLmhhcyhlZGdlKSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC4ke25hbWV9OiB0aGUgXCIke2VkZ2V9XCIgZWRnZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcbiAgfVxuXG4gIGxldCBzb3VyY2VXYXNBZGRlZCA9IGZhbHNlO1xuICBsZXQgdGFyZ2V0V2FzQWRkZWQgPSBmYWxzZTtcblxuICBpZiAoIXNvdXJjZURhdGEpIHtcbiAgICBzb3VyY2VEYXRhID0gdW5zYWZlQWRkTm9kZShncmFwaCwgc291cmNlLCB7fSk7XG4gICAgc291cmNlV2FzQWRkZWQgPSB0cnVlO1xuXG4gICAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0KSB7XG4gICAgICB0YXJnZXREYXRhID0gc291cmNlRGF0YTtcbiAgICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCF0YXJnZXREYXRhKSB7XG4gICAgdGFyZ2V0RGF0YSA9IHVuc2FmZUFkZE5vZGUoZ3JhcGgsIHRhcmdldCwge30pO1xuICAgIHRhcmdldFdhc0FkZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFN0b3Jpbmcgc29tZSBkYXRhXG4gIGVkZ2VEYXRhID0gbmV3IEVkZ2VEYXRhKHVuZGlyZWN0ZWQsIGVkZ2UsIHNvdXJjZURhdGEsIHRhcmdldERhdGEsIGF0dHJpYnV0ZXMpO1xuXG4gIC8vIEFkZGluZyB0aGUgZWRnZSB0byB0aGUgaW50ZXJuYWwgcmVnaXN0ZXJcbiAgZ3JhcGguX2VkZ2VzLnNldChlZGdlLCBlZGdlRGF0YSk7XG5cbiAgLy8gSW5jcmVtZW50aW5nIG5vZGUgZGVncmVlIGNvdW50ZXJzXG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMrKztcbiAgICAgIGdyYXBoLl91bmRpcmVjdGVkU2VsZkxvb3BDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLmRpcmVjdGVkU2VsZkxvb3BzKys7XG4gICAgICBncmFwaC5fZGlyZWN0ZWRTZWxmTG9vcENvdW50Kys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWREZWdyZWUrKztcbiAgICAgIHRhcmdldERhdGEudW5kaXJlY3RlZERlZ3JlZSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VEYXRhLm91dERlZ3JlZSsrO1xuICAgICAgdGFyZ2V0RGF0YS5pbkRlZ3JlZSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0aW5nIHJlbGV2YW50IGluZGV4XG4gIHVwZGF0ZVN0cnVjdHVyZUluZGV4KFxuICAgIGdyYXBoLFxuICAgIHVuZGlyZWN0ZWQsXG4gICAgZWRnZURhdGEsXG4gICAgc291cmNlLFxuICAgIHRhcmdldCxcbiAgICBzb3VyY2VEYXRhLFxuICAgIHRhcmdldERhdGFcbiAgKTtcblxuICBpZiAodW5kaXJlY3RlZCkgZ3JhcGguX3VuZGlyZWN0ZWRTaXplKys7XG4gIGVsc2UgZ3JhcGguX2RpcmVjdGVkU2l6ZSsrO1xuXG4gIC8vIEVtaXR0aW5nXG4gIGV2ZW50RGF0YS5rZXkgPSBlZGdlO1xuXG4gIGdyYXBoLmVtaXQoJ2VkZ2VBZGRlZCcsIGV2ZW50RGF0YSk7XG5cbiAgcmV0dXJuIFtlZGdlLCB0cnVlLCBzb3VyY2VXYXNBZGRlZCwgdGFyZ2V0V2FzQWRkZWRdO1xufVxuXG4vKipcbiAqIEdyYXBoIGNsYXNzXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBbb3B0aW9uc10gLSBPcHRpb25zOlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbYWxsb3dTZWxmTG9vcHNdIC0gQWxsb3cgc2VsZiBsb29wcz9cbiAqIEBwYXJhbSAge3N0cmluZ30gICAgW3R5cGVdICAgICAgICAgICAtIFR5cGUgb2YgdGhlIGdyYXBoLlxuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbWFwXSAgICAgICAgICAgIC0gQWxsb3cgcmVmZXJlbmNlcyBhcyBrZXlzP1xuICogQHBhcmFtICB7Ym9vbGVhbn0gICBbbXVsdGldICAgICAgICAgIC0gQWxsb3cgcGFyYWxsZWwgZWRnZXM/XG4gKlxuICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgYXJndW1lbnRzIGFyZSBub3QgdmFsaWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyYXBoIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLy0tIFNvbHZpbmcgb3B0aW9uc1xuICAgIG9wdGlvbnMgPSBhc3NpZ24oe30sIERFRkFVTFRTLCBvcHRpb25zKTtcblxuICAgIC8vIEVuZm9yY2luZyBvcHRpb25zIHZhbGlkaXR5XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm11bHRpICE9PSAnYm9vbGVhbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5jb25zdHJ1Y3RvcjogaW52YWxpZCAnbXVsdGknIG9wdGlvbi4gRXhwZWN0aW5nIGEgYm9vbGVhbiBidXQgZ290IFwiJHtvcHRpb25zLm11bHRpfVwiLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIVRZUEVTLmhhcyhvcHRpb25zLnR5cGUpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ3R5cGUnIG9wdGlvbi4gU2hvdWxkIGJlIG9uZSBvZiBcIm1peGVkXCIsIFwiZGlyZWN0ZWRcIiBvciBcInVuZGlyZWN0ZWRcIiBidXQgZ290IFwiJHtvcHRpb25zLnR5cGV9XCIuYFxuICAgICAgKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbGxvd1NlbGZMb29wcyAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguY29uc3RydWN0b3I6IGludmFsaWQgJ2FsbG93U2VsZkxvb3BzJyBvcHRpb24uIEV4cGVjdGluZyBhIGJvb2xlYW4gYnV0IGdvdCBcIiR7b3B0aW9ucy5hbGxvd1NlbGZMb29wc31cIi5gXG4gICAgICApO1xuXG4gICAgLy8tLSBQcml2YXRlIHByb3BlcnRpZXNcblxuICAgIC8vIFV0aWxpdGllc1xuICAgIGNvbnN0IE5vZGVEYXRhQ2xhc3MgPVxuICAgICAgb3B0aW9ucy50eXBlID09PSAnbWl4ZWQnXG4gICAgICAgID8gTWl4ZWROb2RlRGF0YVxuICAgICAgICA6IG9wdGlvbnMudHlwZSA9PT0gJ2RpcmVjdGVkJ1xuICAgICAgICA/IERpcmVjdGVkTm9kZURhdGFcbiAgICAgICAgOiBVbmRpcmVjdGVkTm9kZURhdGE7XG5cbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBOb2RlRGF0YUNsYXNzKTtcblxuICAgIC8vIEludGVybmFsIGVkZ2Uga2V5IGdlbmVyYXRvclxuXG4gICAgLy8gTk9URTogdGhpcyBpbnRlcm5hbCBnZW5lcmF0b3IgcHJvZHVjZSBrZXlzIHRoYXQgYXJlIHN0cmluZ3NcbiAgICAvLyBjb21wb3NlZCBvZiBhIHdlaXJkIHByZWZpeCwgYW4gaW5jcmVtZW50YWwgaW5zdGFuY2UgaWQgc3RhcnRpbmcgZnJvbVxuICAgIC8vIGEgcmFuZG9tIGJ5dGUgYW5kIGZpbmFsbHkgYW4gaW50ZXJuYWwgaW5zdGFuY2UgaW5jcmVtZW50YWwgaWQuXG4gICAgLy8gQWxsIHRoaXMgdG8gYXZvaWQgaW50cmEtZnJhbWUgYW5kIGNyb3NzLWZyYW1lIGFkdmVyc2FyaWFsIGlucHV0c1xuICAgIC8vIHRoYXQgY2FuIGZvcmNlIGEgc2luZ2xlICMuYWRkRWRnZSBjYWxsIHRvIGRlZ2VuZXJhdGUgaW50byBhIE8obilcbiAgICAvLyBhdmFpbGFibGUga2V5IHNlYXJjaCBsb29wLlxuXG4gICAgLy8gSXQgYWxzbyBlbnN1cmVzIHRoYXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZWRnZSBrZXlzIGFyZSB1bmxpa2VseVxuICAgIC8vIHRvIHByb2R1Y2UgY29sbGlzaW9ucyB3aXRoIGFyYml0cmFyeSBrZXlzIGdpdmVuIGJ5IHVzZXJzLlxuICAgIGNvbnN0IGluc3RhbmNlSWQgPSBJTlNUQU5DRV9JRCgpO1xuICAgIGxldCBlZGdlSWQgPSAwO1xuXG4gICAgY29uc3QgZWRnZUtleUdlbmVyYXRvciA9ICgpID0+IHtcbiAgICAgIGxldCBhdmFpbGFibGVFZGdlS2V5O1xuXG4gICAgICBkbyB7XG4gICAgICAgIGF2YWlsYWJsZUVkZ2VLZXkgPSAnZ2VpZF8nICsgaW5zdGFuY2VJZCArICdfJyArIGVkZ2VJZCsrO1xuICAgICAgfSB3aGlsZSAodGhpcy5fZWRnZXMuaGFzKGF2YWlsYWJsZUVkZ2VLZXkpKTtcblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZUVkZ2VLZXk7XG4gICAgfTtcblxuICAgIC8vIEluZGV4ZXNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19hdHRyaWJ1dGVzJywge30pO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX25vZGVzJywgbmV3IE1hcCgpKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19lZGdlcycsIG5ldyBNYXAoKSk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfZGlyZWN0ZWRTaXplJywgMCk7XG4gICAgcHJpdmF0ZVByb3BlcnR5KHRoaXMsICdfdW5kaXJlY3RlZFNpemUnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19kaXJlY3RlZFNlbGZMb29wQ291bnQnLCAwKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ191bmRpcmVjdGVkU2VsZkxvb3BDb3VudCcsIDApO1xuICAgIHByaXZhdGVQcm9wZXJ0eSh0aGlzLCAnX2VkZ2VLZXlHZW5lcmF0b3InLCBlZGdlS2V5R2VuZXJhdG9yKTtcblxuICAgIC8vIE9wdGlvbnNcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ19vcHRpb25zJywgb3B0aW9ucyk7XG5cbiAgICAvLyBFbWl0dGVyIHByb3BlcnRpZXNcbiAgICBFTUlUVEVSX1BST1BTLmZvckVhY2gocHJvcCA9PiBwcml2YXRlUHJvcGVydHkodGhpcywgcHJvcCwgdGhpc1twcm9wXSkpO1xuXG4gICAgLy8tLSBQcm9wZXJ0aWVzIHJlYWRlcnNcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdvcmRlcicsICgpID0+IHRoaXMuX25vZGVzLnNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3NpemUnLCAoKSA9PiB0aGlzLl9lZGdlcy5zaXplKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdkaXJlY3RlZFNpemUnLCAoKSA9PiB0aGlzLl9kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3VuZGlyZWN0ZWRTaXplJywgKCkgPT4gdGhpcy5fdW5kaXJlY3RlZFNpemUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3NlbGZMb29wQ291bnQnLFxuICAgICAgKCkgPT4gdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50ICsgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ2RpcmVjdGVkU2VsZkxvb3BDb3VudCcsXG4gICAgICAoKSA9PiB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnRcbiAgICApO1xuICAgIHJlYWRPbmx5UHJvcGVydHkoXG4gICAgICB0aGlzLFxuICAgICAgJ3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50JyxcbiAgICAgICgpID0+IHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50XG4gICAgKTtcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICdtdWx0aScsIHRoaXMuX29wdGlvbnMubXVsdGkpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ3R5cGUnLCB0aGlzLl9vcHRpb25zLnR5cGUpO1xuICAgIHJlYWRPbmx5UHJvcGVydHkodGhpcywgJ2FsbG93U2VsZkxvb3BzJywgdGhpcy5fb3B0aW9ucy5hbGxvd1NlbGZMb29wcyk7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnaW1wbGVtZW50YXRpb24nLCAoKSA9PiAnZ3JhcGhvbG9neScpO1xuICB9XG5cbiAgX3Jlc2V0SW5zdGFuY2VDb3VudGVycygpIHtcbiAgICB0aGlzLl9kaXJlY3RlZFNpemUgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTaXplID0gMDtcbiAgICB0aGlzLl9kaXJlY3RlZFNlbGZMb29wQ291bnQgPSAwO1xuICAgIHRoaXMuX3VuZGlyZWN0ZWRTZWxmTG9vcENvdW50ID0gMDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBSZWFkXG4gICAqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVzLmhhcygnJyArIG5vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZGlyZWN0ZWQgZWRnZSBpcyBmb3VuZCBpbiB0aGUgZ3JhcGguXG4gICAqXG4gICAqIEFyaXR5IDE6XG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICAgc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBhcmd1bWVudHMgYXJlIGludmFsaWQuXG4gICAqL1xuICBoYXNEaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSAnJyArIHNvdXJjZTtcblxuICAgICAgY29uc3QgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIHJldHVybiAhIWVkZ2VEYXRhICYmICFlZGdlRGF0YS51bmRpcmVjdGVkO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGNvbnN0IGVkZ2VzID0gbm9kZURhdGEub3V0W3RhcmdldF07XG5cbiAgICAgIGlmICghZWRnZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHRoaXMubXVsdGkgPyAhIWVkZ2VzLnNpemUgOiB0cnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgIGBHcmFwaC5oYXNEaXJlY3RlZEVkZ2U6IGludmFsaWQgYXJpdHkgKCR7YXJndW1lbnRzLmxlbmd0aH0sIGluc3RlYWQgb2YgMSBvciAyKS4gWW91IGNhbiBlaXRoZXIgYXNrIGZvciBhbiBlZGdlIGlkIG9yIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGVkZ2UgYmV0d2VlbiBhIHNvdXJjZSAmIGEgdGFyZ2V0LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gdW5kaXJlY3RlZCBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc1VuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgLy8gRWFybHkgdGVybWluYXRpb25cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgICAgcmV0dXJuICEhZWRnZURhdGEgJiYgZWRnZURhdGEudW5kaXJlY3RlZDtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICAgIC8vIElmIHRoZSBub2RlIHNvdXJjZSBvciB0aGUgdGFyZ2V0IGlzIG5vdCBpbiB0aGUgZ3JhcGggd2UgYnJlYWtcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICAgIGlmICghbm9kZURhdGEpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSXMgdGhlcmUgYSBkaXJlY3RlZCBlZGdlIHBvaW50aW5nIHRvd2FyZCB0YXJnZXQ/XG4gICAgICBjb25zdCBlZGdlcyA9IG5vZGVEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XTtcblxuICAgICAgaWYgKCFlZGdlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5tdWx0aSA/ICEhZWRnZXMuc2l6ZSA6IHRydWU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLmhhc0RpcmVjdGVkRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiBlZGdlIGlzIGZvdW5kIGluIHRoZSBncmFwaC5cbiAgICpcbiAgICogQXJpdHkgMTpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKlxuICAgKiBBcml0eSAyOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC5cbiAgICovXG4gIGhhc0VkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZWRnZSA9ICcnICsgc291cmNlO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZWRnZXMuaGFzKGVkZ2UpO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgICB0YXJnZXQgPSAnJyArIHRhcmdldDtcblxuICAgICAgLy8gSWYgdGhlIG5vZGUgc291cmNlIG9yIHRoZSB0YXJnZXQgaXMgbm90IGluIHRoZSBncmFwaCB3ZSBicmVha1xuICAgICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQoc291cmNlKTtcblxuICAgICAgaWYgKCFub2RlRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBJcyB0aGVyZSBhIGRpcmVjdGVkIGVkZ2UgcG9pbnRpbmcgdG93YXJkIHRhcmdldD9cbiAgICAgIGxldCBlZGdlcyA9IHR5cGVvZiBub2RlRGF0YS5vdXQgIT09ICd1bmRlZmluZWQnICYmIG5vZGVEYXRhLm91dFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKVxuICAgICAgICBlZGdlcyA9XG4gICAgICAgICAgdHlwZW9mIG5vZGVEYXRhLnVuZGlyZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgbm9kZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdO1xuXG4gICAgICBpZiAoIWVkZ2VzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0aGlzLm11bHRpID8gISFlZGdlcy5zaXplIDogdHJ1ZTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICBgR3JhcGguaGFzRWRnZTogaW52YWxpZCBhcml0eSAoJHthcmd1bWVudHMubGVuZ3RofSwgaW5zdGVhZCBvZiAxIG9yIDIpLiBZb3UgY2FuIGVpdGhlciBhc2sgZm9yIGFuIGVkZ2UgaWQgb3IgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZWRnZSBiZXR3ZWVuIGEgc291cmNlICYgYSB0YXJnZXQuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSBkaXJlY3RlZCBmYXNoaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9IHNvdXJjZSAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKiBAcGFyYW0gIHthbnl9IHRhcmdldCAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAcmV0dXJuIHthbnl8dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBncmFwaCBpcyBtdWx0aS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBzb3VyY2Ugb3IgdGFyZ2V0IGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkaXJlY3RlZEVkZ2Uoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybjtcblxuICAgIHNvdXJjZSA9ICcnICsgc291cmNlO1xuICAgIHRhcmdldCA9ICcnICsgdGFyZ2V0O1xuXG4gICAgaWYgKHRoaXMubXVsdGkpXG4gICAgICB0aHJvdyBuZXcgVXNhZ2VHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZGlyZWN0ZWRFZGdlOiB0aGlzIG1ldGhvZCBpcyBpcnJlbGV2YW50IHdpdGggbXVsdGlncmFwaHMgc2luY2UgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgZWRnZXMgYmV0d2VlbiBzb3VyY2UgJiB0YXJnZXQuIFNlZSAjLmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHt0YXJnZXR9XCIgdGFyZ2V0IG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IChzb3VyY2VEYXRhLm91dCAmJiBzb3VyY2VEYXRhLm91dFt0YXJnZXRdKSB8fCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZWRnZURhdGEpIHJldHVybiBlZGdlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZWRnZSBtYXRjaGluZyBzb3VyY2UgJiB0YXJnZXQgaW4gYSB1bmRpcmVjdGVkIGZhc2hpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gc291cmNlIC0gVGhlIGVkZ2UncyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge2FueX0gdGFyZ2V0IC0gVGhlIGVkZ2UncyB0YXJnZXQuXG4gICAqXG4gICAqIEByZXR1cm4ge2FueXx1bmRlZmluZWR9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdyYXBoIGlzIG11bHRpLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHNvdXJjZSBvciB0YXJnZXQgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIHVuZGlyZWN0ZWRFZGdlKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RpcmVjdGVkJykgcmV0dXJuO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBpZiAodGhpcy5tdWx0aSlcbiAgICAgIHRocm93IG5ldyBVc2FnZUdyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51bmRpcmVjdGVkRWRnZTogdGhpcyBtZXRob2QgaXMgaXJyZWxldmFudCB3aXRoIG11bHRpZ3JhcGhzIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIGVkZ2VzIGJldHdlZW4gc291cmNlICYgdGFyZ2V0LiBTZWUgIy51bmRpcmVjdGVkRWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IHRoaXMuX25vZGVzLmdldChzb3VyY2UpO1xuXG4gICAgaWYgKCFzb3VyY2VEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiBzb3VyY2Ugbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5fbm9kZXMuaGFzKHRhcmdldCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZEVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRbdGFyZ2V0XSkgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGVkZ2UgbWF0Y2hpbmcgc291cmNlICYgdGFyZ2V0IGluIGEgbWl4ZWQgZmFzaGlvbi5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBzb3VyY2UgLSBUaGUgZWRnZSdzIHNvdXJjZS5cbiAgICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUaGUgZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHJldHVybiB7YW55fHVuZGVmaW5lZH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ3JhcGggaXMgbXVsdGkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgc291cmNlIG9yIHRhcmdldCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cbiAgZWRnZShzb3VyY2UsIHRhcmdldCkge1xuICAgIGlmICh0aGlzLm11bHRpKVxuICAgICAgdGhyb3cgbmV3IFVzYWdlR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmVkZ2U6IHRoaXMgbWV0aG9kIGlzIGlycmVsZXZhbnQgd2l0aCBtdWx0aWdyYXBocyBzaW5jZSB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSBlZGdlcyBiZXR3ZWVuIHNvdXJjZSAmIHRhcmdldC4gU2VlICMuZWRnZXMgaW5zdGVhZC4nXG4gICAgICApO1xuXG4gICAgc291cmNlID0gJycgKyBzb3VyY2U7XG4gICAgdGFyZ2V0ID0gJycgKyB0YXJnZXQ7XG5cbiAgICBjb25zdCBzb3VyY2VEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KHNvdXJjZSk7XG5cbiAgICBpZiAoIXNvdXJjZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZWRnZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtzb3VyY2V9XCIgc291cmNlIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAoIXRoaXMuX25vZGVzLmhhcyh0YXJnZXQpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmVkZ2U6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7dGFyZ2V0fVwiIHRhcmdldCBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgY29uc3QgZWRnZURhdGEgPVxuICAgICAgKHNvdXJjZURhdGEub3V0ICYmIHNvdXJjZURhdGEub3V0W3RhcmdldF0pIHx8XG4gICAgICAoc291cmNlRGF0YS51bmRpcmVjdGVkICYmIHNvdXJjZURhdGEudW5kaXJlY3RlZFt0YXJnZXRdKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VEYXRhKSByZXR1cm4gZWRnZURhdGEua2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIGRpcmVjdGVkIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlRGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVEaXJlY3RlZE5laWdoYm9yczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS5pbiB8fCBuZWlnaGJvciBpbiBub2RlRGF0YS5vdXQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0IG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlT3V0TmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlT3V0TmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bmRpcmVjdGVkJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIG5laWdoYm9yIGluIG5vZGVEYXRhLm91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbiBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZUluTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlSW5OZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gbmVpZ2hib3IgaW4gbm9kZURhdGEuaW47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgdW5kaXJlY3RlZCBuZWlnaGJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgICAgIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5laWdoYm9yIC0gVGhlIG5laWdoYm9yJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGFyZVVuZGlyZWN0ZWROZWlnaGJvcnMobm9kZSwgbmVpZ2hib3IpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIG5laWdoYm9yID0gJycgKyBuZWlnaGJvcjtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5hcmVVbmRpcmVjdGVkTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0d28gbm9kZXMgYXJlIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlTmVpZ2hib3JzKG5vZGUsIG5laWdoYm9yKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcbiAgICBuZWlnaGJvciA9ICcnICsgbmVpZ2hib3I7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguYXJlTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLmluIHx8IG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBpbmJvdW5kIG5laWdoYm9ycy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAgICAgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHBhcmFtICB7YW55fSAgICAgbmVpZ2hib3IgLSBUaGUgbmVpZ2hib3IncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgYXJlSW5ib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZUluYm91bmROZWlnaGJvcnM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKSB7XG4gICAgICBpZiAobmVpZ2hib3IgaW4gbm9kZURhdGEuaW4pIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGlmIChuZWlnaGJvciBpbiBub2RlRGF0YS51bmRpcmVjdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB3aGV0aGVyIHR3byBub2RlcyBhcmUgb3V0Ym91bmQgbmVpZ2hib3JzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlICAgICAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBuZWlnaGJvciAtIFRoZSBuZWlnaGJvcidzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBhcmVPdXRib3VuZE5laWdoYm9ycyhub2RlLCBuZWlnaGJvcikge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG4gICAgbmVpZ2hib3IgPSAnJyArIG5laWdoYm9yO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmFyZU91dGJvdW5kTmVpZ2hib3JzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLm91dCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RpcmVjdGVkJykge1xuICAgICAgaWYgKG5laWdoYm9yIGluIG5vZGVEYXRhLnVuZGlyZWN0ZWQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpbkRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIG91dCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5vdXREZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5vdXREZWdyZWUgKyBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgLSBUaGUgbm9kZSdzIGluIGRlZ3JlZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgbm9kZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBkaXJlY3RlZERlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgY29uc3QgbG9vcHMgPSBub2RlRGF0YS5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIGNvbnN0IGluRGVncmVlID0gbm9kZURhdGEuaW5EZWdyZWUgKyBsb29wcztcbiAgICBjb25zdCBvdXREZWdyZWUgPSBub2RlRGF0YS5vdXREZWdyZWUgKyBsb29wcztcblxuICAgIHJldHVybiBpbkRlZ3JlZSArIG91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgdW5kaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudW5kaXJlY3RlZERlZ3JlZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAnZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IGxvb3BzID0gbm9kZURhdGEudW5kaXJlY3RlZFNlbGZMb29wcztcblxuICAgIHJldHVybiBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlICsgbG9vcHMgKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyBkaXJlY3RlZCBkZWdyZWUuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kZWdyZWU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgbGV0IGRlZ3JlZSA9IDA7XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAnZGlyZWN0ZWQnKSB7XG4gICAgICBkZWdyZWUgKz0gbm9kZURhdGEudW5kaXJlY3RlZERlZ3JlZSArIG5vZGVEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9XG4gICAgICAgIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlICsgbm9kZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMgKiAyO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGluIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGluRGVncmVlV2l0aG91dFNlbGZMb29wcyhub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pbkRlZ3JlZVdpdGhvdXRTZWxmTG9vcHM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3VuZGlyZWN0ZWQnKSByZXR1cm4gMDtcblxuICAgIHJldHVybiBub2RlRGF0YS5pbkRlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3Mgb3V0IGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIG91dERlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgub3V0RGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLm91dERlZ3JlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBnaXZlbiBub2RlJ3MgZGlyZWN0ZWQgZGVncmVlIHdpdGhvdXQgY29uc2lkZXJpbmcgc2VsZiBsb29wcy5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgbm9kZSAtIFRoZSBub2RlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgIC0gVGhlIG5vZGUncyBpbiBkZWdyZWUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmRpcmVjdGVkRGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy50eXBlID09PSAndW5kaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgdGhlIGdpdmVuIG5vZGUncyB1bmRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzKG5vZGUpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuXG4gICAgY29uc3Qgbm9kZURhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoIW5vZGVEYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLnVuZGlyZWN0ZWREZWdyZWVXaXRob3V0U2VsZkxvb3BzOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke25vZGV9XCIgbm9kZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdkaXJlY3RlZCcpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIG5vZGVEYXRhLnVuZGlyZWN0ZWREZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gbm9kZSdzIGRpcmVjdGVkIGRlZ3JlZSB3aXRob3V0IGNvbnNpZGVyaW5nIHNlbGYgbG9vcHMuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIG5vZGUgLSBUaGUgbm9kZSdzIGtleS5cbiAgICogQHJldHVybiB7bnVtYmVyfSAgICAgICAtIFRoZSBub2RlJ3MgaW4gZGVncmVlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGRlZ3JlZVdpdGhvdXRTZWxmTG9vcHMobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuX25vZGVzLmdldChub2RlKTtcblxuICAgIGlmICghbm9kZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZGVncmVlV2l0aG91dFNlbGZMb29wczogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICBsZXQgZGVncmVlID0gMDtcblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICdkaXJlY3RlZCcpIHtcbiAgICAgIGRlZ3JlZSArPSBub2RlRGF0YS51bmRpcmVjdGVkRGVncmVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgIT09ICd1bmRpcmVjdGVkJykge1xuICAgICAgZGVncmVlICs9IG5vZGVEYXRhLmluRGVncmVlICsgbm9kZURhdGEub3V0RGVncmVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWdyZWU7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3Mgc291cmNlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHNvdXJjZShlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguc291cmNlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIHRhcmdldC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAtIFRoZSBlZGdlJ3MgdGFyZ2V0LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIHRhcmdldChlZGdlKSB7XG4gICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudGFyZ2V0OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnRhcmdldC5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ2l2ZW4gZWRnZSdzIGV4dHJlbWl0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHthcnJheX0gICAgICAtIFRoZSBlZGdlJ3MgZXh0cmVtaXRpZXMuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgZXh0cmVtaXRpZXMoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZWRnZURhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguZXh0cmVtaXRpZXM6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIFtlZGdlRGF0YS5zb3VyY2Uua2V5LCBlZGdlRGF0YS50YXJnZXQua2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIG5vZGUgJiBhbiBlZGdlLCByZXR1cm5zIHRoZSBvdGhlciBleHRyZW1pdHkgb2YgdGhlIGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgIC0gVGhlIHJlbGF0ZWQgbm9kZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGggb3IgaWYgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgIGVkZ2UgJiBub2RlIGFyZSBub3QgcmVsYXRlZC5cbiAgICovXG4gIG9wcG9zaXRlKG5vZGUsIGVkZ2UpIHtcbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLm9wcG9zaXRlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGRhdGEuc291cmNlLmtleTtcbiAgICBjb25zdCB0YXJnZXQgPSBkYXRhLnRhcmdldC5rZXk7XG5cbiAgICBpZiAobm9kZSA9PT0gc291cmNlKSByZXR1cm4gdGFyZ2V0O1xuICAgIGlmIChub2RlID09PSB0YXJnZXQpIHJldHVybiBzb3VyY2U7XG5cbiAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgYEdyYXBoLm9wcG9zaXRlOiB0aGUgXCIke25vZGV9XCIgbm9kZSBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIFwiJHtlZGdlfVwiIGVkZ2UgKCR7c291cmNlfSwgJHt0YXJnZXR9KS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaGFzIHRoZSBnaXZlbiBub2RlIGFzIGV4dHJlbWl0eS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBub2RlIC0gVGhlIG5vZGUncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgLSBUaGUgcmVsYXRlZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIGVpdGhlciB0aGUgbm9kZSBvciB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBoYXNFeHRyZW1pdHkoZWRnZSwgbm9kZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGguaGFzRXh0cmVtaXR5OiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBkYXRhLnNvdXJjZS5rZXkgPT09IG5vZGUgfHwgZGF0YS50YXJnZXQua2V5ID09PSBub2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyB1bmRpcmVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICBlZGdlIC0gVGhlIGVkZ2UncyBrZXkuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgaXNuJ3QgaW4gdGhlIGdyYXBoLlxuICAgKi9cbiAgaXNVbmRpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc1VuZGlyZWN0ZWQ6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEudW5kaXJlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIGVkZ2UgaXMgZGlyZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgIGVkZ2UgLSBUaGUgZWRnZSdzIGtleS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpc24ndCBpbiB0aGUgZ3JhcGguXG4gICAqL1xuICBpc0RpcmVjdGVkKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5pc0RpcmVjdGVkOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiAhZGF0YS51bmRpcmVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWRnZSBpcyBhIHNlbGYgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICAgZWRnZSAtIFRoZSBlZGdlJ3Mga2V5LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBlZGdlIGlzbid0IGluIHRoZSBncmFwaC5cbiAgICovXG4gIGlzU2VsZkxvb3AoZWRnZSkge1xuICAgIGVkZ2UgPSAnJyArIGVkZ2U7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZWRnZXMuZ2V0KGVkZ2UpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmlzU2VsZkxvb3A6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7ZWRnZX1cIiBlZGdlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGRhdGEuc291cmNlID09PSBkYXRhLnRhcmdldDtcbiAgfVxuXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBNdXRhdGlvblxuICAgKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgdG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBleGlzdC5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmUgbm90IGFuIG9iamVjdC5cbiAgICovXG4gIGFkZE5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gYWRkTm9kZSh0aGlzLCBub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIHJldHVybiBub2RlRGF0YS5rZXk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gbWVyZ2UgYSBub2RlIGludG8gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIG5vZGUgICAgICAgICAtIFRoZSBub2RlLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IFthdHRyaWJ1dGVzXSAtIE9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgIC0gVGhlIG5vZGUuXG4gICAqL1xuICBtZXJnZU5vZGUobm9kZSwgYXR0cmlidXRlcykge1xuICAgIGlmIChhdHRyaWJ1dGVzICYmICFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgubWVyZ2VOb2RlOiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhbiBvYmplY3QgYnV0IGdvdCBcIiR7YXR0cmlidXRlc31cImBcbiAgICAgICk7XG5cbiAgICAvLyBTdHJpbmcgY29lcmNpb25cbiAgICBub2RlID0gJycgKyBub2RlO1xuICAgIGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzIHx8IHt9O1xuXG4gICAgLy8gSWYgdGhlIG5vZGUgYWxyZWFkeSBleGlzdHMsIHdlIG1lcmdlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgYXNzaWduKGRhdGEuYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdub2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICAgICAgdHlwZTogJ21lcmdlJyxcbiAgICAgICAgICBrZXk6IG5vZGUsXG4gICAgICAgICAgYXR0cmlidXRlczogZGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW25vZGUsIGZhbHNlXTtcbiAgICB9XG5cbiAgICBkYXRhID0gbmV3IHRoaXMuTm9kZURhdGFDbGFzcyhub2RlLCBhdHRyaWJ1dGVzKTtcblxuICAgIC8vIEFkZGluZyB0aGUgbm9kZSB0byBpbnRlcm5hbCByZWdpc3RlclxuICAgIHRoaXMuX25vZGVzLnNldChub2RlLCBkYXRhKTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdub2RlQWRkZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW25vZGUsIHRydWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGFkZCBhIG5vZGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGdyYXBoIG9yIGVsc2UgdG9cbiAgICogdXBkYXRlIGl0cyBhdHRyaWJ1dGVzIHVzaW5nIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICAgICBub2RlICAgICAgLSBUaGUgbm9kZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IFt1cGRhdGVyXSAtIE9wdGlvbmFsIHVwZGF0ZXIgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge2FueX0gICAgICAgICAgICAgICAgLSBUaGUgbm9kZS5cbiAgICovXG4gIHVwZGF0ZU5vZGUobm9kZSwgdXBkYXRlcikge1xuICAgIGlmICh1cGRhdGVyICYmIHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICBgR3JhcGgudXBkYXRlTm9kZTogaW52YWxpZCB1cGRhdGVyIGZ1bmN0aW9uLiBFeHBlY3RpbmcgYSBmdW5jdGlvbiBidXQgZ290IFwiJHt1cGRhdGVyfVwiYFxuICAgICAgKTtcblxuICAgIC8vIFN0cmluZyBjb2VyY2lvblxuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICAvLyBJZiB0aGUgbm9kZSBhbHJlYWR5IGV4aXN0cywgd2UgdXBkYXRlIHRoZSBhdHRyaWJ1dGVzXG4gICAgbGV0IGRhdGEgPSB0aGlzLl9ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKHVwZGF0ZXIpIHtcbiAgICAgICAgY29uc3Qgb2xkQXR0cmlidXRlcyA9IGRhdGEuYXR0cmlidXRlcztcbiAgICAgICAgZGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihvbGRBdHRyaWJ1dGVzKTtcblxuICAgICAgICB0aGlzLmVtaXQoJ25vZGVBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICAgICAga2V5OiBub2RlLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbm9kZSwgZmFsc2VdO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB1cGRhdGVyID8gdXBkYXRlcih7fSkgOiB7fTtcblxuICAgIGRhdGEgPSBuZXcgdGhpcy5Ob2RlRGF0YUNsYXNzKG5vZGUsIGF0dHJpYnV0ZXMpO1xuXG4gICAgLy8gQWRkaW5nIHRoZSBub2RlIHRvIGludGVybmFsIHJlZ2lzdGVyXG4gICAgdGhpcy5fbm9kZXMuc2V0KG5vZGUsIGRhdGEpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ25vZGVBZGRlZCcsIHtcbiAgICAgIGtleTogbm9kZSxcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiBbbm9kZSwgdHJ1ZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBub2RlICYgYWxsIGl0cyBhdHRhY2hlZCBlZGdlcyBmcm9tIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgICBub2RlIC0gVGhlIG5vZGUuXG4gICAqIEByZXR1cm4ge0dyYXBofVxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGRvZXNuJ3QgZXhpc3QuXG4gICAqL1xuICBkcm9wTm9kZShub2RlKSB7XG4gICAgbm9kZSA9ICcnICsgbm9kZTtcblxuICAgIGNvbnN0IG5vZGVEYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFub2RlRGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5kcm9wTm9kZTogY291bGQgbm90IGZpbmQgdGhlIFwiJHtub2RlfVwiIG5vZGUgaW4gdGhlIGdyYXBoLmBcbiAgICAgICk7XG5cbiAgICAvLyBSZW1vdmluZyBhdHRhY2hlZCBlZGdlc1xuICAgIC8vIFRPRE86IHdlIGNvdWxkIGRvIGZhc3RlclxuICAgIHRoaXMuZm9yRWFjaEVkZ2Uobm9kZSwgZWRnZSA9PiB7XG4gICAgICB0aGlzLmRyb3BFZGdlKGVkZ2UpO1xuICAgIH0pO1xuXG4gICAgLy8gRHJvcHBpbmcgdGhlIG5vZGUgZnJvbSB0aGUgcmVnaXN0ZXJcbiAgICB0aGlzLl9ub2Rlcy5kZWxldGUobm9kZSk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnbm9kZURyb3BwZWQnLCB7XG4gICAgICBrZXk6IG5vZGUsXG4gICAgICBhdHRyaWJ1dGVzOiBub2RlRGF0YS5hdHRyaWJ1dGVzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gZHJvcCBhIHNpbmdsZSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBBcml0eSAxOlxuICAgKiBAcGFyYW0gIHthbnl9ICAgIGVkZ2UgLSBUaGUgZWRnZS5cbiAgICpcbiAgICogQXJpdHkgMjpcbiAgICogQHBhcmFtICB7YW55fSAgICBzb3VyY2UgLSBTb3VyY2Ugbm9kZS5cbiAgICogQHBhcmFtICB7YW55fSAgICB0YXJnZXQgLSBUYXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFdpbGwgdGhyb3cgaWYgdGhlIGVkZ2UgZG9lc24ndCBleGlzdC5cbiAgICovXG4gIGRyb3BFZGdlKGVkZ2UpIHtcbiAgICBsZXQgZWRnZURhdGE7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9ICcnICsgYXJndW1lbnRzWzBdLFxuICAgICAgICB0YXJnZXQgPSAnJyArIGFyZ3VtZW50c1sxXTtcblxuICAgICAgZWRnZURhdGEgPSBnZXRNYXRjaGluZ0VkZ2UodGhpcywgc291cmNlLCB0YXJnZXQsIHRoaXMudHlwZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke3NvdXJjZX1cIiAtPiBcIiR7dGFyZ2V0fVwiIGVkZ2UgaW4gdGhlIGdyYXBoLmBcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZSA9ICcnICsgZWRnZTtcblxuICAgICAgZWRnZURhdGEgPSB0aGlzLl9lZGdlcy5nZXQoZWRnZSk7XG5cbiAgICAgIGlmICghZWRnZURhdGEpXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgICAgYEdyYXBoLmRyb3BFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIERyb3BwaW5nIHRoZSBlZGdlIGZyb20gdGhlIHJlZ2lzdGVyXG4gICAgdGhpcy5fZWRnZXMuZGVsZXRlKGVkZ2VEYXRhLmtleSk7XG5cbiAgICAvLyBVcGRhdGluZyByZWxhdGVkIGRlZ3JlZXNcbiAgICBjb25zdCB7c291cmNlOiBzb3VyY2VEYXRhLCB0YXJnZXQ6IHRhcmdldERhdGEsIGF0dHJpYnV0ZXN9ID0gZWRnZURhdGE7XG5cbiAgICBjb25zdCB1bmRpcmVjdGVkID0gZWRnZURhdGEudW5kaXJlY3RlZDtcblxuICAgIGlmIChzb3VyY2VEYXRhID09PSB0YXJnZXREYXRhKSB7XG4gICAgICBpZiAodW5kaXJlY3RlZCkge1xuICAgICAgICBzb3VyY2VEYXRhLnVuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fdW5kaXJlY3RlZFNlbGZMb29wQ291bnQtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEuZGlyZWN0ZWRTZWxmTG9vcHMtLTtcbiAgICAgICAgdGhpcy5fZGlyZWN0ZWRTZWxmTG9vcENvdW50LS07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1bmRpcmVjdGVkKSB7XG4gICAgICAgIHNvdXJjZURhdGEudW5kaXJlY3RlZERlZ3JlZS0tO1xuICAgICAgICB0YXJnZXREYXRhLnVuZGlyZWN0ZWREZWdyZWUtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZURhdGEub3V0RGVncmVlLS07XG4gICAgICAgIHRhcmdldERhdGEuaW5EZWdyZWUtLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhcmluZyBpbmRleFxuICAgIGNsZWFyRWRnZUZyb21TdHJ1Y3R1cmVJbmRleCh0aGlzLCB1bmRpcmVjdGVkLCBlZGdlRGF0YSk7XG5cbiAgICBpZiAodW5kaXJlY3RlZCkgdGhpcy5fdW5kaXJlY3RlZFNpemUtLTtcbiAgICBlbHNlIHRoaXMuX2RpcmVjdGVkU2l6ZS0tO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2VkZ2VEcm9wcGVkJywge1xuICAgICAga2V5OiBlZGdlLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHNvdXJjZTogc291cmNlRGF0YS5rZXksXG4gICAgICB0YXJnZXQ6IHRhcmdldERhdGEua2V5LFxuICAgICAgdW5kaXJlY3RlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gcmVtb3ZlIGV2ZXJ5IGVkZ2UgJiBldmVyeSBub2RlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyaW5nIG5vZGVzXG4gICAgdGhpcy5fbm9kZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHJlbW92ZSBldmVyeSBlZGdlIGZyb20gdGhlIGdyYXBoLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIGNsZWFyRWRnZXMoKSB7XG4gICAgY2xlYXJTdHJ1Y3R1cmVJbmRleCh0aGlzKTtcblxuICAgIC8vIENsZWFyaW5nIGVkZ2VzXG4gICAgdGhpcy5fZWRnZXMuY2xlYXIoKTtcblxuICAgIC8vIFJlc2V0IGNvdW50ZXJzXG4gICAgdGhpcy5fcmVzZXRJbnN0YW5jZUNvdW50ZXJzKCk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnZWRnZXNDbGVhcmVkJyk7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQXR0cmlidXRlcy1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgZ3JhcGggaGFzIHRoZSBkZXNpcmVkIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgbmFtZSAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0F0dHJpYnV0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHNldHRpbmcgYSB2YWx1ZSBmb3IgdGhlIGRlc2lyZWQgZ3JhcGgncyBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFZhbHVlIGZvciB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcblxuICAgIC8vIEVtaXR0aW5nXG4gICAgdGhpcy5lbWl0KCdhdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIHR5cGU6ICdzZXQnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIG5hbWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2luZyBhIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgZGVzaXJlZCBncmFwaCdzIGF0dHJpYnV0ZSdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgbmFtZSAgICAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHBhcmFtICB7ZnVuY3Rpb259IHVwZGF0ZXIgLSBGdW5jdGlvbiB1c2UgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZS5cbiAgICogQHJldHVybiB7R3JhcGh9XG4gICAqL1xuICB1cGRhdGVBdHRyaWJ1dGUobmFtZSwgdXBkYXRlcikge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUF0dHJpYnV0ZTogdXBkYXRlciBzaG91bGQgYmUgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlc1tuYW1lXSA9IHVwZGF0ZXIodmFsdWUpO1xuXG4gICAgLy8gRW1pdHRpbmdcbiAgICB0aGlzLmVtaXQoJ2F0dHJpYnV0ZXNVcGRhdGVkJywge1xuICAgICAgdHlwZTogJ3NldCcsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzLFxuICAgICAgbmFtZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlbW92aW5nIHRoZSBkZXNpcmVkIGdyYXBoJ3MgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICovXG4gIHJlbW92ZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuX2F0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXMsXG4gICAgICBuYW1lXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmVwbGFjaW5nIHRoZSBncmFwaCdzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gYXR0cmlidXRlcyAtIE5ldyBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICByZXBsYWNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGF0dHJpYnV0ZXMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgucmVwbGFjZUF0dHJpYnV0ZXM6IHByb3ZpZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhIHBsYWluIG9iamVjdC4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAncmVwbGFjZScsXG4gICAgICBhdHRyaWJ1dGVzOiB0aGlzLl9hdHRyaWJ1dGVzXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgbWVyZ2luZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIG1lcmdlLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiBhdHRyaWJ1dGVzIGFyZSBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAqL1xuICBtZXJnZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1lcmdlQXR0cmlidXRlczogcHJvdmlkZWQgYXR0cmlidXRlcyBhcmUgbm90IGEgcGxhaW4gb2JqZWN0LidcbiAgICAgICk7XG5cbiAgICBhc3NpZ24odGhpcy5fYXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAnbWVyZ2UnLFxuICAgICAgYXR0cmlidXRlczogdGhpcy5fYXR0cmlidXRlcyxcbiAgICAgIGRhdGE6IGF0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGRhdGluZyB0aGUgZ3JhcGgncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gdXBkYXRlciAtIEZ1bmN0aW9uIHVzZWQgdG8gdXBkYXRlIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH1cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiBnaXZlbiB1cGRhdGVyIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgKi9cbiAgdXBkYXRlQXR0cmlidXRlcyh1cGRhdGVyKSB7XG4gICAgaWYgKHR5cGVvZiB1cGRhdGVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlQXR0cmlidXRlczogcHJvdmlkZWQgdXBkYXRlciBpcyBub3QgYSBmdW5jdGlvbi4nXG4gICAgICApO1xuXG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IHVwZGF0ZXIodGhpcy5fYXR0cmlidXRlcyk7XG5cbiAgICAvLyBFbWl0dGluZ1xuICAgIHRoaXMuZW1pdCgnYXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuX2F0dHJpYnV0ZXNcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIHVwZGF0ZSBlYWNoIG5vZGUncyBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gIHVwZGF0ZXIgLSBVcGRhdGVyIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9ICAgIFtoaW50c10gLSBPcHRpb25hbCBoaW50cy5cbiAgICovXG4gIHVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlcyh1cGRhdGVyLCBoaW50cykge1xuICAgIGlmICh0eXBlb2YgdXBkYXRlciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnVwZGF0ZUVhY2hOb2RlQXR0cmlidXRlczogZXhwZWN0aW5nIGFuIHVwZGF0ZXIgZnVuY3Rpb24uJ1xuICAgICAgKTtcblxuICAgIGlmIChoaW50cyAmJiAhdmFsaWRhdGVIaW50cyhoaW50cykpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoTm9kZUF0dHJpYnV0ZXM6IGludmFsaWQgaGludHMuIEV4cGVjdGluZyBhbiBvYmplY3QgaGF2aW5nIHRoZSBmb2xsb3dpbmcgc2hhcGU6IHthdHRyaWJ1dGVzPzogW3N0cmluZ119J1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgbm9kZURhdGEuYXR0cmlidXRlcyA9IHVwZGF0ZXIobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoJ2VhY2hOb2RlQXR0cmlidXRlc1VwZGF0ZWQnLCB7XG4gICAgICBoaW50czogaGludHMgPyBoaW50cyA6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCB0byB1cGRhdGUgZWFjaCBlZGdlJ3MgYXR0cmlidXRlcyB1c2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259ICB1cGRhdGVyIC0gVXBkYXRlciBmdW5jdGlvbiB0byB1c2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSAgICBbaGludHNdIC0gT3B0aW9uYWwgaGludHMuXG4gICAqL1xuICB1cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXModXBkYXRlciwgaGludHMpIHtcbiAgICBpZiAodHlwZW9mIHVwZGF0ZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC51cGRhdGVFYWNoRWRnZUF0dHJpYnV0ZXM6IGV4cGVjdGluZyBhbiB1cGRhdGVyIGZ1bmN0aW9uLidcbiAgICAgICk7XG5cbiAgICBpZiAoaGludHMgJiYgIXZhbGlkYXRlSGludHMoaGludHMpKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGgudXBkYXRlRWFjaEVkZ2VBdHRyaWJ1dGVzOiBpbnZhbGlkIGhpbnRzLiBFeHBlY3RpbmcgYW4gb2JqZWN0IGhhdmluZyB0aGUgZm9sbG93aW5nIHNoYXBlOiB7YXR0cmlidXRlcz86IFtzdHJpbmddfSdcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX2VkZ2VzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIGVkZ2VEYXRhLCBzb3VyY2VEYXRhLCB0YXJnZXREYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGVkZ2VEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIHNvdXJjZURhdGEgPSBlZGdlRGF0YS5zb3VyY2U7XG4gICAgICB0YXJnZXREYXRhID0gZWRnZURhdGEudGFyZ2V0O1xuXG4gICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzID0gdXBkYXRlcihcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBzb3VyY2VEYXRhLmtleSxcbiAgICAgICAgdGFyZ2V0RGF0YS5rZXksXG4gICAgICAgIHNvdXJjZURhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgdGFyZ2V0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICBlZGdlRGF0YS51bmRpcmVjdGVkXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgnZWFjaEVkZ2VBdHRyaWJ1dGVzVXBkYXRlZCcsIHtcbiAgICAgIGhpbnRzOiBoaW50cyA/IGhpbnRzIDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEl0ZXJhdGlvbi1yZWxhdGVkIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3MgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQWRqYWNlbmN5RW50cnk6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmZvckVhY2hBZGphY2VuY3lFbnRyeVdpdGhPcnBoYW5zOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nXG4gICAgICApO1xuXG4gICAgaWYgKHRoaXMubXVsdGkpIGZvckVhY2hBZGphY2VuY3lNdWx0aShmYWxzZSwgZmFsc2UsIHRydWUsIHRoaXMsIGNhbGxiYWNrKTtcbiAgICBlbHNlIGZvckVhY2hBZGphY2VuY3lTaW1wbGUoZmFsc2UsIGZhbHNlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGl0ZXJhdGluZyBvdmVyIHRoZSBncmFwaCdzIGFzc3ltZXRyaWMgYWRqYWNlbmN5IHVzaW5nIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIHRvIHVzZS5cbiAgICovXG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnkoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaEFzc3ltZXRyaWNBZGphY2VuY3lFbnRyeTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmICh0aGlzLm11bHRpKSBmb3JFYWNoQWRqYWNlbmN5TXVsdGkoZmFsc2UsIHRydWUsIGZhbHNlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCBmYWxzZSwgdGhpcywgY2FsbGJhY2spO1xuICB9XG4gIGZvckVhY2hBc3N5bWV0cmljQWRqYWNlbmN5RW50cnlXaXRoT3JwaGFucyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5mb3JFYWNoQXNzeW1ldHJpY0FkamFjZW5jeUVudHJ5V2l0aE9ycGhhbnM6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBpZiAodGhpcy5tdWx0aSkgZm9yRWFjaEFkamFjZW5jeU11bHRpKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gICAgZWxzZSBmb3JFYWNoQWRqYWNlbmN5U2ltcGxlKGZhbHNlLCB0cnVlLCB0cnVlLCB0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyB0aGUgbGlzdCBvZiB0aGUgZ3JhcGgncyBub2Rlcy5cbiAgICpcbiAgICogQHJldHVybiB7YXJyYXl9IC0gVGhlIG5vZGVzLlxuICAgKi9cbiAgbm9kZXMoKSB7XG4gICAgaWYgKHR5cGVvZiBBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9ub2Rlcy5rZXlzKCkpO1xuXG4gICAgcmV0dXJuIHRha2UodGhpcy5fbm9kZXMua2V5cygpLCB0aGlzLl9ub2Rlcy5zaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaXRlcmF0aW5nIG92ZXIgdGhlIGdyYXBoJ3Mgbm9kZXMgdXNpbmcgdGhlIGdpdmVuIGNhbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcywgaW5kZXgpLlxuICAgKi9cbiAgZm9yRWFjaE5vZGUoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnR3JhcGguZm9yRWFjaE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgd2hpbGUgKCgoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSksIHN0ZXAuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIG5vZGVEYXRhID0gc3RlcC52YWx1ZTtcbiAgICAgIGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpdGVyYXRpbmcgYXR0ZW1wdGluZyB0byBmaW5kIGEgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaW5kTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maW5kTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIG5vZGVEYXRhLmtleTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIG1hcHBpbmcgbm9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBDYWxsYmFjayAoa2V5LCBhdHRyaWJ1dGVzKS5cbiAgICovXG4gIG1hcE5vZGVzKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLm1hcE5vZGU6IGV4cGVjdGluZyBhIGNhbGxiYWNrLidcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgbGV0IHN0ZXAsIG5vZGVEYXRhO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMub3JkZXIpO1xuICAgIGxldCBpID0gMDtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG4gICAgICByZXN1bHRbaSsrXSA9IGNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgc29tZSBub2RlIHZlcmlmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBzb21lTm9kZShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5zb21lTm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoY2FsbGJhY2sobm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciBhbGwgbm9kZSB2ZXJpZnkgdGhlIGdpdmVuIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtICB7ZnVuY3Rpb259ICBjYWxsYmFjayAtIENhbGxiYWNrIChrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgZXZlcnlOb2RlKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmV2ZXJ5Tm9kZTogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICBpZiAoIWNhbGxiYWNrKG5vZGVEYXRhLmtleSwgbm9kZURhdGEuYXR0cmlidXRlcykpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgZmlsdGVyaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGtleSwgYXR0cmlidXRlcykuXG4gICAqL1xuICBmaWx0ZXJOb2RlcyhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5maWx0ZXJOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgoKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLCBzdGVwLmRvbmUgIT09IHRydWUpKSB7XG4gICAgICBub2RlRGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIGlmIChjYWxsYmFjayhub2RlRGF0YS5rZXksIG5vZGVEYXRhLmF0dHJpYnV0ZXMpKVxuICAgICAgICByZXN1bHQucHVzaChub2RlRGF0YS5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJlZHVjaW5nIG5vZGVzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gIGNhbGxiYWNrIC0gQ2FsbGJhY2sgKGFjY3VtdWxhdG9yLCBrZXksIGF0dHJpYnV0ZXMpLlxuICAgKi9cbiAgcmVkdWNlTm9kZXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdHcmFwaC5yZWR1Y2VOb2RlczogZXhwZWN0aW5nIGEgY2FsbGJhY2suJ1xuICAgICAgKTtcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMilcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLnJlZHVjZU5vZGVzOiBtaXNzaW5nIGluaXRpYWwgdmFsdWUuIFlvdSBtdXN0IHByb3ZpZGUgaXQgYmVjYXVzZSB0aGUgY2FsbGJhY2sgdGFrZXMgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBhbmQgd2UgY2Fubm90IGluZmVyIHRoZSBpbml0aWFsIHZhbHVlIGZyb20gdGhlIGZpcnN0IGl0ZXJhdGlvbiwgYXMgeW91IGNvdWxkIHdpdGggYSBzaW1wbGUgYXJyYXkuJ1xuICAgICAgKTtcblxuICAgIGxldCBhY2N1bXVsYXRvciA9IGluaXRpYWxWYWx1ZTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fbm9kZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgbm9kZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgbm9kZURhdGEgPSBzdGVwLnZhbHVlO1xuICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgbm9kZURhdGEua2V5LCBub2RlRGF0YS5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBpdGVyYXRvciBvdmVyIHRoZSBncmFwaCdzIG5vZGUgZW50cmllcy5cbiAgICpcbiAgICogQHJldHVybiB7SXRlcmF0b3J9XG4gICAqL1xuICBub2RlRW50cmllcygpIHtcbiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuX25vZGVzLnZhbHVlcygpO1xuXG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcigoKSA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICBpZiAoc3RlcC5kb25lKSByZXR1cm4gc3RlcDtcblxuICAgICAgY29uc3QgZGF0YSA9IHN0ZXAudmFsdWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7bm9kZTogZGF0YS5rZXksIGF0dHJpYnV0ZXM6IGRhdGEuYXR0cmlidXRlc30sXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIFNlcmlhbGl6YXRpb25cbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgZXhwb3J0aW5nIHRoZSB0YXJnZXQgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICB7YW55fSAgIG5vZGUgLSBUYXJnZXQgbm9kZS5cbiAgICogQHJldHVybiB7YXJyYXl9ICAgICAgLSBUaGUgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBXaWxsIHRocm93IGlmIHRoZSBub2RlIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIGV4cG9ydE5vZGUobm9kZSkge1xuICAgIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fbm9kZXMuZ2V0KG5vZGUpO1xuXG4gICAgaWYgKCFkYXRhKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kR3JhcGhFcnJvcihcbiAgICAgICAgYEdyYXBoLmV4cG9ydE5vZGU6IGNvdWxkIG5vdCBmaW5kIHRoZSBcIiR7bm9kZX1cIiBub2RlIGluIHRoZSBncmFwaC5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZU5vZGUobm9kZSwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGV4cG9ydGluZyB0aGUgdGFyZ2V0IGVkZ2UuXG4gICAqXG4gICAqIEBwYXJhbSAge2FueX0gICBlZGdlIC0gVGFyZ2V0IGVkZ2UuXG4gICAqIEByZXR1cm4ge2FycmF5fSAgICAgIC0gVGhlIHNlcmlhbGl6ZWQgZWRnZS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IC0gV2lsbCB0aHJvdyBpZiB0aGUgZWRnZSBpcyBub3QgZm91bmQuXG4gICAqL1xuICBleHBvcnRFZGdlKGVkZ2UpIHtcbiAgICBlZGdlID0gJycgKyBlZGdlO1xuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2VkZ2VzLmdldChlZGdlKTtcblxuICAgIGlmICghZGF0YSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEdyYXBoRXJyb3IoXG4gICAgICAgIGBHcmFwaC5leHBvcnRFZGdlOiBjb3VsZCBub3QgZmluZCB0aGUgXCIke2VkZ2V9XCIgZWRnZSBpbiB0aGUgZ3JhcGguYFxuICAgICAgKTtcblxuICAgIHJldHVybiBzZXJpYWxpemVFZGdlKGVkZ2UsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGV4cG9ydCB0aGUgd2hvbGUgZ3JhcGguXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICovXG4gIGV4cG9ydCgpIHtcbiAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheSh0aGlzLl9ub2Rlcy5zaXplKTtcblxuICAgIGxldCBpID0gMDtcblxuICAgIHRoaXMuX25vZGVzLmZvckVhY2goKGRhdGEsIGtleSkgPT4ge1xuICAgICAgbm9kZXNbaSsrXSA9IHNlcmlhbGl6ZU5vZGUoa2V5LCBkYXRhKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGVkZ2VzID0gbmV3IEFycmF5KHRoaXMuX2VkZ2VzLnNpemUpO1xuXG4gICAgaSA9IDA7XG5cbiAgICB0aGlzLl9lZGdlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIGVkZ2VzW2krK10gPSBzZXJpYWxpemVFZGdlKGtleSwgZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRlczogdGhpcy5nZXRBdHRyaWJ1dGVzKCksXG4gICAgICBub2RlcyxcbiAgICAgIGVkZ2VzLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIG11bHRpOiB0aGlzLm11bHRpLFxuICAgICAgICBhbGxvd1NlbGZMb29wczogdGhpcy5hbGxvd1NlbGZMb29wc1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGRhdGEgICAtIFRoZSBzZXJpYWxpemVkIG5vZGUuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gbm9kZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnROb2RlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWROb2RlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnROb2RlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgbm9kZS4gQSBzZXJpYWxpemVkIG5vZGUgc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcImtleVwiIHByb3BlcnR5LidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ25vLWtleScpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogbm8ga2V5IHByb3ZpZGVkLidcbiAgICAgICAgKTtcbiAgICAgIGlmIChlcnJvciA9PT0gJ2ludmFsaWQtYXR0cmlidXRlcycpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0Tm9kZTogaW52YWxpZCBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCwgbnVsbCBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIG5vZGVcbiAgICBjb25zdCB7a2V5LCBhdHRyaWJ1dGVzID0ge319ID0gZGF0YTtcblxuICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZU5vZGUoa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICBlbHNlIHRoaXMuYWRkTm9kZShrZXksIGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHVzZWQgdG8gaW1wb3J0IGEgc2VyaWFsaXplZCBlZGdlLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICBkYXRhICAtIFRoZSBzZXJpYWxpemVkIGVkZ2UuXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB0aGUgZ2l2ZW4gZWRnZS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgLSBSZXR1cm5zIGl0c2VsZiBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBpbXBvcnRFZGdlKGRhdGEsIG1lcmdlID0gZmFsc2UpIHtcbiAgICAvLyBWYWxpZGF0aW5nXG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVNlcmlhbGl6ZWRFZGdlKGRhdGEpO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgPT09ICdub3Qtb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBpbnZhbGlkIHNlcmlhbGl6ZWQgZWRnZS4gQSBzZXJpYWxpemVkIGVkZ2Ugc2hvdWxkIGJlIGEgcGxhaW4gb2JqZWN0IHdpdGggYXQgbGVhc3QgYSBcInNvdXJjZVwiICYgXCJ0YXJnZXRcIiBwcm9wZXJ0eS4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICduby1zb3VyY2UnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IG1pc3Npbmcgc291Y2UuJ1xuICAgICAgICApO1xuICAgICAgaWYgKGVycm9yID09PSAnbm8tdGFyZ2V0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAgICdHcmFwaC5pbXBvcnRFZGdlOiBtaXNzaW5nIHRhcmdldC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLWF0dHJpYnV0ZXMnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgYXR0cmlidXRlcy4gQXR0cmlidXRlcyBzaG91bGQgYmUgYSBwbGFpbiBvYmplY3QsIG51bGwgb3Igb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgPT09ICdpbnZhbGlkLXVuZGlyZWN0ZWQnKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICAgJ0dyYXBoLmltcG9ydEVkZ2U6IGludmFsaWQgdW5kaXJlY3RlZC4gVW5kaXJlY3RlZCBzaG91bGQgYmUgYm9vbGVhbiBvciBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpbmcgdGhlIGVkZ2VcbiAgICBjb25zdCB7c291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMgPSB7fSwgdW5kaXJlY3RlZCA9IGZhbHNlfSA9IGRhdGE7XG5cbiAgICBsZXQgbWV0aG9kO1xuXG4gICAgaWYgKCdrZXknIGluIGRhdGEpIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlV2l0aEtleVxuICAgICAgICAgIDogdGhpcy5tZXJnZURpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB1bmRpcmVjdGVkXG4gICAgICAgID8gdGhpcy5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXlcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZVdpdGhLZXk7XG5cbiAgICAgIG1ldGhvZC5jYWxsKHRoaXMsIGRhdGEua2V5LCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZCA9IG1lcmdlXG4gICAgICAgID8gdW5kaXJlY3RlZFxuICAgICAgICAgID8gdGhpcy5tZXJnZVVuZGlyZWN0ZWRFZGdlXG4gICAgICAgICAgOiB0aGlzLm1lcmdlRGlyZWN0ZWRFZGdlXG4gICAgICAgIDogdW5kaXJlY3RlZFxuICAgICAgICA/IHRoaXMuYWRkVW5kaXJlY3RlZEVkZ2VcbiAgICAgICAgOiB0aGlzLmFkZERpcmVjdGVkRWRnZTtcblxuICAgICAgbWV0aG9kLmNhbGwodGhpcywgc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIHRvIGltcG9ydCBhIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdHxHcmFwaH0gZGF0YSAgLSBUaGUgc2VyaWFsaXplZCBncmFwaC5cbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICBtZXJnZSAtIFdoZXRoZXIgdG8gbWVyZ2UgZGF0YS5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgICAgICAtIFJldHVybnMgaXRzZWxmIGZvciBjaGFpbmluZy5cbiAgICovXG4gIGltcG9ydChkYXRhLCBtZXJnZSA9IGZhbHNlKSB7XG4gICAgLy8gSW1wb3J0aW5nIGEgR3JhcGggaW5zdGFuY2VcbiAgICBpZiAoaXNHcmFwaChkYXRhKSkge1xuICAgICAgdGhpcy5pbXBvcnQoZGF0YS5leHBvcnQoKSwgbWVyZ2UpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSW1wb3J0aW5nIGEgc2VyaWFsaXplZCBncmFwaFxuICAgIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ0dyYXBoLmltcG9ydDogaW52YWxpZCBhcmd1bWVudC4gRXhwZWN0aW5nIGEgc2VyaWFsaXplZCBncmFwaCBvciwgYWx0ZXJuYXRpdmVseSwgYSBHcmFwaCBpbnN0YW5jZS4nXG4gICAgICApO1xuXG4gICAgaWYgKGRhdGEuYXR0cmlidXRlcykge1xuICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEuYXR0cmlidXRlcykpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGF0dHJpYnV0ZXMuIEV4cGVjdGluZyBhIHBsYWluIG9iamVjdC4nXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChtZXJnZSkgdGhpcy5tZXJnZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKTtcbiAgICAgIGVsc2UgdGhpcy5yZXBsYWNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIGxldCBpLCBsLCBsaXN0O1xuXG4gICAgaWYgKGRhdGEubm9kZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLm5vZGVzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIG5vZGVzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0Tm9kZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZWRnZXMpIHtcbiAgICAgIGxpc3QgPSBkYXRhLmVkZ2VzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgICAnR3JhcGguaW1wb3J0OiBpbnZhbGlkIGVkZ2VzLiBFeHBlY3RpbmcgYW4gYXJyYXkuJ1xuICAgICAgICApO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHRoaXMuaW1wb3J0RWRnZShsaXN0W2ldLCBtZXJnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogVXRpbHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgcmV0dXJuaW5nIGEgbnVsbCBjb3B5IG9mIHRoZSBncmFwaCwgaS5lLiBhIGdyYXBoIHdpdGhvdXQgbm9kZXNcbiAgICogJiBlZGdlcyBidXQgd2l0aCB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHRvIG1lcmdlIHdpdGggdGhlIGN1cnJlbnQgb25lcy5cbiAgICogQHJldHVybiB7R3JhcGh9ICAgICAgICAgIC0gVGhlIG51bGwgY29weS5cbiAgICovXG4gIG51bGxDb3B5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBHcmFwaChhc3NpZ24oe30sIHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpKTtcbiAgICBncmFwaC5yZXBsYWNlQXR0cmlidXRlcyhhc3NpZ24oe30sIHRoaXMuZ2V0QXR0cmlidXRlcygpKSk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXR1cm5pbmcgYW4gZW1wdHkgY29weSBvZiB0aGUgZ3JhcGgsIGkuZS4gYSBncmFwaCB3aXRob3V0IGVkZ2VzIGJ1dFxuICAgKiB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSAge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbWVyZ2Ugd2l0aCB0aGUgY3VycmVudCBvbmVzLlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gICAgICAgICAgLSBUaGUgZW1wdHkgY29weS5cbiAgICovXG4gIGVtcHR5Q29weShvcHRpb25zKSB7XG4gICAgY29uc3QgZ3JhcGggPSB0aGlzLm51bGxDb3B5KG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fbm9kZXMuZm9yRWFjaCgobm9kZURhdGEsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGFzc2lnbih7fSwgbm9kZURhdGEuYXR0cmlidXRlcyk7XG5cbiAgICAgIC8vIE5PVEU6IG5vIG5lZWQgdG8gZW1pdCBldmVudHMgc2luY2UgdXNlciBjYW5ub3QgYWNjZXNzIHRoZSBpbnN0YW5jZSB5ZXRcbiAgICAgIG5vZGVEYXRhID0gbmV3IGdyYXBoLk5vZGVEYXRhQ2xhc3Moa2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIGdyYXBoLl9ub2Rlcy5zZXQoa2V5LCBub2RlRGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JhcGg7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBhbiBleGFjdCBjb3B5IG9mIHRoZSBncmFwaC5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICBjb3B5KCkge1xuICAgIGNvbnN0IGdyYXBoID0gdGhpcy5lbXB0eUNvcHkoKTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5fZWRnZXMudmFsdWVzKCk7XG5cbiAgICBsZXQgc3RlcCwgZWRnZURhdGE7XG5cbiAgICB3aGlsZSAoKChzdGVwID0gaXRlcmF0b3IubmV4dCgpKSwgc3RlcC5kb25lICE9PSB0cnVlKSkge1xuICAgICAgZWRnZURhdGEgPSBzdGVwLnZhbHVlO1xuXG4gICAgICAvLyBOT1RFOiBubyBuZWVkIHRvIGVtaXQgZXZlbnRzIHNpbmNlIHVzZXIgY2Fubm90IGFjY2VzcyB0aGUgaW5zdGFuY2UgeWV0XG4gICAgICBhZGRFZGdlKFxuICAgICAgICBncmFwaCxcbiAgICAgICAgJ2NvcHknLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgZWRnZURhdGEudW5kaXJlY3RlZCxcbiAgICAgICAgZWRnZURhdGEua2V5LFxuICAgICAgICBlZGdlRGF0YS5zb3VyY2Uua2V5LFxuICAgICAgICBlZGdlRGF0YS50YXJnZXQua2V5LFxuICAgICAgICBhc3NpZ24oe30sIGVkZ2VEYXRhLmF0dHJpYnV0ZXMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBncmFwaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdXBncmFkaW5nIHRoZSBncmFwaCB0byBhIG1peGVkIG9uZS5cbiAgICpcbiAgICogQHJldHVybiB7R3JhcGh9IC0gVGhlIGNvcHkuXG4gICAqL1xuICB1cGdyYWRlVG9NaXhlZCgpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnbWl4ZWQnKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFVwZ3JhZGluZyBub2RlIGRhdGE6XG4gICAgLy8gTk9URTogbWF5YmUgdGhpcyBjb3VsZCBsZWFkIHRvIHNvbWUgZGUtb3B0aW1pemF0aW9uIGJ5IHVzdWFsXG4gICAgLy8gSmF2YVNjcmlwdCBlbmdpbmVzIGJ1dCBJIGNhbm5vdCBiZSBzdXJlIG9mIGl0LiBBbm90aGVyIHNvbHV0aW9uXG4gICAgLy8gd291bGQgYmUgdG8gcmVpbnN0YW50aWF0ZSB0aGUgY2xhc3NlcyBidXQgdGhpcyBzdXJlbHkgaGFzIGEgcGVyZm9ybWFuY2VcbiAgICAvLyBhbmQgbWVtb3J5IGltcGFjdC5cbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKGRhdGEgPT4gZGF0YS51cGdyYWRlVG9NaXhlZCgpKTtcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy50eXBlID0gJ21peGVkJztcbiAgICByZWFkT25seVByb3BlcnR5KHRoaXMsICd0eXBlJywgdGhpcy5fb3B0aW9ucy50eXBlKTtcbiAgICBwcml2YXRlUHJvcGVydHkodGhpcywgJ05vZGVEYXRhQ2xhc3MnLCBNaXhlZE5vZGVEYXRhKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1cGdyYWRpbmcgdGhlIGdyYXBoIHRvIGEgbXVsdGkgb25lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtHcmFwaH0gLSBUaGUgY29weS5cbiAgICovXG4gIHVwZ3JhZGVUb011bHRpKCkge1xuICAgIGlmICh0aGlzLm11bHRpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIE11dGF0aW5nIHRoZSBvcHRpb25zICYgdGhlIGluc3RhbmNlXG4gICAgdGhpcy5fb3B0aW9ucy5tdWx0aSA9IHRydWU7XG4gICAgcmVhZE9ubHlQcm9wZXJ0eSh0aGlzLCAnbXVsdGknLCB0cnVlKTtcblxuICAgIC8vIFVwZ3JhZGluZyBpbmRpY2VzXG4gICAgdXBncmFkZVN0cnVjdHVyZUluZGV4VG9NdWx0aSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEtub3duIG1ldGhvZHNcbiAgICoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdXNlZCBieSBKYXZhU2NyaXB0IHRvIHBlcmZvcm0gSlNPTiBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IC0gVGhlIHNlcmlhbGl6ZWQgZ3JhcGguXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHJldHVybmluZyBbb2JqZWN0IEdyYXBoXS5cbiAgICovXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBHcmFwaF0nO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIGludGVybmFsbHkgYnkgbm9kZSdzIGNvbnNvbGUgdG8gZGlzcGxheSBhIGN1c3RvbSBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBGb3JtYXR0ZWQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFwaC5cbiAgICovXG4gIGluc3BlY3QoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB7fTtcbiAgICB0aGlzLl9ub2Rlcy5mb3JFYWNoKChkYXRhLCBrZXkpID0+IHtcbiAgICAgIG5vZGVzW2tleV0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBlZGdlcyA9IHt9LFxuICAgICAgbXVsdGlJbmRleCA9IHt9O1xuXG4gICAgdGhpcy5fZWRnZXMuZm9yRWFjaCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3Rpb24gPSBkYXRhLnVuZGlyZWN0ZWQgPyAnLS0nIDogJy0+JztcblxuICAgICAgbGV0IGxhYmVsID0gJyc7XG5cbiAgICAgIGxldCBzb3VyY2UgPSBkYXRhLnNvdXJjZS5rZXk7XG4gICAgICBsZXQgdGFyZ2V0ID0gZGF0YS50YXJnZXQua2V5O1xuICAgICAgbGV0IHRtcDtcblxuICAgICAgaWYgKGRhdGEudW5kaXJlY3RlZCAmJiBzb3VyY2UgPiB0YXJnZXQpIHtcbiAgICAgICAgdG1wID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSB0YXJnZXQ7XG4gICAgICAgIHRhcmdldCA9IHRtcDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzYyA9IGAoJHtzb3VyY2V9KSR7ZGlyZWN0aW9ufSgke3RhcmdldH0pYDtcblxuICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aCgnZ2VpZF8nKSkge1xuICAgICAgICBsYWJlbCArPSBgWyR7a2V5fV06IGA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubXVsdGkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtdWx0aUluZGV4W2Rlc2NdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHRpSW5kZXhbZGVzY10rKztcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsICs9IGAke211bHRpSW5kZXhbZGVzY119LiBgO1xuICAgICAgfVxuXG4gICAgICBsYWJlbCArPSBkZXNjO1xuXG4gICAgICBlZGdlc1tsYWJlbF0gPSBkYXRhLmF0dHJpYnV0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkdW1teSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIHRoaXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShrKSAmJlxuICAgICAgICAhRU1JVFRFUl9QUk9QUy5oYXMoaykgJiZcbiAgICAgICAgdHlwZW9mIHRoaXNba10gIT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGsgIT09ICdzeW1ib2wnXG4gICAgICApXG4gICAgICAgIGR1bW15W2tdID0gdGhpc1trXTtcbiAgICB9XG5cbiAgICBkdW1teS5hdHRyaWJ1dGVzID0gdGhpcy5fYXR0cmlidXRlcztcbiAgICBkdW1teS5ub2RlcyA9IG5vZGVzO1xuICAgIGR1bW15LmVkZ2VzID0gZWRnZXM7XG5cbiAgICBwcml2YXRlUHJvcGVydHkoZHVtbXksICdjb25zdHJ1Y3RvcicsIHRoaXMuY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIGR1bW15O1xuICB9XG59XG5cbi8qKlxuICogQXR0YWNoaW5nIG1ldGhvZHMgdG8gdGhlIHByb3RvdHlwZS5cbiAqXG4gKiBIZXJlLCB3ZSBhcmUgYXR0YWNoaW5nIGEgd2lkZSB2YXJpZXR5IG9mIG1ldGhvZHMgdG8gdGhlIEdyYXBoIGNsYXNzJ1xuICogcHJvdG90eXBlIHdoZW4gdGhvc2UgYXJlIHZlcnkgbnVtZXJvdXMgYW5kIHdoZW4gdGhlaXIgY3JlYXRpb24gaXNcbiAqIGFic3RyYWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBBdHRhY2hpbmcgY3VzdG9tIGluc3BlY3QgbWV0aG9kIGZvciBub2RlID49IDEwLlxuICovXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEdyYXBoLnByb3RvdHlwZVtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9XG4gICAgR3JhcGgucHJvdG90eXBlLmluc3BlY3Q7XG5cbi8qKlxuICogUmVsYXRlZCB0byBlZGdlIGFkZGl0aW9uLlxuICovXG5FREdFX0FERF9NRVRIT0RTLmZvckVhY2gobWV0aG9kID0+IHtcbiAgWydhZGQnLCAnbWVyZ2UnLCAndXBkYXRlJ10uZm9yRWFjaCh2ZXJiID0+IHtcbiAgICBjb25zdCBuYW1lID0gbWV0aG9kLm5hbWUodmVyYik7XG4gICAgY29uc3QgZm4gPSB2ZXJiID09PSAnYWRkJyA/IGFkZEVkZ2UgOiBtZXJnZUVkZ2U7XG5cbiAgICBpZiAobWV0aG9kLmdlbmVyYXRlS2V5KSB7XG4gICAgICBHcmFwaC5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIEdyYXBoLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIChlZGdlLCBzb3VyY2UsIHRhcmdldCwgYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gZm4oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIChtZXRob2QudHlwZSB8fCB0aGlzLnR5cGUpID09PSAndW5kaXJlY3RlZCcsXG4gICAgICAgICAgZWRnZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgdmVyYiA9PT0gJ3VwZGF0ZSdcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn0pO1xuXG4vKipcbiAqIEF0dHJpYnV0ZXMtcmVsYXRlZC5cbiAqL1xuYXR0YWNoTm9kZUF0dHJpYnV0ZXNNZXRob2RzKEdyYXBoKTtcbmF0dGFjaEVkZ2VBdHRyaWJ1dGVzTWV0aG9kcyhHcmFwaCk7XG5cbi8qKlxuICogRWRnZSBpdGVyYXRpb24tcmVsYXRlZC5cbiAqL1xuYXR0YWNoRWRnZUl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuXG4vKipcbiAqIE5laWdoYm9yIGl0ZXJhdGlvbi1yZWxhdGVkLlxuICovXG5hdHRhY2hOZWlnaGJvckl0ZXJhdGlvbk1ldGhvZHMoR3JhcGgpO1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBIZWxwZXIgQ2xhc3Nlc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBCdWlsZGluZyBzb21lIGhpZ2hlci1vcmRlciBjbGFzc2VzIGluc3RhbnRpYXRpbmcgdGhlIGdyYXBoIHdpdGhcbiAqIHByZWRlZmluaXRlIG9wdGlvbnMuXG4gKi9cbmltcG9ydCB7YXNzaWdufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBHcmFwaCBmcm9tICcuL2dyYXBoJztcblxuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IsXG4gIE5vdEZvdW5kR3JhcGhFcnJvcixcbiAgVXNhZ2VHcmFwaEVycm9yXG59IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb25zdHJ1Y3RvcnMuXG4gKi9cbmNsYXNzIERpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICdkaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgbXVsdGkgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgaWYgKGZpbmFsT3B0aW9ucy50eXBlICE9PSAnZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgVW5kaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAndW5kaXJlY3RlZCd9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IGZhbHNlKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnVW5kaXJlY3RlZEdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBtdWx0aSBpbiBnaXZlbiBvcHRpb25zISdcbiAgICAgICk7XG5cbiAgICBpZiAoZmluYWxPcHRpb25zLnR5cGUgIT09ICd1bmRpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ1VuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlHcmFwaCBleHRlbmRzIEdyYXBoIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGZpbmFsT3B0aW9ucyA9IGFzc2lnbih7bXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aUdyYXBoLmZyb206IGluY29uc2lzdGVudCBpbmRpY2F0aW9uIHRoYXQgdGhlIGdyYXBoIHNob3VsZCBiZSBzaW1wbGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlEaXJlY3RlZEdyYXBoIGV4dGVuZHMgR3JhcGgge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt0eXBlOiAnZGlyZWN0ZWQnLCBtdWx0aTogdHJ1ZX0sIG9wdGlvbnMpO1xuXG4gICAgaWYgKCdtdWx0aScgaW4gZmluYWxPcHRpb25zICYmIGZpbmFsT3B0aW9ucy5tdWx0aSAhPT0gdHJ1ZSlcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ2RpcmVjdGVkJylcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvcihcbiAgICAgICAgJ011bHRpRGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgXCInICtcbiAgICAgICAgICBmaW5hbE9wdGlvbnMudHlwZSArXG4gICAgICAgICAgJ1wiIHR5cGUgaW4gZ2l2ZW4gb3B0aW9ucyEnXG4gICAgICApO1xuXG4gICAgc3VwZXIoZmluYWxPcHRpb25zKTtcbiAgfVxufVxuY2xhc3MgTXVsdGlVbmRpcmVjdGVkR3JhcGggZXh0ZW5kcyBHcmFwaCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmaW5hbE9wdGlvbnMgPSBhc3NpZ24oe3R5cGU6ICd1bmRpcmVjdGVkJywgbXVsdGk6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIGlmICgnbXVsdGknIGluIGZpbmFsT3B0aW9ucyAmJiBmaW5hbE9wdGlvbnMubXVsdGkgIT09IHRydWUpXG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0dyYXBoRXJyb3IoXG4gICAgICAgICdNdWx0aVVuZGlyZWN0ZWRHcmFwaC5mcm9tOiBpbmNvbnNpc3RlbnQgaW5kaWNhdGlvbiB0aGF0IHRoZSBncmFwaCBzaG91bGQgYmUgc2ltcGxlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIGlmIChmaW5hbE9wdGlvbnMudHlwZSAhPT0gJ3VuZGlyZWN0ZWQnKVxuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yKFxuICAgICAgICAnTXVsdGlVbmRpcmVjdGVkR3JhcGguZnJvbTogaW5jb25zaXN0ZW50IFwiJyArXG4gICAgICAgICAgZmluYWxPcHRpb25zLnR5cGUgK1xuICAgICAgICAgICdcIiB0eXBlIGluIGdpdmVuIG9wdGlvbnMhJ1xuICAgICAgKTtcblxuICAgIHN1cGVyKGZpbmFsT3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2hpbmcgc3RhdGljICMuZnJvbSBtZXRob2QgdG8gZWFjaCBvZiB0aGUgY29uc3RydWN0b3JzLlxuICovXG5mdW5jdGlvbiBhdHRhY2hTdGF0aWNGcm9tTWV0aG9kKENsYXNzKSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBncmFwaCBmcm9tIHNlcmlhbGl6ZWQgZGF0YSBvciBhbm90aGVyIGdyYXBoJ3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtICB7R3JhcGh8U2VyaWFsaXplZEdyYXBofSBkYXRhICAgICAgLSBIeWRyYXRhdGlvbiBkYXRhLlxuICAgKiBAcGFyYW0gIHtvYmplY3R9ICAgICAgICAgICAgICAgIFtvcHRpb25zXSAtIE9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NsYXNzfVxuICAgKi9cbiAgQ2xhc3MuZnJvbSA9IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7XG4gICAgLy8gTWVyZ2luZyBnaXZlbiBvcHRpb25zIHdpdGggc2VyaWFsaXplZCBvbmVzXG4gICAgY29uc3QgZmluYWxPcHRpb25zID0gYXNzaWduKHt9LCBkYXRhLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ2xhc3MoZmluYWxPcHRpb25zKTtcbiAgICBpbnN0YW5jZS5pbXBvcnQoZGF0YSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5cbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoR3JhcGgpO1xuYXR0YWNoU3RhdGljRnJvbU1ldGhvZChEaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoVW5kaXJlY3RlZEdyYXBoKTtcbmF0dGFjaFN0YXRpY0Zyb21NZXRob2QoTXVsdGlHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpRGlyZWN0ZWRHcmFwaCk7XG5hdHRhY2hTdGF0aWNGcm9tTWV0aG9kKE11bHRpVW5kaXJlY3RlZEdyYXBoKTtcblxuR3JhcGguR3JhcGggPSBHcmFwaDtcbkdyYXBoLkRpcmVjdGVkR3JhcGggPSBEaXJlY3RlZEdyYXBoO1xuR3JhcGguVW5kaXJlY3RlZEdyYXBoID0gVW5kaXJlY3RlZEdyYXBoO1xuR3JhcGguTXVsdGlHcmFwaCA9IE11bHRpR3JhcGg7XG5HcmFwaC5NdWx0aURpcmVjdGVkR3JhcGggPSBNdWx0aURpcmVjdGVkR3JhcGg7XG5HcmFwaC5NdWx0aVVuZGlyZWN0ZWRHcmFwaCA9IE11bHRpVW5kaXJlY3RlZEdyYXBoO1xuXG5HcmFwaC5JbnZhbGlkQXJndW1lbnRzR3JhcGhFcnJvciA9IEludmFsaWRBcmd1bWVudHNHcmFwaEVycm9yO1xuR3JhcGguTm90Rm91bmRHcmFwaEVycm9yID0gTm90Rm91bmRHcmFwaEVycm9yO1xuR3JhcGguVXNhZ2VHcmFwaEVycm9yID0gVXNhZ2VHcmFwaEVycm9yO1xuXG5leHBvcnQge1xuICBHcmFwaCxcbiAgRGlyZWN0ZWRHcmFwaCxcbiAgVW5kaXJlY3RlZEdyYXBoLFxuICBNdWx0aUdyYXBoLFxuICBNdWx0aURpcmVjdGVkR3JhcGgsXG4gIE11bHRpVW5kaXJlY3RlZEdyYXBoXG59O1xuIiwgIi8qKlxuICogR3JhcGhvbG9neSBpc0dyYXBoXG4gKiA9PT09PT09PT09PT09PT09PT09XG4gKlxuICogVmVyeSBzaW1wbGUgZnVuY3Rpb24gYWltaW5nIGF0IGVuc3VyaW5nIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhXG4gKiBncmFwaG9sb2d5IGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQ2hlY2tpbmcgdGhlIHZhbHVlIGlzIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgICB2YWx1ZSAtIFRhcmdldCB2YWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNHcmFwaCh2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB2YWx1ZS5hZGRVbmRpcmVjdGVkRWRnZVdpdGhLZXkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUuZHJvcE5vZGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUubXVsdGkgPT09ICdib29sZWFuJ1xuICApO1xufTtcbiIsICJleHBvcnRzLkFSUkFZX0JVRkZFUl9TVVBQT1JUID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJztcbmV4cG9ydHMuU1lNQk9MX1NVUFBPUlQgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJztcbiIsICIvKipcbiAqIE9ibGl0ZXJhdG9yIEZvckVhY2ggRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZWFzaWx5IGl0ZXJhdGUgb3ZlciBtaXhlZCB2YWx1ZXMuXG4gKi9cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0LmpzJyk7XG5cbnZhciBBUlJBWV9CVUZGRVJfU1VQUE9SVCA9IHN1cHBvcnQuQVJSQVlfQlVGRkVSX1NVUFBPUlQ7XG52YXIgU1lNQk9MX1NVUFBPUlQgPSBzdXBwb3J0LlNZTUJPTF9TVVBQT1JUO1xuXG4vKipcbiAqIEZ1bmN0aW9uIGFibGUgdG8gaXRlcmF0ZSBvdmVyIGFsbW9zdCBhbnkgaXRlcmFibGUgSlMgdmFsdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICAgIGl0ZXJhYmxlIC0gSXRlcmFibGUgdmFsdWUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JFYWNoKGl0ZXJhYmxlLCBjYWxsYmFjaykge1xuICB2YXIgaXRlcmF0b3IsIGssIGksIGwsIHM7XG5cbiAgaWYgKCFpdGVyYWJsZSkgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBpbnZhbGlkIGl0ZXJhYmxlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmxpdGVyYXRvci9mb3JFYWNoOiBleHBlY3RpbmcgYSBjYWxsYmFjay4nKTtcblxuICAvLyBUaGUgdGFyZ2V0IGlzIGFuIGFycmF5IG9yIGEgc3RyaW5nIG9yIGZ1bmN0aW9uIGFyZ3VtZW50c1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShpdGVyYWJsZSkgfHxcbiAgICAoQVJSQVlfQlVGRkVSX1NVUFBPUlQgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGl0ZXJhYmxlKSkgfHxcbiAgICB0eXBlb2YgaXRlcmFibGUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXRlcmFibGUudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSdcbiAgKSB7XG4gICAgZm9yIChpID0gMCwgbCA9IGl0ZXJhYmxlLmxlbmd0aDsgaSA8IGw7IGkrKykgY2FsbGJhY2soaXRlcmFibGVbaV0sIGkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaGFzIGEgIy5mb3JFYWNoIG1ldGhvZFxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYWJsZS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgdGFyZ2V0IGlzIGl0ZXJhYmxlXG4gIGlmIChcbiAgICBTWU1CT0xfU1VQUE9SVCAmJlxuICAgIFN5bWJvbC5pdGVyYXRvciBpbiBpdGVyYWJsZSAmJlxuICAgIHR5cGVvZiBpdGVyYWJsZS5uZXh0ICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIGl0ZXJhYmxlID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBpcyBhbiBpdGVyYXRvclxuICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKCgocyA9IGl0ZXJhdG9yLm5leHQoKSksIHMuZG9uZSAhPT0gdHJ1ZSkpIHtcbiAgICAgIGNhbGxiYWNrKHMudmFsdWUsIGkpO1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSB0YXJnZXQgaXMgYSBwbGFpbiBvYmplY3RcbiAgZm9yIChrIGluIGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICBjYWxsYmFjayhpdGVyYWJsZVtrXSwgayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBUeXBlZCBBcnJheSBIZWxwZXJzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIGhlbHBlcnMgcmVsYXRlZCB0byB0eXBlZCBhcnJheXMuXG4gKi9cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGFuIHVuc2lnbmVkIGludGVnZXIgYXJyYXkgdG8gc3RvcmUgcG9pbnRlcnMsIG9uZSBtaWdodCB3YW50IHRvXG4gKiBjaG9vc2UgdGhlIG9wdGltYWwgd29yZCBzaXplIGluIHJlZ2FyZHMgdG8gdGhlIGFjdHVhbCBudW1iZXJzIG9mIHBvaW50ZXJzXG4gKiB0byBzdG9yZS5cbiAqXG4gKiBUaGlzIGhlbHBlcnMgZG9lcyBqdXN0IHRoYXQuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBzaXplIC0gRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkgdG8gbWFwLlxuICogQHJldHVybiB7VHlwZWRBcnJheX1cbiAqL1xudmFyIE1BWF84QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCA4KSAtIDEsXG4gICAgTUFYXzE2QklUX0lOVEVHRVIgPSBNYXRoLnBvdygyLCAxNikgLSAxLFxuICAgIE1BWF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzIpIC0gMTtcblxudmFyIE1BWF9TSUdORURfOEJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgNykgLSAxLFxuICAgIE1BWF9TSUdORURfMTZCSVRfSU5URUdFUiA9IE1hdGgucG93KDIsIDE1KSAtIDEsXG4gICAgTUFYX1NJR05FRF8zMkJJVF9JTlRFR0VSID0gTWF0aC5wb3coMiwgMzEpIC0gMTtcblxuZXhwb3J0cy5nZXRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfOEJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfMTZCSVRfSU5URUdFUilcbiAgICByZXR1cm4gVWludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF8zMkJJVF9JTlRFR0VSKVxuICAgIHJldHVybiBVaW50MzJBcnJheTtcblxuICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdDogUG9pbnRlciBBcnJheSBvZiBzaXplID4gNDI5NDk2NzI5NSBpcyBub3Qgc3VwcG9ydGVkLicpO1xufTtcblxuZXhwb3J0cy5nZXRTaWduZWRQb2ludGVyQXJyYXkgPSBmdW5jdGlvbihzaXplKSB7XG4gIHZhciBtYXhJbmRleCA9IHNpemUgLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzhCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50OEFycmF5O1xuXG4gIGlmIChtYXhJbmRleCA8PSBNQVhfU0lHTkVEXzE2QklUX0lOVEVHRVIpXG4gICAgcmV0dXJuIEludDE2QXJyYXk7XG5cbiAgaWYgKG1heEluZGV4IDw9IE1BWF9TSUdORURfMzJCSVRfSU5URUdFUilcbiAgICByZXR1cm4gSW50MzJBcnJheTtcblxuICByZXR1cm4gRmxvYXQ2NEFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiByZXR1cm5pbmcgdGhlIG1pbmltYWwgdHlwZSBhYmxlIHRvIHJlcHJlc2VudCB0aGUgZ2l2ZW4gbnVtYmVyLlxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG5leHBvcnRzLmdldE51bWJlclR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXG4gIC8vIDw9IDMyIGJpdHMgaXRudGVnZXI/XG4gIGlmICh2YWx1ZSA9PT0gKHZhbHVlIHwgMCkpIHtcblxuICAgIC8vIE5lZ2F0aXZlXG4gICAgaWYgKE1hdGguc2lnbih2YWx1ZSkgPT09IC0xKSB7XG4gICAgICBpZiAodmFsdWUgPD0gMTI3ICYmIHZhbHVlID49IC0xMjgpXG4gICAgICAgIHJldHVybiBJbnQ4QXJyYXk7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAzMjc2NyAmJiB2YWx1ZSA+PSAtMzI3NjgpXG4gICAgICAgIHJldHVybiBJbnQxNkFycmF5O1xuXG4gICAgICByZXR1cm4gSW50MzJBcnJheTtcbiAgICB9XG4gICAgZWxzZSB7XG5cbiAgICAgIGlmICh2YWx1ZSA8PSAyNTUpXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5O1xuXG4gICAgICBpZiAodmFsdWUgPD0gNjU1MzUpXG4gICAgICAgIHJldHVybiBVaW50MTZBcnJheTtcblxuICAgICAgcmV0dXJuIFVpbnQzMkFycmF5O1xuICAgIH1cbiAgfVxuXG4gIC8vIDUzIGJpdHMgaW50ZWdlciAmIGZsb2F0c1xuICAvLyBOT1RFOiBpdCdzIGtpbmRhIGhhcmQgdG8gdGVsbCB3aGV0aGVyIHdlIGNvdWxkIHVzZSAzMmJpdHMgb3Igbm90Li4uXG4gIHJldHVybiBGbG9hdDY0QXJyYXk7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB0aGUgbWluaW1hbCB0eXBlIGFibGUgdG8gcmVwcmVzZW50IHRoZSBnaXZlbiBhcnJheVxuICogb2YgSmF2YVNjcmlwdCBudW1iZXJzLlxuICpcbiAqIEBwYXJhbSAge2FycmF5fSAgICBhcnJheSAgLSBBcnJheSB0byByZXByZXNlbnQuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gZ2V0dGVyIC0gT3B0aW9uYWwgZ2V0dGVyLlxuICogQHJldHVybiB7VHlwZWRBcnJheUNsYXNzfVxuICovXG52YXIgVFlQRV9QUklPUklUWSA9IHtcbiAgVWludDhBcnJheTogMSxcbiAgSW50OEFycmF5OiAyLFxuICBVaW50MTZBcnJheTogMyxcbiAgSW50MTZBcnJheTogNCxcbiAgVWludDMyQXJyYXk6IDUsXG4gIEludDMyQXJyYXk6IDYsXG4gIEZsb2F0MzJBcnJheTogNyxcbiAgRmxvYXQ2NEFycmF5OiA4XG59O1xuXG4vLyBUT0RPOiBtYWtlIHRoaXMgYSBvbmUtc2hvdCBmb3Igb25lIHZhbHVlXG5leHBvcnRzLmdldE1pbmltYWxSZXByZXNlbnRhdGlvbiA9IGZ1bmN0aW9uKGFycmF5LCBnZXR0ZXIpIHtcbiAgdmFyIG1heFR5cGUgPSBudWxsLFxuICAgICAgbWF4UHJpb3JpdHkgPSAwLFxuICAgICAgcCxcbiAgICAgIHQsXG4gICAgICB2LFxuICAgICAgaSxcbiAgICAgIGw7XG5cbiAgZm9yIChpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHYgPSBnZXR0ZXIgPyBnZXR0ZXIoYXJyYXlbaV0pIDogYXJyYXlbaV07XG4gICAgdCA9IGV4cG9ydHMuZ2V0TnVtYmVyVHlwZSh2KTtcbiAgICBwID0gVFlQRV9QUklPUklUWVt0Lm5hbWVdO1xuXG4gICAgaWYgKHAgPiBtYXhQcmlvcml0eSkge1xuICAgICAgbWF4UHJpb3JpdHkgPSBwO1xuICAgICAgbWF4VHlwZSA9IHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1heFR5cGU7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHJldHVybmluZyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0cy5pc1R5cGVkQXJyYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbmNhdCBieXRlIGFycmF5cy5cbiAqXG4gKiBAcGFyYW0gIHsuLi5CeXRlQXJyYXl9XG4gKiBAcmV0dXJuIHtCeXRlQXJyYXl9XG4gKi9cbmV4cG9ydHMuY29uY2F0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsZW5ndGggPSAwLFxuICAgICAgaSxcbiAgICAgIG8sXG4gICAgICBsO1xuXG4gIGZvciAoaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKVxuICAgIGxlbmd0aCArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuXG4gIHZhciBhcnJheSA9IG5ldyAoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yKShsZW5ndGgpO1xuXG4gIGZvciAoaSA9IDAsIG8gPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJyYXkuc2V0KGFyZ3VtZW50c1tpXSwgbyk7XG4gICAgbyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgYSBieXRlIGFycmF5IG9mIGluZGljZXMuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSAgICBsZW5ndGggLSBMZW5ndGggb2YgdGFyZ2V0LlxuICogQHJldHVybiB7Qnl0ZUFycmF5fVxuICovXG5leHBvcnRzLmluZGljZXMgPSBmdW5jdGlvbihsZW5ndGgpIHtcbiAgdmFyIFBvaW50ZXJBcnJheSA9IGV4cG9ydHMuZ2V0UG9pbnRlckFycmF5KGxlbmd0aCk7XG5cbiAgdmFyIGFycmF5ID0gbmV3IFBvaW50ZXJBcnJheShsZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgYXJyYXlbaV0gPSBpO1xuXG4gIHJldHVybiBhcnJheTtcbn07XG4iLCAiLyoqXG4gKiBNbmVtb25pc3QgSXRlcmFibGUgRnVuY3Rpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBIYXJtb25pemVkIGl0ZXJhdGlvbiBoZWxwZXJzIG92ZXIgbWl4ZWQgaXRlcmFibGUgdGFyZ2V0cy5cbiAqL1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCdvYmxpdGVyYXRvci9mb3JlYWNoJyk7XG5cbnZhciB0eXBlZCA9IHJlcXVpcmUoJy4vdHlwZWQtYXJyYXlzLmpzJyk7XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IHN1cHBvcnRzIGFycmF5LWxpa2VcbiAqIHJhbmRvbSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodGFyZ2V0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgfHwgdHlwZWQuaXNUeXBlZEFycmF5KHRhcmdldCk7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gdXNlZCB0byBndWVzcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3R1cmUgb3ZlciB3aGljaCB3ZSBhcmUgZ29pbmdcbiAqIHRvIGl0ZXJhdGUuXG4gKlxuICogQHBhcmFtICB7YW55fSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7bnVtYmVyfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ3Vlc3NMZW5ndGgodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdGFyZ2V0Lmxlbmd0aCA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5sZW5ndGg7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQuc2l6ZSA9PT0gJ251bWJlcicpXG4gICAgcmV0dXJuIHRhcmdldC5zaXplO1xuXG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB1c2VkIHRvIGNvbnZlcnQgYW4gaXRlcmFibGUgdG8gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSh0YXJnZXQpIHtcbiAgdmFyIGwgPSBndWVzc0xlbmd0aCh0YXJnZXQpO1xuXG4gIHZhciBhcnJheSA9IHR5cGVvZiBsID09PSAnbnVtYmVyJyA/IG5ldyBBcnJheShsKSA6IFtdO1xuXG4gIHZhciBpID0gMDtcblxuICAvLyBUT0RPOiB3ZSBjb3VsZCBvcHRpbWl6ZSB3aGVuIGdpdmVuIHRhcmdldCBpcyBhcnJheSBsaWtlXG4gIGZvckVhY2godGFyZ2V0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGFycmF5W2krK10gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFNhbWUgYXMgYWJvdmUgYnV0IHJldHVybnMgYSBzdXBwbGVtZW50YXJ5IGluZGljZXMgYXJyYXkuXG4gKlxuICogQHBhcmFtICB7YW55fSAgIHRhcmdldCAtIEl0ZXJhdGlvbiB0YXJnZXQuXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheVdpdGhJbmRpY2VzKHRhcmdldCkge1xuICB2YXIgbCA9IGd1ZXNzTGVuZ3RoKHRhcmdldCk7XG5cbiAgdmFyIEluZGV4QXJyYXkgPSB0eXBlb2YgbCA9PT0gJ251bWJlcicgP1xuICAgIHR5cGVkLmdldFBvaW50ZXJBcnJheShsKSA6XG4gICAgQXJyYXk7XG5cbiAgdmFyIGFycmF5ID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEFycmF5KGwpIDogW107XG4gIHZhciBpbmRpY2VzID0gdHlwZW9mIGwgPT09ICdudW1iZXInID8gbmV3IEluZGV4QXJyYXkobCkgOiBbXTtcblxuICB2YXIgaSA9IDA7XG5cbiAgLy8gVE9ETzogd2UgY291bGQgb3B0aW1pemUgd2hlbiBnaXZlbiB0YXJnZXQgaXMgYXJyYXkgbGlrZVxuICBmb3JFYWNoKHRhcmdldCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBhcnJheVtpXSA9IHZhbHVlO1xuICAgIGluZGljZXNbaV0gPSBpKys7XG4gIH0pO1xuXG4gIHJldHVybiBbYXJyYXksIGluZGljZXNdO1xufVxuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xuZXhwb3J0cy5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlO1xuZXhwb3J0cy5ndWVzc0xlbmd0aCA9IGd1ZXNzTGVuZ3RoO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcbmV4cG9ydHMudG9BcnJheVdpdGhJbmRpY2VzID0gdG9BcnJheVdpdGhJbmRpY2VzO1xuIiwgIi8qKlxuICogT2JsaXRlcmF0b3IgSXRlcmF0b3IgQ2xhc3NcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIFNpbXBsZSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGxpYnJhcnkncyBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBJdGVyYXRvciBjbGFzcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHQgLSBOZXh0IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBJdGVyYXRvcihuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ibGl0ZXJhdG9yL2l0ZXJhdG9yOiBleHBlY3RpbmcgYSBmdW5jdGlvbiEnKTtcblxuICB0aGlzLm5leHQgPSBuZXh0O1xufVxuXG4vKipcbiAqIElmIHN5bWJvbHMgYXJlIHN1cHBvcnRlZCwgd2UgYWRkIGBuZXh0YCB0byBgU3ltYm9sLml0ZXJhdG9yYC5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb2YgdGhlIGdpdmVuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gIHthbnkuLi59IHZhbHVlcyAtIFZhbHVlcy5cbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5JdGVyYXRvci5vZiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgbCA9IGFyZ3MubGVuZ3RoLFxuICAgIGkgPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpID49IGwpIHJldHVybiB7ZG9uZTogdHJ1ZX07XG5cbiAgICByZXR1cm4ge2RvbmU6IGZhbHNlLCB2YWx1ZTogYXJnc1tpKytdfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvci5cbiAqXG4gKiBAcmV0dXJuIHtJdGVyYXRvcn1cbiAqL1xuSXRlcmF0b3IuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpdGVyYXRvciA9IG5ldyBJdGVyYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtkb25lOiB0cnVlfTtcbiAgfSk7XG5cbiAgcmV0dXJuIGl0ZXJhdG9yO1xufTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZ2l2ZW4gaW5kZXhlZCBzZXF1ZW5jZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8QXJyYXl9IHNlcXVlbmNlIC0gVGFyZ2V0IHNlcXVlbmNlLlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkl0ZXJhdG9yLmZyb21TZXF1ZW5jZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB2YXIgaSA9IDAsXG4gICAgbCA9IHNlcXVlbmNlLmxlbmd0aDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaSA+PSBsKSByZXR1cm4ge2RvbmU6IHRydWV9O1xuXG4gICAgcmV0dXJuIHtkb25lOiBmYWxzZSwgdmFsdWU6IHNlcXVlbmNlW2krK119O1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJuaW5nIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGl0ZXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge2FueX0gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkl0ZXJhdG9yLmlzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZXJhdG9yKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZS5uZXh0ID09PSAnZnVuY3Rpb24nXG4gICk7XG59O1xuXG4vKipcbiAqIEV4cG9ydGluZy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBJdGVyYXRvcjtcbiIsICIvKipcbiAqIE1uZW1vbmlzdCBGaXhlZERlcXVlXG4gKiA9PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBGaXhlZCBjYXBhY2l0eSBkb3VibGUtZW5kZWQgcXVldWUgaW1wbGVtZW50ZWQgYXMgcmluZyBkZXF1ZS5cbiAqL1xudmFyIGl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4vdXRpbHMvaXRlcmFibGVzLmpzJyksXG4gICAgSXRlcmF0b3IgPSByZXF1aXJlKCdvYmxpdGVyYXRvci9pdGVyYXRvcicpO1xuXG4vKipcbiAqIEZpeGVkRGVxdWUuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEZpeGVkRGVxdWUoQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdtbmVtb25pc3QvZml4ZWQtZGVxdWU6IGV4cGVjdGluZyBhbiBBcnJheSBjbGFzcyBhbmQgYSBjYXBhY2l0eS4nKTtcblxuICBpZiAodHlwZW9mIGNhcGFjaXR5ICE9PSAnbnVtYmVyJyB8fCBjYXBhY2l0eSA8PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlOiBgY2FwYWNpdHlgIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlci4nKTtcblxuICB0aGlzLkFycmF5Q2xhc3MgPSBBcnJheUNsYXNzO1xuICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gIHRoaXMuaXRlbXMgPSBuZXcgQXJyYXlDbGFzcyh0aGlzLmNhcGFjaXR5KTtcbiAgdGhpcy5jbGVhcigpO1xufVxuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGNsZWFyIHRoZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHJldHVybiB7dW5kZWZpbmVkfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIFByb3BlcnRpZXNcbiAgdGhpcy5zdGFydCA9IDA7XG4gIHRoaXMuc2l6ZSA9IDA7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGFwcGVuZCBhIHZhbHVlIHRvIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcGFyYW0gIHthbnl9ICAgIGl0ZW0gLSBJdGVtIHRvIGFwcGVuZC5cbiAqIEByZXR1cm4ge251bWJlcn0gICAgICAtIFJldHVybnMgdGhlIG5ldyBzaXplIG9mIHRoZSBkZXF1ZS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gdGhpcy5jYXBhY2l0eSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5wdXNoOiBkZXF1ZSBjYXBhY2l0eSAoJyArIHRoaXMuY2FwYWNpdHkgKyAnKSBleGNlZWRlZCEnKTtcblxuICB2YXIgaW5kZXggPSAodGhpcy5zdGFydCArIHRoaXMuc2l6ZSkgJSB0aGlzLmNhcGFjaXR5O1xuXG4gIHRoaXMuaXRlbXNbaW5kZXhdID0gaXRlbTtcblxuICByZXR1cm4gKyt0aGlzLnNpemU7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIHByZXBlbmQgYSB2YWx1ZSB0byB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7YW55fSAgICBpdGVtIC0gSXRlbSB0byBwcmVwZW5kLlxuICogQHJldHVybiB7bnVtYmVyfSAgICAgIC0gUmV0dXJucyB0aGUgbmV3IHNpemUgb2YgdGhlIGRlcXVlLlxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oaXRlbSkge1xuICBpZiAodGhpcy5zaXplID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRocm93IG5ldyBFcnJvcignbW5lbW9uaXN0L2ZpeGVkLWRlcXVlLnVuc2hpZnQ6IGRlcXVlIGNhcGFjaXR5ICgnICsgdGhpcy5jYXBhY2l0eSArICcpIGV4Y2VlZGVkIScpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgLSAxO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSAwKVxuICAgIGluZGV4ID0gdGhpcy5jYXBhY2l0eSAtIDE7XG5cbiAgdGhpcy5pdGVtc1tpbmRleF0gPSBpdGVtO1xuICB0aGlzLnN0YXJ0ID0gaW5kZXg7XG5cbiAgcmV0dXJuICsrdGhpcy5zaXplO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwb3AgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX0gLSBSZXR1cm5zIHRoZSBwb3BwZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IGluZGV4ID0gKHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxKSAlIHRoaXMuY2FwYWNpdHk7XG5cbiAgdGhpcy5zaXplLS07XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBzaGlmdCB0aGUgZGVxdWUuXG4gKlxuICogQHJldHVybiB7YW55fSAtIFJldHVybnMgdGhlIHNoaWZ0ZWQgaXRlbS5cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuc2l6ZSA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgdmFyIGluZGV4ID0gdGhpcy5zdGFydDtcblxuICB0aGlzLnNpemUtLTtcbiAgdGhpcy5zdGFydCsrO1xuXG4gIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmNhcGFjaXR5KVxuICAgIHRoaXMuc3RhcnQgPSAwO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW2luZGV4XTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHVzZWQgdG8gcGVlayB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGRlcXVlLlxuICpcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuRml4ZWREZXF1ZS5wcm90b3R5cGUucGVla0ZpcnN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiB0aGlzLml0ZW1zW3RoaXMuc3RhcnRdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBwZWVrIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBkZXF1ZS5cbiAqXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnBlZWtMYXN0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuc3RhcnQgKyB0aGlzLnNpemUgLSAxO1xuXG4gIGlmIChpbmRleCA+IHRoaXMuY2FwYWNpdHkpXG4gICAgaW5kZXggLT0gdGhpcy5jYXBhY2l0eTtcblxuICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF07XG59O1xuXG4vKipcbiAqIE1ldGhvZCB1c2VkIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZSBvZiB0aGUgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7YW55fVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICBpZiAodGhpcy5zaXplID09PSAwKVxuICAgIHJldHVybjtcblxuICBpbmRleCA9IHRoaXMuc3RhcnQgKyBpbmRleDtcblxuICBpZiAoaW5kZXggPiB0aGlzLmNhcGFjaXR5KVxuICAgIGluZGV4IC09IHRoaXMuY2FwYWNpdHk7XG5cbiAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGRlcXVlLlxuICpcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSAgY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGl0ZW0uXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgIHNjb3BlICAgIC0gT3B0aW9uYWwgc2NvcGUuXG4gKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgc2NvcGUpIHtcbiAgc2NvcGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNjb3BlIDogdGhpcztcblxuICB2YXIgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICB3aGlsZSAoaiA8IGwpIHtcbiAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCB0aGlzLml0ZW1zW2ldLCBqLCB0aGlzKTtcbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjb252ZXJ0IHRoZSBkZXF1ZSB0byBhIEphdmFTY3JpcHQgYXJyYXkuXG4gKlxuICogQHJldHVybiB7YXJyYXl9XG4gKi9cbi8vIFRPRE86IG9wdGlvbmFsIGFycmF5IGNsYXNzIGFzIGFyZ3VtZW50P1xuRml4ZWREZXF1ZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIE9wdGltaXphdGlvblxuICB2YXIgb2Zmc2V0ID0gdGhpcy5zdGFydCArIHRoaXMuc2l6ZTtcblxuICBpZiAob2Zmc2V0IDwgdGhpcy5jYXBhY2l0eSlcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zbGljZSh0aGlzLnN0YXJ0LCBvZmZzZXQpO1xuXG4gIHZhciBhcnJheSA9IG5ldyB0aGlzLkFycmF5Q2xhc3ModGhpcy5zaXplKSxcbiAgICAgIGMgPSB0aGlzLmNhcGFjaXR5LFxuICAgICAgbCA9IHRoaXMuc2l6ZSxcbiAgICAgIGkgPSB0aGlzLnN0YXJ0LFxuICAgICAgaiA9IDA7XG5cbiAgd2hpbGUgKGogPCBsKSB7XG4gICAgYXJyYXlbal0gPSB0aGlzLml0ZW1zW2ldO1xuICAgIGkrKztcbiAgICBqKys7XG5cbiAgICBpZiAoaSA9PT0gYylcbiAgICAgIGkgPSAwO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyB2YWx1ZXMuXG4gKlxuICogQHJldHVybiB7SXRlcmF0b3J9XG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zLFxuICAgICAgYyA9IHRoaXMuY2FwYWNpdHksXG4gICAgICBsID0gdGhpcy5zaXplLFxuICAgICAgaSA9IHRoaXMuc3RhcnQsXG4gICAgICBqID0gMDtcblxuICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkge1xuICAgIGlmIChqID49IGwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuXG4gICAgdmFyIHZhbHVlID0gaXRlbXNbaV07XG5cbiAgICBpKys7XG4gICAgaisrO1xuXG4gICAgaWYgKGkgPT09IGMpXG4gICAgICBpID0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdXNlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWUncyBlbnRyaWVzLlxuICpcbiAqIEByZXR1cm4ge0l0ZXJhdG9yfVxuICovXG5GaXhlZERlcXVlLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuaXRlbXMsXG4gICAgICBjID0gdGhpcy5jYXBhY2l0eSxcbiAgICAgIGwgPSB0aGlzLnNpemUsXG4gICAgICBpID0gdGhpcy5zdGFydCxcbiAgICAgIGogPSAwO1xuXG4gIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSB7XG4gICAgaWYgKGogPj0gbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG5cbiAgICB2YXIgdmFsdWUgPSBpdGVtc1tpXTtcblxuICAgIGkrKztcblxuICAgIGlmIChpID09PSBjKVxuICAgICAgaSA9IDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IFtqKyssIHZhbHVlXSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEF0dGFjaGluZyB0aGUgIy52YWx1ZXMgbWV0aG9kIHRvIFN5bWJvbC5pdGVyYXRvciBpZiBwb3NzaWJsZS5cbiAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKVxuICBGaXhlZERlcXVlLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gRml4ZWREZXF1ZS5wcm90b3R5cGUudmFsdWVzO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGtub3duIG1ldGhvZHMuXG4gKi9cbkZpeGVkRGVxdWUucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGFycmF5ID0gdGhpcy50b0FycmF5KCk7XG5cbiAgYXJyYXkudHlwZSA9IHRoaXMuQXJyYXlDbGFzcy5uYW1lO1xuICBhcnJheS5jYXBhY2l0eSA9IHRoaXMuY2FwYWNpdHk7XG5cbiAgLy8gVHJpY2sgc28gdGhhdCBub2RlIGRpc3BsYXlzIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksICdjb25zdHJ1Y3RvcicsIHtcbiAgICB2YWx1ZTogRml4ZWREZXF1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gYXJyYXk7XG59O1xuXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcpXG4gIEZpeGVkRGVxdWUucHJvdG90eXBlW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldID0gRml4ZWREZXF1ZS5wcm90b3R5cGUuaW5zcGVjdDtcblxuLyoqXG4gKiBTdGF0aWMgQC5mcm9tIGZ1bmN0aW9uIHRha2luZyBhbiBhcmJpdHJhcnkgaXRlcmFibGUgJiBjb252ZXJ0aW5nIGl0IGludG9cbiAqIGEgZGVxdWUuXG4gKlxuICogQHBhcmFtICB7SXRlcmFibGV9IGl0ZXJhYmxlICAgLSBUYXJnZXQgaXRlcmFibGUuXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gQXJyYXlDbGFzcyAtIEFycmF5IGNsYXNzIHRvIHVzZS5cbiAqIEBwYXJhbSAge251bWJlcn0gICBjYXBhY2l0eSAgIC0gRGVzaXJlZCBjYXBhY2l0eS5cbiAqIEByZXR1cm4ge0Zpbml0ZVN0YWNrfVxuICovXG5GaXhlZERlcXVlLmZyb20gPSBmdW5jdGlvbihpdGVyYWJsZSwgQXJyYXlDbGFzcywgY2FwYWNpdHkpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgY2FwYWNpdHkgPSBpdGVyYWJsZXMuZ3Vlc3NMZW5ndGgoaXRlcmFibGUpO1xuXG4gICAgaWYgKHR5cGVvZiBjYXBhY2l0eSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZS5mcm9tOiBjb3VsZCBub3QgZ3Vlc3MgaXRlcmFibGUgbGVuZ3RoLiBQbGVhc2UgcHJvdmlkZSBkZXNpcmVkIGNhcGFjaXR5IGFzIGxhc3QgYXJndW1lbnQuJyk7XG4gIH1cblxuICB2YXIgZGVxdWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheUNsYXNzLCBjYXBhY2l0eSk7XG5cbiAgaWYgKGl0ZXJhYmxlcy5pc0FycmF5TGlrZShpdGVyYWJsZSkpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGZvciAoaSA9IDAsIGwgPSBpdGVyYWJsZS5sZW5ndGg7IGkgPCBsOyBpKyspXG4gICAgICBkZXF1ZS5pdGVtc1tpXSA9IGl0ZXJhYmxlW2ldO1xuXG4gICAgZGVxdWUuc2l6ZSA9IGw7XG5cbiAgICByZXR1cm4gZGVxdWU7XG4gIH1cblxuICBpdGVyYWJsZXMuZm9yRWFjaChpdGVyYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBkZXF1ZS5wdXNoKHZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRlcXVlO1xufTtcblxuLyoqXG4gKiBFeHBvcnRpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gRml4ZWREZXF1ZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIFV0aWxzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqXG4gKiBNaXNjZWxsYW5lb3VzIHV0aWxzIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeS5cbiAqL1xuXG5mdW5jdGlvbiBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgZGVwdGgpIHtcbiAgdGhpcy5ub2RlID0gbm9kZTtcbiAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cjtcbiAgdGhpcy5kZXB0aCA9IGRlcHRoO1xufVxuXG5leHBvcnRzLlRyYXZlcnNhbFJlY29yZCA9IFRyYXZlcnNhbFJlY29yZDtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIEJGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEJyZWFkdGgtRmlyc3QgU2VhcmNoIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xudmFyIGlzR3JhcGggPSByZXF1aXJlKCdncmFwaG9sb2d5LXV0aWxzL2lzLWdyYXBoJyk7XG52YXIgRml4ZWREZXF1ZSA9IHJlcXVpcmUoJ21uZW1vbmlzdC9maXhlZC1kZXF1ZScpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2JmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvYmZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgcXVldWUgPSBuZXcgRml4ZWREZXF1ZShBcnJheSwgZ3JhcGgub3JkZXIpO1xuICB2YXIgcmVjb3JkLCBkZXB0aDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgZ3JhcGguZm9yRWFjaE5vZGUoZnVuY3Rpb24obm9kZSwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhub2RlKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5vZGUpO1xuICAgIHF1ZXVlLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBhdHRyLCAwKSk7XG5cbiAgICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGRlcHRoID0gcmVjb3JkLmRlcHRoO1xuXG4gICAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQkZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGgsIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIG5vZGUsIHVzaW5nIGFcbiAqIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtzdHJpbmd9ICAgbm9kZSAgICAgLSBTdGFydGluZyBub2RlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGJmc0Zyb21Ob2RlKGdyYXBoLCBub2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzR3JhcGgoZ3JhcGgpKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBleHBlY3RpbmcgYSBncmFwaG9sb2d5IGluc3RhbmNlLicpO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdncmFwaG9sb2d5LXRyYXZlcnNhbC9kZnM6IGdpdmVuIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLicpO1xuXG4gIC8vIEVhcmx5IHRlcm1pbmF0aW9uXG4gIGlmIChncmFwaC5vcmRlciA9PT0gMClcbiAgICByZXR1cm47XG5cbiAgbm9kZSA9ICcnICsgbm9kZTtcblxuICB2YXIgc2VlbiA9IG5ldyBTZXQoKTtcbiAgdmFyIHF1ZXVlID0gbmV3IEZpeGVkRGVxdWUoQXJyYXksIGdyYXBoLm9yZGVyKTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgcXVldWUucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIHNlZW4uYWRkKG5vZGUpO1xuICBxdWV1ZS5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgZ3JhcGguZ2V0Tm9kZUF0dHJpYnV0ZXMobm9kZSksIDApKTtcblxuICB3aGlsZSAocXVldWUuc2l6ZSAhPT0gMCkge1xuICAgIHJlY29yZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgZGVwdGggPSByZWNvcmQuZGVwdGg7XG5cbiAgICBjYWxsYmFjayhyZWNvcmQubm9kZSwgcmVjb3JkLmF0dHJpYnV0ZXMsIGRlcHRoKTtcblxuICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnRzLmJmcyA9IGJmcztcbmV4cG9ydHMuYmZzRnJvbU5vZGUgPSBiZnNGcm9tTm9kZTtcbiIsICIvKipcbiAqIEdyYXBob2xvZ3kgVHJhdmVyc2FsIERGU1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIERlcHRoLUZpcnN0IFNlYXJjaCB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cbnZhciBpc0dyYXBoID0gcmVxdWlyZSgnZ3JhcGhvbG9neS11dGlscy9pcy1ncmFwaCcpO1xudmFyIFRyYXZlcnNhbFJlY29yZCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5UcmF2ZXJzYWxSZWNvcmQ7XG5cbi8qKlxuICogREZTIHRyYXZlcnNhbCBpbiB0aGUgZ2l2ZW4gZ3JhcGggdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7R3JhcGh9ICAgIGdyYXBoICAgIC0gVGFyZ2V0IGdyYXBoLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBJdGVyYXRpb24gY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIGRmcyhncmFwaCwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIHZhciBzZWVuID0gbmV3IFNldCgpO1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGRlcHRoLCByZWNvcmQ7XG5cbiAgZnVuY3Rpb24gbmVpZ2hib3JDYWxsYmFjayhuZWlnaGJvciwgYXR0cikge1xuICAgIGlmIChzZWVuLmhhcyhuZWlnaGJvcikpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChuZWlnaGJvcik7XG4gICAgc3RhY2sucHVzaChuZXcgVHJhdmVyc2FsUmVjb3JkKG5laWdoYm9yLCBhdHRyLCBkZXB0aCArIDEpKTtcbiAgfVxuXG4gIGdyYXBoLmZvckVhY2hOb2RlKGZ1bmN0aW9uKG5vZGUsIGF0dHIpIHtcbiAgICBpZiAoc2Vlbi5oYXMobm9kZSkpXG4gICAgICByZXR1cm47XG5cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobm9kZSwgYXR0ciwgMCkpO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVjb3JkID0gc3RhY2sucG9wKCk7XG4gICAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgICAgY2FsbGJhY2socmVjb3JkLm5vZGUsIHJlY29yZC5hdHRyaWJ1dGVzLCBkZXB0aCk7XG5cbiAgICAgIGdyYXBoLmZvckVhY2hPdXRib3VuZE5laWdoYm9yKHJlY29yZC5ub2RlLCBuZWlnaGJvckNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIERGUyB0cmF2ZXJzYWwgaW4gdGhlIGdpdmVuIGdyYXBoLCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlLCB1c2luZyBhXG4gKiBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0dyYXBofSAgICBncmFwaCAgICAtIFRhcmdldCBncmFwaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSAgIG5vZGUgICAgIC0gU3RhcnRpbmcgbm9kZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gSXRlcmF0aW9uIGNhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBkZnNGcm9tTm9kZShncmFwaCwgbm9kZSwgY2FsbGJhY2spIHtcbiAgaWYgKCFpc0dyYXBoKGdyYXBoKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyYXBob2xvZ3ktdHJhdmVyc2FsL2RmczogZXhwZWN0aW5nIGEgZ3JhcGhvbG9neSBpbnN0YW5jZS4nKTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBFcnJvcignZ3JhcGhvbG9neS10cmF2ZXJzYWwvZGZzOiBnaXZlbiBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi4nKTtcblxuICAvLyBFYXJseSB0ZXJtaW5hdGlvblxuICBpZiAoZ3JhcGgub3JkZXIgPT09IDApXG4gICAgcmV0dXJuO1xuXG4gIG5vZGUgPSAnJyArIG5vZGU7XG5cbiAgdmFyIHNlZW4gPSBuZXcgU2V0KCk7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgZGVwdGgsIHJlY29yZDtcblxuICBmdW5jdGlvbiBuZWlnaGJvckNhbGxiYWNrKG5laWdoYm9yLCBhdHRyKSB7XG4gICAgaWYgKHNlZW4uaGFzKG5laWdoYm9yKSlcbiAgICAgIHJldHVybjtcblxuICAgIHNlZW4uYWRkKG5laWdoYm9yKTtcbiAgICBzdGFjay5wdXNoKG5ldyBUcmF2ZXJzYWxSZWNvcmQobmVpZ2hib3IsIGF0dHIsIGRlcHRoICsgMSkpO1xuICB9XG5cbiAgc2Vlbi5hZGQobm9kZSk7XG4gIHN0YWNrLnB1c2gobmV3IFRyYXZlcnNhbFJlY29yZChub2RlLCBncmFwaC5nZXROb2RlQXR0cmlidXRlcyhub2RlKSwgMCkpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggIT09IDApIHtcbiAgICByZWNvcmQgPSBzdGFjay5wb3AoKTtcbiAgICBkZXB0aCA9IHJlY29yZC5kZXB0aDtcblxuICAgIGNhbGxiYWNrKHJlY29yZC5ub2RlLCByZWNvcmQuYXR0cmlidXRlcywgZGVwdGgpO1xuXG4gICAgZ3JhcGguZm9yRWFjaE91dGJvdW5kTmVpZ2hib3IocmVjb3JkLm5vZGUsIG5laWdoYm9yQ2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydHMuZGZzID0gZGZzO1xuZXhwb3J0cy5kZnNGcm9tTm9kZSA9IGRmc0Zyb21Ob2RlO1xuIiwgInZhciBiZnNNb2R1bGUgPSByZXF1aXJlKCcuL2Jmcy5qcycpO1xudmFyIGRmc01vZHVsZSA9IHJlcXVpcmUoJy4vZGZzLmpzJyk7XG5cbnZhciBrO1xuXG5mb3IgKGsgaW4gYmZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gYmZzTW9kdWxlW2tdO1xuXG5mb3IgKGsgaW4gZGZzTW9kdWxlKVxuICBleHBvcnRzW2tdID0gZGZzTW9kdWxlW2tdO1xuIiwgIi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTHV4b25FcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWREYXRlVGltZUVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHJlYXNvbikge1xuICAgIHN1cGVyKGBJbnZhbGlkIERhdGVUaW1lOiAke3JlYXNvbi50b01lc3NhZ2UoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSW50ZXJ2YWxFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFzb24pIHtcbiAgICBzdXBlcihgSW52YWxpZCBJbnRlcnZhbDogJHtyZWFzb24udG9NZXNzYWdlKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZER1cmF0aW9uRXJyb3IgZXh0ZW5kcyBMdXhvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocmVhc29uKSB7XG4gICAgc3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7cmVhc29uLnRvTWVzc2FnZSgpfWApO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7fVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVW5pdEVycm9yIGV4dGVuZHMgTHV4b25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHVuaXQpIHtcbiAgICBzdXBlcihgSW52YWxpZCB1bml0ICR7dW5pdH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige31cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgWm9uZUlzQWJzdHJhY3RFcnJvciBleHRlbmRzIEx1eG9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIik7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY29uc3QgbiA9IFwibnVtZXJpY1wiLFxuICBzID0gXCJzaG9ydFwiLFxuICBsID0gXCJsb25nXCI7XG5cbmV4cG9ydCBjb25zdCBEQVRFX1NIT1JUID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbixcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogcyxcbiAgZGF5OiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgd2Vla2RheTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX1NFQ09ORFMgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgdGltZVpvbmVOYW1lOiBsLFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfMjRfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0VDT05EUyA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIGhvdXJDeWNsZTogXCJoMjNcIixcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IHMsXG59O1xuXG5leHBvcnQgY29uc3QgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHNlY29uZDogbixcbiAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICB0aW1lWm9uZU5hbWU6IGwsXG59O1xuXG5leHBvcnQgY29uc3QgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbiAgc2Vjb25kOiBuLFxufTtcblxuZXhwb3J0IGNvbnN0IERBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IHMsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogbixcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogcyxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG5cbmV4cG9ydCBjb25zdCBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IGwsXG4gIGRheTogbixcbiAgd2Vla2RheTogbCxcbiAgaG91cjogbixcbiAgbWludXRlOiBuLFxuICBzZWNvbmQ6IG4sXG4gIHRpbWVab25lTmFtZTogbCxcbn07XG4iLCAiLypcbiAgVGhpcyBpcyBqdXN0IGEganVuayBkcmF3ZXIsIGNvbnRhaW5pbmcgYW55dGhpbmcgdXNlZCBhY3Jvc3MgbXVsdGlwbGUgY2xhc3Nlcy5cbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcbiAgaXQgdXAgaW50bywgc2F5LCBwYXJzaW5nVXRpbC5qcyBhbmQgYmFzaWNVdGlsLmpzIGFuZCBzbyBvbi4gQnV0IHRoZXkgYXJlIGRpdmlkZWQgdXAgYnkgZmVhdHVyZSBhcmVhLlxuKi9cblxuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG4vLyBUWVBFU1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcihvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIiAmJiBvICUgMSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG59XG5cbi8vIENBUEFCSUxJVElFU1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVsYXRpdmUoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnRsICE9PSBcInVuZGVmaW5lZFwiICYmICEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUFycmF5KHRoaW5nKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaW5nKSA/IHRoaW5nIDogW3RoaW5nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJlc3RCeShhcnIsIGJ5LCBjb21wYXJlKSB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXJyLnJlZHVjZSgoYmVzdCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHBhaXIgPSBbYnkobmV4dCksIG5leHRdO1xuICAgIGlmICghYmVzdCkge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfSBlbHNlIGlmIChjb21wYXJlKGJlc3RbMF0sIHBhaXJbMF0pID09PSBiZXN0WzBdKSB7XG4gICAgICByZXR1cm4gYmVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhaXI7XG4gICAgfVxuICB9LCBudWxsKVsxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpY2sob2JqLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgoYSwgaykgPT4ge1xuICAgIGFba10gPSBvYmpba107XG4gICAgcmV0dXJuIGE7XG4gIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbi8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZXhwb3J0IGZ1bmN0aW9uIGludGVnZXJCZXR3ZWVuKHRoaW5nLCBib3R0b20sIHRvcCkge1xuICByZXR1cm4gaXNJbnRlZ2VyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufVxuXG4vLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcbmV4cG9ydCBmdW5jdGlvbiBmbG9vck1vZCh4LCBuKSB7XG4gIHJldHVybiB4IC0gbiAqIE1hdGguZmxvb3IoeCAvIG4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkU3RhcnQoaW5wdXQsIG4gPSAyKSB7XG4gIGNvbnN0IGlzTmVnID0gaW5wdXQgPCAwO1xuICBsZXQgcGFkZGVkO1xuICBpZiAoaXNOZWcpIHtcbiAgICBwYWRkZWQgPSBcIi1cIiArIChcIlwiICsgLWlucHV0KS5wYWRTdGFydChuLCBcIjBcIik7XG4gIH0gZWxzZSB7XG4gICAgcGFkZGVkID0gKFwiXCIgKyBpbnB1dCkucGFkU3RhcnQobiwgXCIwXCIpO1xuICB9XG4gIHJldHVybiBwYWRkZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVnZXIoc3RyaW5nKSB7XG4gIGlmIChpc1VuZGVmaW5lZChzdHJpbmcpIHx8IHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmcsIDEwKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGbG9hdGluZyhzdHJpbmcpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHN0cmluZykgfHwgc3RyaW5nID09PSBudWxsIHx8IHN0cmluZyA9PT0gXCJcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyaW5nKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNaWxsaXMoZnJhY3Rpb24pIHtcbiAgLy8gUmV0dXJuIHVuZGVmaW5lZCAoaW5zdGVhZCBvZiAwKSBpbiB0aGVzZSBjYXNlcywgd2hlcmUgZnJhY3Rpb24gaXMgbm90IHNldFxuICBpZiAoaXNVbmRlZmluZWQoZnJhY3Rpb24pIHx8IGZyYWN0aW9uID09PSBudWxsIHx8IGZyYWN0aW9uID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzLCB0b3dhcmRaZXJvID0gZmFsc2UpIHtcbiAgY29uc3QgZmFjdG9yID0gMTAgKiogZGlnaXRzLFxuICAgIHJvdW5kZXIgPSB0b3dhcmRaZXJvID8gTWF0aC50cnVuYyA6IE1hdGgucm91bmQ7XG4gIHJldHVybiByb3VuZGVyKG51bWJlciAqIGZhY3RvcikgLyBmYWN0b3I7XG59XG5cbi8vIERBVEUgQkFTSUNTXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0ID09PSAwICYmICh5ZWFyICUgMTAwICE9PSAwIHx8IHllYXIgJSA0MDAgPT09IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgY29uc3QgbW9kTW9udGggPSBmbG9vck1vZChtb250aCAtIDEsIDEyKSArIDEsXG4gICAgbW9kWWVhciA9IHllYXIgKyAobW9udGggLSBtb2RNb250aCkgLyAxMjtcblxuICBpZiAobW9kTW9udGggPT09IDIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihtb2RZZWFyKSA/IDI5IDogMjg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFszMSwgbnVsbCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vZE1vbnRoIC0gMV07XG4gIH1cbn1cblxuLy8gY292ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgbG9jYWwgdGltZXN0YW1wIChlcG9jaCwgYnV0IHdpdGggdGhlIG9mZnNldCBiYWtlZCBpbilcbmV4cG9ydCBmdW5jdGlvbiBvYmpUb0xvY2FsVFMob2JqKSB7XG4gIGxldCBkID0gRGF0ZS5VVEMoXG4gICAgb2JqLnllYXIsXG4gICAgb2JqLm1vbnRoIC0gMSxcbiAgICBvYmouZGF5LFxuICAgIG9iai5ob3VyLFxuICAgIG9iai5taW51dGUsXG4gICAgb2JqLnNlY29uZCxcbiAgICBvYmoubWlsbGlzZWNvbmRcbiAgKTtcblxuICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMsIHllYXJzIGJldHdlZW4gMCBhbmQgOTkgYXJlIGludGVycHJldGVkIGFzIDE5WFg7IHJldmVydCB0aGF0XG4gIGlmIChvYmoueWVhciA8IDEwMCAmJiBvYmoueWVhciA+PSAwKSB7XG4gICAgZCA9IG5ldyBEYXRlKGQpO1xuICAgIGQuc2V0VVRDRnVsbFllYXIoZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCk7XG4gIH1cbiAgcmV0dXJuICtkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vla3NJbldlZWtZZWFyKHdlZWtZZWFyKSB7XG4gIGNvbnN0IHAxID1cbiAgICAgICh3ZWVrWWVhciArXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyA0KSAtXG4gICAgICAgIE1hdGguZmxvb3Iod2Vla1llYXIgLyAxMDApICtcbiAgICAgICAgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQwMCkpICVcbiAgICAgIDcsXG4gICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICBwMiA9IChsYXN0ICsgTWF0aC5mbG9vcihsYXN0IC8gNCkgLSBNYXRoLmZsb29yKGxhc3QgLyAxMDApICsgTWF0aC5mbG9vcihsYXN0IC8gNDAwKSkgJSA3O1xuICByZXR1cm4gcDEgPT09IDQgfHwgcDIgPT09IDMgPyA1MyA6IDUyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhcikge1xuICBpZiAoeWVhciA+IDk5KSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSByZXR1cm4geWVhciA+IDYwID8gMTkwMCArIHllYXIgOiAyMDAwICsgeWVhcjtcbn1cblxuLy8gUEFSU0lOR1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2Vab25lSW5mbyh0cywgb2Zmc2V0Rm9ybWF0LCBsb2NhbGUsIHRpbWVab25lID0gbnVsbCkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgIGludGxPcHRzID0ge1xuICAgICAgaG91ckN5Y2xlOiBcImgyM1wiLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVkID0geyB0aW1lWm9uZU5hbWU6IG9mZnNldEZvcm1hdCwgLi4uaW50bE9wdHMgfTtcblxuICBjb25zdCBwYXJzZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKVxuICAgIC5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHBhcnNlZC52YWx1ZSA6IG51bGw7XG59XG5cbi8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkT2Zmc2V0KG9mZkhvdXJTdHIsIG9mZk1pbnV0ZVN0cikge1xuICBsZXQgb2ZmSG91ciA9IHBhcnNlSW50KG9mZkhvdXJTdHIsIDEwKTtcblxuICAvLyBkb24ndCB8fCB0aGlzIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSAtMFxuICBpZiAoTnVtYmVyLmlzTmFOKG9mZkhvdXIpKSB7XG4gICAgb2ZmSG91ciA9IDA7XG4gIH1cblxuICBjb25zdCBvZmZNaW4gPSBwYXJzZUludChvZmZNaW51dGVTdHIsIDEwKSB8fCAwLFxuICAgIG9mZk1pblNpZ25lZCA9IG9mZkhvdXIgPCAwIHx8IE9iamVjdC5pcyhvZmZIb3VyLCAtMCkgPyAtb2ZmTWluIDogb2ZmTWluO1xuICByZXR1cm4gb2ZmSG91ciAqIDYwICsgb2ZmTWluU2lnbmVkO1xufVxuXG4vLyBDT0VSQ0lPTlxuXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWUpIHtcbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT09IFwiXCIgfHwgTnVtYmVyLmlzTmFOKG51bWVyaWNWYWx1ZSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBJbnZhbGlkIHVuaXQgdmFsdWUgJHt2YWx1ZX1gKTtcbiAgcmV0dXJuIG51bWVyaWNWYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9O1xuICBmb3IgKGNvbnN0IHUgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG9iaiwgdSkpIHtcbiAgICAgIGNvbnN0IHYgPSBvYmpbdV07XG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVyKHUpXSA9IGFzTnVtYmVyKHYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9mZnNldChvZmZzZXQsIGZvcm1hdCkge1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoTWF0aC5hYnMob2Zmc2V0IC8gNjApKSxcbiAgICBtaW51dGVzID0gTWF0aC50cnVuYyhNYXRoLmFicyhvZmZzZXQgJSA2MCkpLFxuICAgIHNpZ24gPSBvZmZzZXQgPj0gMCA/IFwiK1wiIDogXCItXCI7XG5cbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBgJHtzaWdufSR7cGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgY2FzZSBcIm5hcnJvd1wiOlxuICAgICAgcmV0dXJuIGAke3NpZ259JHtob3Vyc30ke21pbnV0ZXMgPiAwID8gYDoke21pbnV0ZXN9YCA6IFwiXCJ9YDtcbiAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICByZXR1cm4gYCR7c2lnbn0ke3BhZFN0YXJ0KGhvdXJzLCAyKX0ke3BhZFN0YXJ0KG1pbnV0ZXMsIDIpfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtmb3JtYXR9IGlzIG91dCBvZiByYW5nZSBmb3IgcHJvcGVydHkgZm9ybWF0YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlhbmFSZWdleCA9IC9bQS1aYS16XystXXsxLDI1Nn0oOj9cXC9bQS1aYS16MC05XystXXsxLDI1Nn0oXFwvW0EtWmEtejAtOV8rLV17MSwyNTZ9KT8pPy87XG4iLCAiaW1wb3J0ICogYXMgRm9ybWF0cyBmcm9tIFwiLi9mb3JtYXRzLmpzXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjb25zdCBtb250aHNMb25nID0gW1xuICBcIkphbnVhcnlcIixcbiAgXCJGZWJydWFyeVwiLFxuICBcIk1hcmNoXCIsXG4gIFwiQXByaWxcIixcbiAgXCJNYXlcIixcbiAgXCJKdW5lXCIsXG4gIFwiSnVseVwiLFxuICBcIkF1Z3VzdFwiLFxuICBcIlNlcHRlbWJlclwiLFxuICBcIk9jdG9iZXJcIixcbiAgXCJOb3ZlbWJlclwiLFxuICBcIkRlY2VtYmVyXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzU2hvcnQgPSBbXG4gIFwiSmFuXCIsXG4gIFwiRmViXCIsXG4gIFwiTWFyXCIsXG4gIFwiQXByXCIsXG4gIFwiTWF5XCIsXG4gIFwiSnVuXCIsXG4gIFwiSnVsXCIsXG4gIFwiQXVnXCIsXG4gIFwiU2VwXCIsXG4gIFwiT2N0XCIsXG4gIFwiTm92XCIsXG4gIFwiRGVjXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgbW9udGhzTmFycm93ID0gW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9udGhzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzTmFycm93XTtcbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiBbLi4ubW9udGhzU2hvcnRdO1xuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gWy4uLm1vbnRoc0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNMb25nID0gW1xuICBcIk1vbmRheVwiLFxuICBcIlR1ZXNkYXlcIixcbiAgXCJXZWRuZXNkYXlcIixcbiAgXCJUaHVyc2RheVwiLFxuICBcIkZyaWRheVwiLFxuICBcIlNhdHVyZGF5XCIsXG4gIFwiU3VuZGF5XCIsXG5dO1xuXG5leHBvcnQgY29uc3Qgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcblxuZXhwb3J0IGNvbnN0IHdlZWtkYXlzTmFycm93ID0gW1wiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCIsIFwiU1wiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4ud2Vla2RheXNOYXJyb3ddO1xuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c1Nob3J0XTtcbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIFsuLi53ZWVrZGF5c0xvbmddO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1lcmlkaWVtcyA9IFtcIkFNXCIsIFwiUE1cIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTG9uZyA9IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXTtcblxuZXhwb3J0IGNvbnN0IGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG5cbmV4cG9ydCBjb25zdCBlcmFzTmFycm93ID0gW1wiQlwiLCBcIkFcIl07XG5cbmV4cG9ydCBmdW5jdGlvbiBlcmFzKGxlbmd0aCkge1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc05hcnJvd107XG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gWy4uLmVyYXNTaG9ydF07XG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiBbLi4uZXJhc0xvbmddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyaWRpZW1Gb3JEYXRlVGltZShkdCkge1xuICByZXR1cm4gbWVyaWRpZW1zW2R0LmhvdXIgPCAxMiA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiB3ZWVrZGF5cyhsZW5ndGgpW2R0LndlZWtkYXkgLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gbW9udGhzKGxlbmd0aClbZHQubW9udGggLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGVyYXMobGVuZ3RoKVtkdC55ZWFyIDwgMCA/IDAgOiAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlVGltZSh1bml0LCBjb3VudCwgbnVtZXJpYyA9IFwiYWx3YXlzXCIsIG5hcnJvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzID0ge1xuICAgIHllYXJzOiBbXCJ5ZWFyXCIsIFwieXIuXCJdLFxuICAgIHF1YXJ0ZXJzOiBbXCJxdWFydGVyXCIsIFwicXRyLlwiXSxcbiAgICBtb250aHM6IFtcIm1vbnRoXCIsIFwibW8uXCJdLFxuICAgIHdlZWtzOiBbXCJ3ZWVrXCIsIFwid2suXCJdLFxuICAgIGRheXM6IFtcImRheVwiLCBcImRheVwiLCBcImRheXNcIl0sXG4gICAgaG91cnM6IFtcImhvdXJcIiwgXCJoci5cIl0sXG4gICAgbWludXRlczogW1wibWludXRlXCIsIFwibWluLlwiXSxcbiAgICBzZWNvbmRzOiBbXCJzZWNvbmRcIiwgXCJzZWMuXCJdLFxuICB9O1xuXG4gIGNvbnN0IGxhc3RhYmxlID0gW1wiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXS5pbmRleE9mKHVuaXQpID09PSAtMTtcblxuICBpZiAobnVtZXJpYyA9PT0gXCJhdXRvXCIgJiYgbGFzdGFibGUpIHtcbiAgICBjb25zdCBpc0RheSA9IHVuaXQgPT09IFwiZGF5c1wiO1xuICAgIHN3aXRjaCAoY291bnQpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b21vcnJvd1wiIDogYG5leHQgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgY2FzZSAtMTpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ5ZXN0ZXJkYXlcIiA6IGBsYXN0ICR7dW5pdHNbdW5pdF1bMF19YDtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGlzRGF5ID8gXCJ0b2RheVwiIDogYHRoaXMgJHt1bml0c1t1bml0XVswXX1gO1xuICAgICAgZGVmYXVsdDogLy8gZmFsbCB0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNJblBhc3QgPSBPYmplY3QuaXMoY291bnQsIC0wKSB8fCBjb3VudCA8IDAsXG4gICAgZm10VmFsdWUgPSBNYXRoLmFicyhjb3VudCksXG4gICAgc2luZ3VsYXIgPSBmbXRWYWx1ZSA9PT0gMSxcbiAgICBsaWxVbml0cyA9IHVuaXRzW3VuaXRdLFxuICAgIGZtdFVuaXQgPSBuYXJyb3dcbiAgICAgID8gc2luZ3VsYXJcbiAgICAgICAgPyBsaWxVbml0c1sxXVxuICAgICAgICA6IGxpbFVuaXRzWzJdIHx8IGxpbFVuaXRzWzFdXG4gICAgICA6IHNpbmd1bGFyXG4gICAgICA/IHVuaXRzW3VuaXRdWzBdXG4gICAgICA6IHVuaXQ7XG4gIHJldHVybiBpc0luUGFzdCA/IGAke2ZtdFZhbHVlfSAke2ZtdFVuaXR9IGFnb2AgOiBgaW4gJHtmbXRWYWx1ZX0gJHtmbXRVbml0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICBjb25zdCBmaWx0ZXJlZCA9IHBpY2soa25vd25Gb3JtYXQsIFtcbiAgICAgIFwid2Vla2RheVwiLFxuICAgICAgXCJlcmFcIixcbiAgICAgIFwieWVhclwiLFxuICAgICAgXCJtb250aFwiLFxuICAgICAgXCJkYXlcIixcbiAgICAgIFwiaG91clwiLFxuICAgICAgXCJtaW51dGVcIixcbiAgICAgIFwic2Vjb25kXCIsXG4gICAgICBcInRpbWVab25lTmFtZVwiLFxuICAgICAgXCJob3VyQ3ljbGVcIixcbiAgICBdKSxcbiAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgIGRhdGVUaW1lSHVnZSA9IFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXlcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5XCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURV9IVUdFKTpcbiAgICAgIHJldHVybiBcIkVFRUUsIExMTEwgZCwgeXl5eVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiaDptbSBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5USU1FXzI0X1NJTVBMRSk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiSEg6bW06c3NcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCk6XG4gICAgICByZXR1cm4gXCJISDptbVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfU0hPUlQpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW0gYVwiO1xuICAgIGNhc2Ugc3RyaW5naWZ5KEZvcm1hdHMuREFURVRJTUVfTUVEKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTEwpOlxuICAgICAgcmV0dXJuIFwiTExMTCBkLCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0hVR0UpOlxuICAgICAgcmV0dXJuIGRhdGVUaW1lSHVnZTtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1dFRUtEQVkpOlxuICAgICAgcmV0dXJuIFwiRUVFLCBkIExMTCB5eXl5LCBoOm1tIGFcIjtcbiAgICBjYXNlIHN0cmluZ2lmeShGb3JtYXRzLkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG4gICAgY2FzZSBzdHJpbmdpZnkoRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2Zvcm1hdHMuanNcIjtcbmltcG9ydCB7IHBhZFN0YXJ0IH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbnMoc3BsaXRzLCB0b2tlblRvU3RyaW5nKSB7XG4gIGxldCBzID0gXCJcIjtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiBzcGxpdHMpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcyArPSB0b2tlbi52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMgKz0gdG9rZW5Ub1N0cmluZyh0b2tlbi52YWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn1cblxuY29uc3QgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyA9IHtcbiAgRDogRm9ybWF0cy5EQVRFX1NIT1JULFxuICBERDogRm9ybWF0cy5EQVRFX01FRCxcbiAgREREOiBGb3JtYXRzLkRBVEVfRlVMTCxcbiAgRERERDogRm9ybWF0cy5EQVRFX0hVR0UsXG4gIHQ6IEZvcm1hdHMuVElNRV9TSU1QTEUsXG4gIHR0OiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTLFxuICB0dHQ6IEZvcm1hdHMuVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQsXG4gIFQ6IEZvcm1hdHMuVElNRV8yNF9TSU1QTEUsXG4gIFRUOiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVCxcbiAgVFRUVDogRm9ybWF0cy5USU1FXzI0X1dJVEhfTE9OR19PRkZTRVQsXG4gIGY6IEZvcm1hdHMuREFURVRJTUVfU0hPUlQsXG4gIGZmOiBGb3JtYXRzLkRBVEVUSU1FX01FRCxcbiAgZmZmOiBGb3JtYXRzLkRBVEVUSU1FX0ZVTEwsXG4gIGZmZmY6IEZvcm1hdHMuREFURVRJTUVfSFVHRSxcbiAgRjogRm9ybWF0cy5EQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMsXG4gIEZGOiBGb3JtYXRzLkRBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMsXG4gIEZGRjogRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogRm9ybWF0cy5EQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUyxcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXR0ZXIge1xuICBzdGF0aWMgY3JlYXRlKGxvY2FsZSwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIobG9jYWxlLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUZvcm1hdChmbXQpIHtcbiAgICBsZXQgY3VycmVudCA9IG51bGwsXG4gICAgICBjdXJyZW50RnVsbCA9IFwiXCIsXG4gICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBzcGxpdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGJyYWNrZXRlZCwgdmFsOiBjdXJyZW50RnVsbCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7IGxpdGVyYWw6IGZhbHNlLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHsgbGl0ZXJhbDogYnJhY2tldGVkLCB2YWw6IGN1cnJlbnRGdWxsIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcGxpdHM7XG4gIH1cblxuICBzdGF0aWMgbWFjcm9Ub2tlblRvRm9ybWF0T3B0cyh0b2tlbikge1xuICAgIHJldHVybiBtYWNyb1Rva2VuVG9Gb3JtYXRPcHRzW3Rva2VuXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgZm9ybWF0T3B0cykge1xuICAgIHRoaXMub3B0cyA9IGZvcm1hdE9wdHM7XG4gICAgdGhpcy5sb2MgPSBsb2NhbGU7XG4gICAgdGhpcy5zeXN0ZW1Mb2MgPSBudWxsO1xuICB9XG5cbiAgZm9ybWF0V2l0aFN5c3RlbURlZmF1bHQoZHQsIG9wdHMpIHtcbiAgICBpZiAodGhpcy5zeXN0ZW1Mb2MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3lzdGVtTG9jID0gdGhpcy5sb2MucmVkZWZhdWx0VG9TeXN0ZW0oKTtcbiAgICB9XG4gICAgY29uc3QgZGYgPSB0aGlzLnN5c3RlbUxvYy5kdEZvcm1hdHRlcihkdCwgeyAuLi50aGlzLm9wdHMsIC4uLm9wdHMgfSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZVRpbWUoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfVxuXG4gIGZvcm1hdERhdGVUaW1lUGFydHMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5mb3JtYXRUb1BhcnRzKCk7XG4gIH1cblxuICByZXNvbHZlZE9wdGlvbnMoZHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGRmID0gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZHQsIHsgLi4udGhpcy5vcHRzLCAuLi5vcHRzIH0pO1xuICAgIHJldHVybiBkZi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgfVxuXG4gIG51bShuLCBwID0gMCkge1xuICAgIC8vIHdlIGdldCBzb21lIHBlcmYgb3V0IG9mIGRvaW5nIHRoaXMgaGVyZSwgYW5ub3lpbmdseVxuICAgIGlmICh0aGlzLm9wdHMuZm9yY2VTaW1wbGUpIHtcbiAgICAgIHJldHVybiBwYWRTdGFydChuLCBwKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0geyAuLi50aGlzLm9wdHMgfTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH1cblxuICBmb3JtYXREYXRlVGltZUZyb21TdHJpbmcoZHQsIGZtdCkge1xuICAgIGNvbnN0IGtub3duRW5nbGlzaCA9IHRoaXMubG9jLmxpc3RpbmdNb2RlKCkgPT09IFwiZW5cIixcbiAgICAgIHVzZURhdGVUaW1lRm9ybWF0dGVyID0gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgJiYgdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgIT09IFwiZ3JlZ29yeVwiLFxuICAgICAgc3RyaW5nID0gKG9wdHMsIGV4dHJhY3QpID0+IHRoaXMubG9jLmV4dHJhY3QoZHQsIG9wdHMsIGV4dHJhY3QpLFxuICAgICAgZm9ybWF0T2Zmc2V0ID0gKG9wdHMpID0+IHtcbiAgICAgICAgaWYgKGR0LmlzT2Zmc2V0Rml4ZWQgJiYgZHQub2Zmc2V0ID09PSAwICYmIG9wdHMuYWxsb3daKSB7XG4gICAgICAgICAgcmV0dXJuIFwiWlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGR0LmlzVmFsaWQgPyBkdC56b25lLmZvcm1hdE9mZnNldChkdC50cywgb3B0cy5mb3JtYXQpIDogXCJcIjtcbiAgICAgIH0sXG4gICAgICBtZXJpZGllbSA9ICgpID0+XG4gICAgICAgIGtub3duRW5nbGlzaFxuICAgICAgICAgID8gRW5nbGlzaC5tZXJpZGllbUZvckRhdGVUaW1lKGR0KVxuICAgICAgICAgIDogc3RyaW5nKHsgaG91cjogXCJudW1lcmljXCIsIGhvdXJDeWNsZTogXCJoMTJcIiB9LCBcImRheXBlcmlvZFwiKSxcbiAgICAgIG1vbnRoID0gKGxlbmd0aCwgc3RhbmRhbG9uZSkgPT5cbiAgICAgICAga25vd25FbmdsaXNoXG4gICAgICAgICAgPyBFbmdsaXNoLm1vbnRoRm9yRGF0ZVRpbWUoZHQsIGxlbmd0aClcbiAgICAgICAgICA6IHN0cmluZyhzdGFuZGFsb25lID8geyBtb250aDogbGVuZ3RoIH0gOiB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKSxcbiAgICAgIHdlZWtkYXkgPSAobGVuZ3RoLCBzdGFuZGFsb25lKSA9PlxuICAgICAgICBrbm93bkVuZ2xpc2hcbiAgICAgICAgICA/IEVuZ2xpc2gud2Vla2RheUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpXG4gICAgICAgICAgOiBzdHJpbmcoXG4gICAgICAgICAgICAgIHN0YW5kYWxvbmUgPyB7IHdlZWtkYXk6IGxlbmd0aCB9IDogeyB3ZWVrZGF5OiBsZW5ndGgsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9LFxuICAgICAgICAgICAgICBcIndlZWtkYXlcIlxuICAgICAgICAgICAgKSxcbiAgICAgIG1heWJlTWFjcm8gPSAodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0T3B0cyA9IEZvcm1hdHRlci5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHRva2VuKTtcbiAgICAgICAgaWYgKGZvcm1hdE9wdHMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChkdCwgZm9ybWF0T3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJhID0gKGxlbmd0aCkgPT5cbiAgICAgICAga25vd25FbmdsaXNoID8gRW5nbGlzaC5lcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyh7IGVyYTogbGVuZ3RoIH0sIFwiZXJhXCIpLFxuICAgICAgdG9rZW5Ub1N0cmluZyA9ICh0b2tlbikgPT4ge1xuICAgICAgICAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lLTEvZGF0ZS10aW1lI1RPQy1TdGFuZGFsb25lLXZzLi1Gb3JtYXQtU3R5bGVzXG4gICAgICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgICAgICAvLyBtc1xuICAgICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWlsbGlzZWNvbmQpO1xuICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taWxsaXNlY29uZCwgMyk7XG4gICAgICAgICAgLy8gc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuc2Vjb25kKTtcbiAgICAgICAgICBjYXNlIFwic3NcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5zZWNvbmQsIDIpO1xuICAgICAgICAgIC8vIGZyYWN0aW9uYWwgc2Vjb25kc1xuICAgICAgICAgIGNhc2UgXCJ1dVwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQubWlsbGlzZWNvbmQgLyAxMCksIDIpO1xuICAgICAgICAgIGNhc2UgXCJ1dXVcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGR0Lm1pbGxpc2Vjb25kIC8gMTAwKSk7XG4gICAgICAgICAgLy8gbWludXRlc1xuICAgICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQubWludXRlKTtcbiAgICAgICAgICBjYXNlIFwibW1cIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5taW51dGUsIDIpO1xuICAgICAgICAgIC8vIGhvdXJzXG4gICAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5ob3VyICUgMTIgPT09IDAgPyAxMiA6IGR0LmhvdXIgJSAxMik7XG4gICAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91cik7XG4gICAgICAgICAgY2FzZSBcIkhIXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQuaG91ciwgMik7XG4gICAgICAgICAgLy8gb2Zmc2V0XG4gICAgICAgICAgY2FzZSBcIlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoeyBmb3JtYXQ6IFwibmFycm93XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgKzA2OjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInNob3J0XCIsIGFsbG93WjogdGhpcy5vcHRzLmFsbG93WiB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgICAvLyBsaWtlICswNjAwXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHsgZm9ybWF0OiBcInRlY2hpZVwiLCBhbGxvd1o6IHRoaXMub3B0cy5hbGxvd1ogfSk7XG4gICAgICAgICAgY2FzZSBcIlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJzaG9ydFwiLCBsb2NhbGU6IHRoaXMubG9jLmxvY2FsZSB9KTtcbiAgICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgRWFzdGVybiBTdGFuZGFyZCBUaW1lXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZS5vZmZzZXROYW1lKGR0LnRzLCB7IGZvcm1hdDogXCJsb25nXCIsIGxvY2FsZTogdGhpcy5sb2MubG9jYWxlIH0pO1xuICAgICAgICAgIC8vIHpvbmVcbiAgICAgICAgICBjYXNlIFwielwiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgICByZXR1cm4gZHQuem9uZU5hbWU7XG4gICAgICAgICAgLy8gbWVyaWRpZW1zXG4gICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAgIC8vIGRhdGVzXG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IGRheTogXCJudW1lcmljXCIgfSwgXCJkYXlcIikgOiB0aGlzLm51bShkdC5kYXkpO1xuICAgICAgICAgIGNhc2UgXCJkZFwiOlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyID8gc3RyaW5nKHsgZGF5OiBcIjItZGlnaXRcIiB9LCBcImRheVwiKSA6IHRoaXMubnVtKGR0LmRheSwgMik7XG4gICAgICAgICAgLy8gd2Vla2RheXMgLSBzdGFuZGFsb25lXG4gICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUdWVzZGF5J1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuICAgICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVCdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG4gICAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtkYXkpO1xuICAgICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheShcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwibG9uZ1wiLCBmYWxzZSk7XG4gICAgICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgICAgICAvLyBsaWtlICdUJ1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIHN0YW5kYWxvbmVcbiAgICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCJudW1lcmljXCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoKTtcbiAgICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDEsIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICByZXR1cm4gdXNlRGF0ZVRpbWVGb3JtYXR0ZXJcbiAgICAgICAgICAgICAgPyBzdHJpbmcoeyBtb250aDogXCIyLWRpZ2l0XCIsIGRheTogXCJudW1lcmljXCIgfSwgXCJtb250aFwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0Lm1vbnRoLCAyKTtcbiAgICAgICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwic2hvcnRcIiwgdHJ1ZSk7XG4gICAgICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSmFudWFyeVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcbiAgICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIHRydWUpO1xuICAgICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IG1vbnRoOiBcIm51bWVyaWNcIiB9LCBcIm1vbnRoXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQubW9udGgpO1xuICAgICAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgbW9udGg6IFwiMi1kaWdpdFwiIH0sIFwibW9udGhcIilcbiAgICAgICAgICAgICAgOiB0aGlzLm51bShkdC5tb250aCwgMik7XG4gICAgICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcbiAgICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAgIC8vIGxpa2UgSlxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoKFwibmFycm93XCIsIGZhbHNlKTtcbiAgICAgICAgICAvLyB5ZWFyc1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAvLyBsaWtlIDIwMTRcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlciA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKSA6IHRoaXMubnVtKGR0LnllYXIpO1xuICAgICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAxNFxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCIyLWRpZ2l0XCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwgMik7XG4gICAgICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgICAgcmV0dXJuIHVzZURhdGVUaW1lRm9ybWF0dGVyXG4gICAgICAgICAgICAgID8gc3RyaW5nKHsgeWVhcjogXCJudW1lcmljXCIgfSwgXCJ5ZWFyXCIpXG4gICAgICAgICAgICAgIDogdGhpcy5udW0oZHQueWVhciwgNCk7XG4gICAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgICAgLy8gbGlrZSAwMDAwMTJcbiAgICAgICAgICAgIHJldHVybiB1c2VEYXRlVGltZUZvcm1hdHRlclxuICAgICAgICAgICAgICA/IHN0cmluZyh7IHllYXI6IFwibnVtZXJpY1wiIH0sIFwieWVhclwiKVxuICAgICAgICAgICAgICA6IHRoaXMubnVtKGR0LnllYXIsIDYpO1xuICAgICAgICAgIC8vIGVyYXNcbiAgICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgICAgcmV0dXJuIGVyYShcInNob3J0XCIpO1xuICAgICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgICAgLy8gbGlrZSBBbm5vIERvbWluaVxuICAgICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG4gICAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgICByZXR1cm4gZXJhKFwibmFycm93XCIpO1xuICAgICAgICAgIGNhc2UgXCJra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcbiAgICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtZZWFyLCA0KTtcbiAgICAgICAgICBjYXNlIFwiV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIpO1xuICAgICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuICAgICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5udW0oZHQub3JkaW5hbCk7XG4gICAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGR0Lm9yZGluYWwsIDMpO1xuICAgICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyKTtcbiAgICAgICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgICAgIC8vIGxpa2UgMDFcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC5xdWFydGVyLCAyKTtcbiAgICAgICAgICBjYXNlIFwiWFwiOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG4gICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bShkdC50cyk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIHJldHVybiBzdHJpbmdpZnlUb2tlbnMoRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZtdCksIHRva2VuVG9TdHJpbmcpO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGR1ciwgZm10KSB7XG4gICAgY29uc3QgdG9rZW5Ub0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodG9rZW5bMF0pIHtcbiAgICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwic2Vjb25kXCI7XG4gICAgICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuICAgICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJob3VyXCI7XG4gICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImRheVwiO1xuICAgICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICByZXR1cm4gXCJ5ZWFyXCI7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdG9rZW5Ub1N0cmluZyA9IChsaWxkdXIpID0+ICh0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuICAgICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubnVtKGxpbGR1ci5nZXQobWFwcGVkKSwgdG9rZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0b2tlbnMgPSBGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSxcbiAgICAgIHJlYWxUb2tlbnMgPSB0b2tlbnMucmVkdWNlKFxuICAgICAgICAoZm91bmQsIHsgbGl0ZXJhbCwgdmFsIH0pID0+IChsaXRlcmFsID8gZm91bmQgOiBmb3VuZC5jb25jYXQodmFsKSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8oLi4ucmVhbFRva2Vucy5tYXAodG9rZW5Ub0ZpZWxkKS5maWx0ZXIoKHQpID0+IHQpKTtcbiAgICByZXR1cm4gc3RyaW5naWZ5VG9rZW5zKHRva2VucywgdG9rZW5Ub1N0cmluZyhjb2xsYXBzZWQpKTtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEludmFsaWQge1xuICBjb25zdHJ1Y3RvcihyZWFzb24sIGV4cGxhbmF0aW9uKSB7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5leHBsYW5hdGlvbiA9IGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgdG9NZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmV4cGxhbmF0aW9uKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IFpvbmVJc0Fic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFpvbmUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB6b25lLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvZmZzZXQgaXMga25vd24gdG8gYmUgZml4ZWQgZm9yIHRoZSB3aG9sZSB5ZWFyLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyBjb21tb24gbmFtZSAoc3VjaCBhcyBFU1QpIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIE9wdGlvbnMgdG8gYWZmZWN0IHRoZSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMuZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLiBBY2NlcHRzICdsb25nJyBvciAnc2hvcnQnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQncyB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRzIC0gRXBvY2ggbWlsbGlzZWNvbmRzIGZvciB3aGljaCB0byBnZXQgdGhlIG9mZnNldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gV2hhdCBzdHlsZSBvZiBvZmZzZXQgdG8gcmV0dXJuLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0cyAnbmFycm93JywgJ3Nob3J0Jywgb3IgJ3RlY2hpZScuIFJldHVybmluZyAnKzYnLCAnKzA2OjAwJywgb3IgJyswNjAwJyByZXNwZWN0aXZlbHlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIHRoaXMgem9uZSBhdCB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIGVxdWFsIHRvIGFub3RoZXIgem9uZVxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIFpvbmUgaXMgdmFsaWQuXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHBhcnNlWm9uZUluZm8gfSBmcm9tIFwiLi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgWm9uZSBmcm9tIFwiLi4vem9uZS5qc1wiO1xuXG5sZXQgc2luZ2xldG9uID0gbnVsbDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBsb2NhbCB6b25lIGZvciB0aGlzIEphdmFTY3JpcHQgZW52aXJvbm1lbnQuXG4gKiBAaW1wbGVtZW50cyB7Wm9uZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogR2V0IGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBsb2NhbCB6b25lXG4gICAqIEByZXR1cm4ge1N5c3RlbVpvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgIGlmIChzaW5nbGV0b24gPT09IG51bGwpIHtcbiAgICAgIHNpbmdsZXRvbiA9IG5ldyBTeXN0ZW1ab25lKCk7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJzeXN0ZW1cIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUodHMsIHsgZm9ybWF0LCBsb2NhbGUgfSkge1xuICAgIHJldHVybiBwYXJzZVpvbmVJbmZvKHRzLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5vZmZzZXQodHMpLCBmb3JtYXQpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwic3lzdGVtXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGZvcm1hdE9mZnNldCwgcGFyc2Vab25lSW5mbywgaXNVbmRlZmluZWQsIGlhbmFSZWdleCwgb2JqVG9Mb2NhbFRTIH0gZnJvbSBcIi4uL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcblxuY29uc3QgbWF0Y2hpbmdSZWdleCA9IFJlZ0V4cChgXiR7aWFuYVJlZ2V4LnNvdXJjZX0kYCk7XG5cbmxldCBkdGZDYWNoZSA9IHt9O1xuZnVuY3Rpb24gbWFrZURURih6b25lKSB7XG4gIGlmICghZHRmQ2FjaGVbem9uZV0pIHtcbiAgICBkdGZDYWNoZVt6b25lXSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KFwiZW4tVVNcIiwge1xuICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICAgIHRpbWVab25lOiB6b25lLFxuICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgICBkYXk6IFwiMi1kaWdpdFwiLFxuICAgICAgaG91cjogXCIyLWRpZ2l0XCIsXG4gICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgc2Vjb25kOiBcIjItZGlnaXRcIixcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZHRmQ2FjaGVbem9uZV07XG59XG5cbmNvbnN0IHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDUsXG59O1xuXG5mdW5jdGlvbiBoYWNreU9mZnNldChkdGYsIGRhdGUpIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgIHBhcnNlZCA9IC8oXFxkKylcXC8oXFxkKylcXC8oXFxkKyksPyAoXFxkKyk6KFxcZCspOihcXGQrKS8uZXhlYyhmb3JtYXR0ZWQpLFxuICAgIFssIGZNb250aCwgZkRheSwgZlllYXIsIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXSA9IHBhcnNlZDtcbiAgcmV0dXJuIFtmWWVhciwgZk1vbnRoLCBmRGF5LCBmSG91ciwgZk1pbnV0ZSwgZlNlY29uZF07XG59XG5cbmZ1bmN0aW9uIHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICBmaWxsZWQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBmb3JtYXR0ZWRbaV0sXG4gICAgICBwb3MgPSB0eXBlVG9Qb3NbdHlwZV07XG5cbiAgICBpZiAoIWlzVW5kZWZpbmVkKHBvcykpIHtcbiAgICAgIGZpbGxlZFtwb3NdID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxubGV0IGlhbmFab25lQ2FjaGUgPSB7fTtcbi8qKlxuICogQSB6b25lIGlkZW50aWZpZWQgYnkgYW4gSUFOQSBpZGVudGlmaWVyLCBsaWtlIEFtZXJpY2EvTmV3X1lvcmtcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJQU5BWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBab25lIG5hbWVcbiAgICogQHJldHVybiB7SUFOQVpvbmV9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG5hbWUpIHtcbiAgICBpZiAoIWlhbmFab25lQ2FjaGVbbmFtZV0pIHtcbiAgICAgIGlhbmFab25lQ2FjaGVbbmFtZV0gPSBuZXcgSUFOQVpvbmUobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW5hWm9uZUNhY2hlW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGxvY2FsIGNhY2hlcy4gU2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGluIHRlc3Rpbmcgc2NlbmFyaW9zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0Q2FjaGUoKSB7XG4gICAgaWFuYVpvbmVDYWNoZSA9IHt9O1xuICAgIGR0ZkNhY2hlID0ge307XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBzdHJpbmcgaXMgYSB2YWxpZCBzcGVjaWZpZXIuIFRoaXMgb25seSBjaGVja3MgdGhlIHN0cmluZydzIGZvcm1hdCwgbm90IHRoYXQgdGhlIHNwZWNpZmllciBpZGVudGlmaWVzIGEga25vd24gem9uZTsgc2VlIGlzVmFsaWRab25lIGZvciB0aGF0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBzdHJpbmcgdG8gY2hlY2sgdmFsaWRpdHkgb25cbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFNwZWNpZmllcihcIkFtZXJpY2EvTmV3X1lvcmtcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiB0cnVlXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoXCJTcG9ydH5+YmxvcnBcIikgLy89PiBmYWxzZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRTcGVjaWZpZXIocykge1xuICAgIHJldHVybiAhIShzICYmIHMubWF0Y2gobWF0Y2hpbmdSZWdleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgc3RyaW5nIGlkZW50aWZpZXMgYSByZWFsIHpvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHpvbmUgLSBUaGUgc3RyaW5nIHRvIGNoZWNrXG4gICAqIEBleGFtcGxlIElBTkFab25lLmlzVmFsaWRab25lKFwiQW1lcmljYS9OZXdfWW9ya1wiKSAvLz0+IHRydWVcbiAgICogQGV4YW1wbGUgSUFOQVpvbmUuaXNWYWxpZFpvbmUoXCJGYW50YXNpYS9DYXN0bGVcIikgLy89PiBmYWxzZVxuICAgKiBAZXhhbXBsZSBJQU5BWm9uZS5pc1ZhbGlkWm9uZShcIlNwb3J0fn5ibG9ycFwiKSAvLz0+IGZhbHNlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZFpvbmUoem9uZSkge1xuICAgIGlmICghem9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7IHRpbWVab25lOiB6b25lIH0pLmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAcHJpdmF0ZSAqKi9cbiAgICB0aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICAvKiogQHByaXZhdGUgKiovXG4gICAgdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaWFuYVwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuem9uZU5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNVbml2ZXJzYWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgb2Zmc2V0TmFtZSh0cywgeyBmb3JtYXQsIGxvY2FsZSB9KSB7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZm9ybWF0T2Zmc2V0KHRzLCBmb3JtYXQpIHtcbiAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHRoaXMub2Zmc2V0KHRzKSwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCh0cykge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgICBpZiAoaXNOYU4oZGF0ZSkpIHJldHVybiBOYU47XG5cbiAgICBjb25zdCBkdGYgPSBtYWtlRFRGKHRoaXMubmFtZSksXG4gICAgICBbeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmRdID0gZHRmLmZvcm1hdFRvUGFydHNcbiAgICAgICAgPyBwYXJ0c09mZnNldChkdGYsIGRhdGUpXG4gICAgICAgIDogaGFja3lPZmZzZXQoZHRmLCBkYXRlKTtcblxuICAgIC8vIGJlY2F1c2Ugd2UncmUgdXNpbmcgaG91cjEyIGFuZCBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDI1NTY0JmNhbj0yJnE9JTIyMjQlM0EwMCUyMiUyMGRhdGV0aW1lZm9ybWF0XG4gICAgY29uc3QgYWRqdXN0ZWRIb3VyID0gaG91ciA9PT0gMjQgPyAwIDogaG91cjtcblxuICAgIGNvbnN0IGFzVVRDID0gb2JqVG9Mb2NhbFRTKHtcbiAgICAgIHllYXIsXG4gICAgICBtb250aCxcbiAgICAgIGRheSxcbiAgICAgIGhvdXI6IGFkanVzdGVkSG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICAgIHNlY29uZCxcbiAgICAgIG1pbGxpc2Vjb25kOiAwLFxuICAgIH0pO1xuXG4gICAgbGV0IGFzVFMgPSArZGF0ZTtcbiAgICBjb25zdCBvdmVyID0gYXNUUyAlIDEwMDA7XG4gICAgYXNUUyAtPSBvdmVyID49IDAgPyBvdmVyIDogMTAwMCArIG92ZXI7XG4gICAgcmV0dXJuIChhc1VUQyAtIGFzVFMpIC8gKDYwICogMTAwMCk7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUubmFtZSA9PT0gdGhpcy5uYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBmb3JtYXRPZmZzZXQsIHNpZ25lZE9mZnNldCB9IGZyb20gXCIuLi9pbXBsL3V0aWwuanNcIjtcbmltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbmxldCBzaW5nbGV0b24gPSBudWxsO1xuXG4vKipcbiAqIEEgem9uZSB3aXRoIGEgZml4ZWQgb2Zmc2V0IChtZWFuaW5nIG5vIERTVClcbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaXhlZE9mZnNldFpvbmUgZXh0ZW5kcyBab25lIHtcbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBVVENcbiAgICogQHJldHVybiB7Rml4ZWRPZmZzZXRab25lfVxuICAgKi9cbiAgc3RhdGljIGdldCB1dGNJbnN0YW5jZSgpIHtcbiAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICBzaW5nbGV0b24gPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gVGhlIG9mZnNldCBpbiBtaW51dGVzXG4gICAqIEByZXR1cm4ge0ZpeGVkT2Zmc2V0Wm9uZX1cbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShvZmZzZXQpIHtcbiAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlIDogbmV3IEZpeGVkT2Zmc2V0Wm9uZShvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiBGaXhlZE9mZnNldFpvbmUgZnJvbSBhIFVUQyBvZmZzZXQgc3RyaW5nLCBsaWtlIFwiVVRDKzZcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcyAtIFRoZSBvZmZzZXQgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQys2XCIpXG4gICAqIEBleGFtcGxlIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihcIlVUQyswNlwiKVxuICAgKiBAZXhhbXBsZSBGaXhlZE9mZnNldFpvbmUucGFyc2VTcGVjaWZpZXIoXCJVVEMtNjowMFwiKVxuICAgKiBAcmV0dXJuIHtGaXhlZE9mZnNldFpvbmV9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICBjb25zdCByID0gcy5tYXRjaCgvXnV0Yyg/OihbKy1dXFxkezEsMn0pKD86OihcXGR7Mn0pKT8pPyQvaSk7XG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9mZnNldCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqIEBwcml2YXRlICoqL1xuICAgIHRoaXMuZml4ZWQgPSBvZmZzZXQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gXCJmaXhlZFwiO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogYFVUQyR7Zm9ybWF0T2Zmc2V0KHRoaXMuZml4ZWQsIFwibmFycm93XCIpfWA7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQodHMsIGZvcm1hdCkge1xuICAgIHJldHVybiBmb3JtYXRPZmZzZXQodGhpcy5maXhlZCwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBpc1VuaXZlcnNhbCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwgImltcG9ydCBab25lIGZyb20gXCIuLi96b25lLmpzXCI7XG5cbi8qKlxuICogQSB6b25lIHRoYXQgZmFpbGVkIHRvIHBhcnNlLiBZb3Ugc2hvdWxkIG5ldmVyIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhpcy5cbiAqIEBpbXBsZW1lbnRzIHtab25lfVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnZhbGlkWm9uZSBleHRlbmRzIFpvbmUge1xuICBjb25zdHJ1Y3Rvcih6b25lTmFtZSkge1xuICAgIHN1cGVyKCk7XG4gICAgLyoqICBAcHJpdmF0ZSAqL1xuICAgIHRoaXMuem9uZU5hbWUgPSB6b25lTmFtZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBcImludmFsaWRcIjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgZ2V0IGlzVW5pdmVyc2FsKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBmb3JtYXRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIGVxdWFscygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBwcml2YXRlXG4gKi9cblxuaW1wb3J0IFpvbmUgZnJvbSBcIi4uL3pvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4uL3pvbmVzL2ZpeGVkT2Zmc2V0Wm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuLi96b25lcy9pbnZhbGlkWm9uZS5qc1wiO1xuXG5pbXBvcnQgeyBpc1VuZGVmaW5lZCwgaXNTdHJpbmcsIGlzTnVtYmVyIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplWm9uZShpbnB1dCwgZGVmYXVsdFpvbmUpIHtcbiAgbGV0IG9mZnNldDtcbiAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSB8fCBpbnB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBkZWZhdWx0Wm9uZTtcbiAgfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFpvbmUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgY29uc3QgbG93ZXJlZCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyZWQgPT09IFwibG9jYWxcIiB8fCBsb3dlcmVkID09PSBcInN5c3RlbVwiKSByZXR1cm4gZGVmYXVsdFpvbmU7XG4gICAgZWxzZSBpZiAobG93ZXJlZCA9PT0gXCJ1dGNcIiB8fCBsb3dlcmVkID09PSBcImdtdFwiKSByZXR1cm4gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBJQU5BWm9uZS5jcmVhdGUoaW5wdXQpO1xuICAgIGVsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4vem9uZXMvSUFOQVpvbmUuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcblxuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxubGV0IG5vdyA9ICgpID0+IERhdGUubm93KCksXG4gIGRlZmF1bHRab25lID0gXCJzeXN0ZW1cIixcbiAgZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudWxsLFxuICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBudWxsLFxuICB0aHJvd09uSW52YWxpZDtcblxuLyoqXG4gKiBTZXR0aW5ncyBjb250YWlucyBzdGF0aWMgZ2V0dGVycyBhbmQgc2V0dGVycyB0aGF0IGNvbnRyb2wgTHV4b24ncyBvdmVyYWxsIGJlaGF2aW9yLiBMdXhvbiBpcyBhIHNpbXBsZSBsaWJyYXJ5IHdpdGggZmV3IG9wdGlvbnMsIGJ1dCB0aGUgb25lcyBpdCBkb2VzIGhhdmUgbGl2ZSBoZXJlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxuICAgKiBAdHlwZSB7ZnVuY3Rpb259XG4gICAqL1xuICBzdGF0aWMgZ2V0IG5vdygpIHtcbiAgICByZXR1cm4gbm93O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHJldHVybmluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAuXG4gICAqIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbnVtYmVyLCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIEVwb2NoIG1pbGxpc2Vjb25kIGNvdW50XG4gICAqIEB0eXBlIHtmdW5jdGlvbn1cbiAgICogQGV4YW1wbGUgU2V0dGluZ3Mubm93ID0gKCkgPT4gRGF0ZS5ub3coKSArIDMwMDAgLy8gcHJldGVuZCBpdCBpcyAzIHNlY29uZHMgaW4gdGhlIGZ1dHVyZVxuICAgKiBAZXhhbXBsZSBTZXR0aW5ncy5ub3cgPSAoKSA9PiAwIC8vIGFsd2F5cyBwcmV0ZW5kIGl0J3MgSmFuIDEsIDE5NzAgYXQgbWlkbmlnaHQgaW4gVVRDIHRpbWVcbiAgICovXG4gIHN0YXRpYyBzZXQgbm93KG4pIHtcbiAgICBub3cgPSBuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogVXNlIHRoZSB2YWx1ZSBcInN5c3RlbVwiIHRvIHJlc2V0IHRoaXMgdmFsdWUgdG8gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdFpvbmUoem9uZSkge1xuICAgIGRlZmF1bHRab25lID0gem9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIG9iamVjdCBjdXJyZW50bHkgdXNlZCB0byBjcmVhdGUgRGF0ZVRpbWVzLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc3lzdGVtJ3MgdGltZSB6b25lICh0aGUgb25lIHNldCBvbiB0aGUgbWFjaGluZSB0aGF0IHJ1bnMgdGhpcyBjb2RlKS5cbiAgICogQHR5cGUge1pvbmV9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGRlZmF1bHRab25lKCkge1xuICAgIHJldHVybiBub3JtYWxpemVab25lKGRlZmF1bHRab25lLCBTeXN0ZW1ab25lLmluc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdExvY2FsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzZXQgZGVmYXVsdExvY2FsZShsb2NhbGUpIHtcbiAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCBudW1iZXJpbmcgc3lzdGVtIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgbnVtYmVyaW5nIHN5c3RlbSB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0obnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZ1N5c3RlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGNhbGVuZGFyIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE91dHB1dENhbGVuZGFyKCkge1xuICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc2V0IGRlZmF1bHRPdXRwdXRDYWxlbmRhcihvdXRwdXRDYWxlbmRhcikge1xuICAgIGRlZmF1bHRPdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKSB7XG4gICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBzZXQgdGhyb3dPbkludmFsaWQodCkge1xuICAgIHRocm93T25JbnZhbGlkID0gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldENhY2hlcygpIHtcbiAgICBMb2NhbGUucmVzZXRDYWNoZSgpO1xuICAgIElBTkFab25lLnJlc2V0Q2FjaGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHBhZFN0YXJ0LCByb3VuZFRvLCBoYXNSZWxhdGl2ZSB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCAqIGFzIEVuZ2xpc2ggZnJvbSBcIi4vZW5nbGlzaC5qc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuLi9kYXRldGltZS5qc1wiO1xuaW1wb3J0IElBTkFab25lIGZyb20gXCIuLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuXG4vLyB0b2RvIC0gcmVtYXAgY2FjaGluZ1xuXG5sZXQgaW50bExGQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZExGKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGR0ZiA9IGludGxMRkNhY2hlW2tleV07XG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuTGlzdEZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxMRkNhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxEVENhY2hlID0ge307XG5mdW5jdGlvbiBnZXRDYWNoZWREVEYobG9jU3RyaW5nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW2xvY1N0cmluZywgb3B0c10pO1xuICBsZXQgZHRmID0gaW50bERUQ2FjaGVba2V5XTtcbiAgaWYgKCFkdGYpIHtcbiAgICBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxEVENhY2hlW2tleV0gPSBkdGY7XG4gIH1cbiAgcmV0dXJuIGR0Zjtcbn1cblxubGV0IGludGxOdW1DYWNoZSA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2FjaGVkSU5GKGxvY1N0cmluZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxOdW1DYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBpbnRsUmVsQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGdldENhY2hlZFJURihsb2NTdHJpbmcsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGJhc2UsIC4uLmNhY2hlS2V5T3B0cyB9ID0gb3B0czsgLy8gZXhjbHVkZSBgYmFzZWAgZnJvbSB0aGUgb3B0aW9uc1xuICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBjYWNoZUtleU9wdHNdKTtcbiAgbGV0IGluZiA9IGludGxSZWxDYWNoZVtrZXldO1xuICBpZiAoIWluZikge1xuICAgIGluZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NTdHJpbmcsIG9wdHMpO1xuICAgIGludGxSZWxDYWNoZVtrZXldID0gaW5mO1xuICB9XG4gIHJldHVybiBpbmY7XG59XG5cbmxldCBzeXNMb2NhbGVDYWNoZSA9IG51bGw7XG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGVTdHIpIHtcbiAgLy8gSSByZWFsbHkgd2FudCB0byBhdm9pZCB3cml0aW5nIGEgQkNQIDQ3IHBhcnNlclxuICAvLyBzZWUsIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL3dvb29ybS9iY3AtNDdcbiAgLy8gSW5zdGVhZCwgd2UnbGwgZG8gdGhpczpcblxuICAvLyBhKSBpZiB0aGUgc3RyaW5nIGhhcyBubyAtdSBleHRlbnNpb25zLCBqdXN0IGxlYXZlIGl0IGFsb25lXG4gIC8vIGIpIGlmIGl0IGRvZXMsIHVzZSBJbnRsIHRvIHJlc29sdmUgZXZlcnl0aGluZ1xuICAvLyBjKSBpZiBJbnRsIGZhaWxzLCB0cnkgYWdhaW4gd2l0aG91dCB0aGUgLXVcblxuICBjb25zdCB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcbiAgaWYgKHVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gW2xvY2FsZVN0cl07XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgY29uc3Qgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihsb2NhbGVTdHIpLnJlc29sdmVkT3B0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wdGlvbnMgPSBnZXRDYWNoZWREVEYoc21hbGxlcikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBvcHRpb25zO1xuICAgIC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuICAgIHJldHVybiBbc21hbGxlciwgbnVtYmVyaW5nU3lzdGVtLCBjYWxlbmRhcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50bENvbmZpZ1N0cmluZyhsb2NhbGVTdHIsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpIHtcbiAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgIGxvY2FsZVN0ciArPSBcIi11XCI7XG5cbiAgICBpZiAob3V0cHV0Q2FsZW5kYXIpIHtcbiAgICAgIGxvY2FsZVN0ciArPSBgLWNhLSR7b3V0cHV0Q2FsZW5kYXJ9YDtcbiAgICB9XG5cbiAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICBsb2NhbGVTdHIgKz0gYC1udS0ke251bWJlcmluZ1N5c3RlbX1gO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlU3RyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsb2NhbGVTdHI7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwTW9udGhzKGYpIHtcbiAgY29uc3QgbXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIGksIDEpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG4gIHJldHVybiBtcztcbn1cblxuZnVuY3Rpb24gbWFwV2Vla2RheXMoZikge1xuICBjb25zdCBtcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSA3OyBpKyspIHtcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMgKyBpKTtcbiAgICBtcy5wdXNoKGYoZHQpKTtcbiAgfVxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIGxpc3RTdHVmZihsb2MsIGxlbmd0aCwgZGVmYXVsdE9LLCBlbmdsaXNoRm4sIGludGxGbikge1xuICBjb25zdCBtb2RlID0gbG9jLmxpc3RpbmdNb2RlKGRlZmF1bHRPSyk7XG5cbiAgaWYgKG1vZGUgPT09IFwiZXJyb3JcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiZW5cIikge1xuICAgIHJldHVybiBlbmdsaXNoRm4obGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW50bEZuKGxlbmd0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNGYXN0TnVtYmVycyhsb2MpIHtcbiAgaWYgKGxvYy5udW1iZXJpbmdTeXN0ZW0gJiYgbG9jLm51bWJlcmluZ1N5c3RlbSAhPT0gXCJsYXRuXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxvYy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiIHx8XG4gICAgICAhbG9jLmxvY2FsZSB8fFxuICAgICAgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvYy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuY2xhc3MgUG9seU51bWJlckZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGludGwsIGZvcmNlU2ltcGxlLCBvcHRzKSB7XG4gICAgdGhpcy5wYWRUbyA9IG9wdHMucGFkVG8gfHwgMDtcbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vciB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHsgcGFkVG8sIGZsb29yLCAuLi5vdGhlck9wdHMgfSA9IG9wdHM7XG5cbiAgICBpZiAoIWZvcmNlU2ltcGxlIHx8IE9iamVjdC5rZXlzKG90aGVyT3B0cykubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaW50bE9wdHMgPSB7IHVzZUdyb3VwaW5nOiBmYWxzZSwgLi4ub3B0cyB9O1xuICAgICAgaWYgKG9wdHMucGFkVG8gPiAwKSBpbnRsT3B0cy5taW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMucGFkVG87XG4gICAgICB0aGlzLmluZiA9IGdldENhY2hlZElORihpbnRsLCBpbnRsT3B0cyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0KGkpIHtcbiAgICBpZiAodGhpcy5pbmYpIHtcbiAgICAgIGNvbnN0IGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5mLmZvcm1hdChmaXhlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvIG1hdGNoIHRoZSBicm93c2VyJ3MgbnVtYmVyZm9ybWF0dGVyIGRlZmF1bHRzXG4gICAgICBjb25zdCBmaXhlZCA9IHRoaXMuZmxvb3IgPyBNYXRoLmZsb29yKGkpIDogcm91bmRUbyhpLCAzKTtcbiAgICAgIHJldHVybiBwYWRTdGFydChmaXhlZCwgdGhpcy5wYWRUbyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5jbGFzcyBQb2x5RGF0ZUZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcblxuICAgIGxldCB6O1xuICAgIGlmIChkdC56b25lLmlzVW5pdmVyc2FsKSB7XG4gICAgICAvLyBVVEMtOCBvciBFdGMvVVRDLTggYXJlIG5vdCBwYXJ0IG9mIHR6ZGF0YSwgb25seSBFdGMvR01UKzggYW5kIHRoZSBsaWtlLlxuICAgICAgLy8gVGhhdCBpcyB3aHkgZml4ZWQtb2Zmc2V0IFRaIGlzIHNldCB0byB0aGF0IHVubGVzcyBpdCBpczpcbiAgICAgIC8vIDEuIFJlcHJlc2VudGluZyBvZmZzZXQgMCB3aGVuIFVUQyBpcyB1c2VkIHRvIG1haW50YWluIHByZXZpb3VzIGJlaGF2aW9yIGFuZCBkb2VzIG5vdCBiZWNvbWUgR01ULlxuICAgICAgLy8gMi4gVW5zdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXI6XG4gICAgICAvLyAgICAtIHNvbWUgZG8gbm90IHN1cHBvcnQgRXRjL1xuICAgICAgLy8gICAgLSA8IEV0Yy9HTVQtMTQsID4gRXRjL0dNVCsxMiwgYW5kIDMwLW1pbnV0ZSBvciA0NS1taW51dGUgb2Zmc2V0cyBhcmUgbm90IHBhcnQgb2YgdHpkYXRhXG4gICAgICBjb25zdCBnbXRPZmZzZXQgPSAtMSAqIChkdC5vZmZzZXQgLyA2MCk7XG4gICAgICBjb25zdCBvZmZzZXRaID0gZ210T2Zmc2V0ID49IDAgPyBgRXRjL0dNVCske2dtdE9mZnNldH1gIDogYEV0Yy9HTVQke2dtdE9mZnNldH1gO1xuICAgICAgaWYgKGR0Lm9mZnNldCAhPT0gMCAmJiBJQU5BWm9uZS5jcmVhdGUob2Zmc2V0WikudmFsaWQpIHtcbiAgICAgICAgeiA9IG9mZnNldFo7XG4gICAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhbGwgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjLys0OjMwIGFyZSBwcmVzZW50IGluIHR6ZGF0YS5cbiAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAgIC8vIDEuIFRoZSBmb3JtYXQgb3B0aW9ucyB0ZWxsIHVzIHRvIHNob3cgdGhlIHpvbmUuIFdlIGNhbid0IGRvIHRoYXQsIHNvIHRoZSBiZXN0XG4gICAgICAgIC8vIHdlIGNhbiBkbyBpcyBmb3JtYXQgdGhlIGRhdGUgaW4gVVRDLlxuICAgICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgICAvLyB0aGUgdGltZSBhbmQgdGVsbCB0aGUgZm9ybWF0dGVyIHRvIHNob3cgaXQgdG8gdXMgaW4gVVRDLCBzbyB0aGF0IHRoZSB0aW1lIGlzIHJpZ2h0XG4gICAgICAgIC8vIGFuZCB0aGUgYmFkIHpvbmUgZG9lc24ndCBzaG93IHVwLlxuICAgICAgICB6ID0gXCJVVENcIjtcbiAgICAgICAgaWYgKG9wdHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZHQgPSBkdC5vZmZzZXQgPT09IDAgPyBkdCA6IERhdGVUaW1lLmZyb21NaWxsaXMoZHQudHMgKyBkdC5vZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIHRoaXMuZHQgPSBkdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgeiA9IGR0LnpvbmUubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRsT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgaWYgKHopIHtcbiAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICB9XG4gICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgZm9ybWF0KCkge1xuICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIGZvcm1hdFRvUGFydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHRmLmZvcm1hdFRvUGFydHModGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgfVxuXG4gIHJlc29sdmVkT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5kdGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQb2x5UmVsRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IoaW50bCwgaXNFbmdsaXNoLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0geyBzdHlsZTogXCJsb25nXCIsIC4uLm9wdHMgfTtcbiAgICBpZiAoIWlzRW5nbGlzaCAmJiBoYXNSZWxhdGl2ZSgpKSB7XG4gICAgICB0aGlzLnJ0ZiA9IGdldENhY2hlZFJURihpbnRsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXQoY291bnQsIHVuaXQpIHtcbiAgICBpZiAodGhpcy5ydGYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJ0Zi5mb3JtYXQoY291bnQsIHVuaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRW5nbGlzaC5mb3JtYXRSZWxhdGl2ZVRpbWUodW5pdCwgY291bnQsIHRoaXMub3B0cy5udW1lcmljLCB0aGlzLm9wdHMuc3R5bGUgIT09IFwibG9uZ1wiKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUb1BhcnRzKGNvdW50LCB1bml0KSB7XG4gICAgaWYgKHRoaXMucnRmKSB7XG4gICAgICByZXR1cm4gdGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhjb3VudCwgdW5pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsZSB7XG4gIHN0YXRpYyBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyLCBkZWZhdWx0VG9FTiA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XG4gICAgLy8gdGhlIHN5c3RlbSBsb2NhbGUgaXMgdXNlZnVsIGZvciBodW1hbiByZWFkYWJsZSBzdHJpbmdzIGJ1dCBhbm5veWluZyBmb3IgcGFyc2luZy9mb3JtYXR0aW5nIGtub3duIGZvcm1hdHNcbiAgICBjb25zdCBsb2NhbGVSID0gc3BlY2lmaWVkTG9jYWxlIHx8IChkZWZhdWx0VG9FTiA/IFwiZW4tVVNcIiA6IHN5c3RlbUxvY2FsZSgpKTtcbiAgICBjb25zdCBudW1iZXJpbmdTeXN0ZW1SID0gbnVtYmVyaW5nU3lzdGVtIHx8IFNldHRpbmdzLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgY29uc3Qgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNldENhY2hlKCkge1xuICAgIHN5c0xvY2FsZUNhY2hlID0gbnVsbDtcbiAgICBpbnRsRFRDYWNoZSA9IHt9O1xuICAgIGludGxOdW1DYWNoZSA9IHt9O1xuICAgIGludGxSZWxDYWNoZSA9IHt9O1xuICB9XG5cbiAgc3RhdGljIGZyb21PYmplY3QoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGxvY2FsZSwgbnVtYmVyaW5nLCBvdXRwdXRDYWxlbmRhciwgc3BlY2lmaWVkTG9jYWxlKSB7XG4gICAgY29uc3QgW3BhcnNlZExvY2FsZSwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtLCBwYXJzZWRPdXRwdXRDYWxlbmRhcl0gPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpO1xuXG4gICAgdGhpcy5sb2NhbGUgPSBwYXJzZWRMb2NhbGU7XG4gICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmcgfHwgcGFyc2VkTnVtYmVyaW5nU3lzdGVtIHx8IG51bGw7XG4gICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9IG91dHB1dENhbGVuZGFyIHx8IHBhcnNlZE91dHB1dENhbGVuZGFyIHx8IG51bGw7XG4gICAgdGhpcy5pbnRsID0gaW50bENvbmZpZ1N0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sIHRoaXMub3V0cHV0Q2FsZW5kYXIpO1xuXG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0geyBmb3JtYXQ6IHt9LCBzdGFuZGFsb25lOiB7fSB9O1xuICAgIHRoaXMubW9udGhzQ2FjaGUgPSB7IGZvcm1hdDoge30sIHN0YW5kYWxvbmU6IHt9IH07XG4gICAgdGhpcy5tZXJpZGllbUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLmVyYUNhY2hlID0ge307XG5cbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIGdldCBmYXN0TnVtYmVycygpIHtcbiAgICBpZiAodGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gc3VwcG9ydHNGYXN0TnVtYmVycyh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mYXN0TnVtYmVyc0NhY2hlZDtcbiAgfVxuXG4gIGxpc3RpbmdNb2RlKCkge1xuICAgIGNvbnN0IGlzQWN0dWFsbHlFbiA9IHRoaXMuaXNFbmdsaXNoKCk7XG4gICAgY29uc3QgaGFzTm9XZWlyZG5lc3MgPVxuICAgICAgKHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBudWxsIHx8IHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBcImxhdG5cIikgJiZcbiAgICAgICh0aGlzLm91dHB1dENhbGVuZGFyID09PSBudWxsIHx8IHRoaXMub3V0cHV0Q2FsZW5kYXIgPT09IFwiZ3JlZ29yeVwiKTtcbiAgICByZXR1cm4gaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzID8gXCJlblwiIDogXCJpbnRsXCI7XG4gIH1cblxuICBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKFxuICAgICAgICBhbHRzLmxvY2FsZSB8fCB0aGlzLnNwZWNpZmllZExvY2FsZSxcbiAgICAgICAgYWx0cy5udW1iZXJpbmdTeXN0ZW0gfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGFsdHMub3V0cHV0Q2FsZW5kYXIgfHwgdGhpcy5vdXRwdXRDYWxlbmRhcixcbiAgICAgICAgYWx0cy5kZWZhdWx0VG9FTiB8fCBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZWRlZmF1bHRUb0VOKGFsdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKHsgLi4uYWx0cywgZGVmYXVsdFRvRU46IHRydWUgfSk7XG4gIH1cblxuICByZWRlZmF1bHRUb1N5c3RlbShhbHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSh7IC4uLmFsdHMsIGRlZmF1bHRUb0VOOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG1vbnRocyhsZW5ndGgsIGZvcm1hdCA9IGZhbHNlLCBkZWZhdWx0T0sgPSB0cnVlKSB7XG4gICAgcmV0dXJuIGxpc3RTdHVmZih0aGlzLCBsZW5ndGgsIGRlZmF1bHRPSywgRW5nbGlzaC5tb250aHMsICgpID0+IHtcbiAgICAgIGNvbnN0IGludGwgPSBmb3JtYXQgPyB7IG1vbnRoOiBsZW5ndGgsIGRheTogXCJudW1lcmljXCIgfSA6IHsgbW9udGg6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdKSB7XG4gICAgICAgIHRoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwTW9udGhzKChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcIm1vbnRoXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXTtcbiAgICB9KTtcbiAgfVxuXG4gIHdlZWtkYXlzKGxlbmd0aCwgZm9ybWF0ID0gZmFsc2UsIGRlZmF1bHRPSyA9IHRydWUpIHtcbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBFbmdsaXNoLndlZWtkYXlzLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnRsID0gZm9ybWF0XG4gICAgICAgICAgPyB7IHdlZWtkYXk6IGxlbmd0aCwgeWVhcjogXCJudW1lcmljXCIsIG1vbnRoOiBcImxvbmdcIiwgZGF5OiBcIm51bWVyaWNcIiB9XG4gICAgICAgICAgOiB7IHdlZWtkYXk6IGxlbmd0aCB9LFxuICAgICAgICBmb3JtYXRTdHIgPSBmb3JtYXQgPyBcImZvcm1hdFwiIDogXCJzdGFuZGFsb25lXCI7XG4gICAgICBpZiAoIXRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5c0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSA9IG1hcFdlZWtkYXlzKChkdCkgPT5cbiAgICAgICAgICB0aGlzLmV4dHJhY3QoZHQsIGludGwsIFwid2Vla2RheVwiKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF07XG4gICAgfSk7XG4gIH1cblxuICBtZXJpZGllbXMoZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYoXG4gICAgICB0aGlzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdE9LLFxuICAgICAgKCkgPT4gRW5nbGlzaC5tZXJpZGllbXMsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBjb3VsZCBiZSBhcmliaXRyYXJ5IGRheSBwZXJpb2RzLiBXZSdyZSBnb25uYSBhc3N1bWUgdGhlcmUgYXJlIGV4YWN0bHkgdHdvXG4gICAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgICAgaWYgKCF0aGlzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBpbnRsID0geyBob3VyOiBcIm51bWVyaWNcIiwgaG91ckN5Y2xlOiBcImgxMlwiIH07XG4gICAgICAgICAgdGhpcy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChcbiAgICAgICAgICAgIChkdCkgPT4gdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImRheXBlcmlvZFwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tZXJpZGllbUNhY2hlO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBlcmFzKGxlbmd0aCwgZGVmYXVsdE9LID0gdHJ1ZSkge1xuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIEVuZ2xpc2guZXJhcywgKCkgPT4ge1xuICAgICAgY29uc3QgaW50bCA9IHsgZXJhOiBsZW5ndGggfTtcblxuICAgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYy4gRGlmZmVyZW50IGNhbGVuZGFycyBhcmUgZ29pbmcgdG8gZGVmaW5lIGVyYXMgdG90YWxseSBkaWZmZXJlbnRseS4gV2hhdCBJIG5lZWQgaXMgdGhlIG1pbmltdW0gc2V0IG9mIGRhdGVzXG4gICAgICAvLyB0byBkZWZpbml0ZWx5IGVudW1lcmF0ZSB0aGVtLlxuICAgICAgaWYgKCF0aGlzLmVyYUNhY2hlW2xlbmd0aF0pIHtcbiAgICAgICAgdGhpcy5lcmFDYWNoZVtsZW5ndGhdID0gW0RhdGVUaW1lLnV0YygtNDAsIDEsIDEpLCBEYXRlVGltZS51dGMoMjAxNywgMSwgMSldLm1hcCgoZHQpID0+XG4gICAgICAgICAgdGhpcy5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5lcmFDYWNoZVtsZW5ndGhdO1xuICAgIH0pO1xuICB9XG5cbiAgZXh0cmFjdChkdCwgaW50bE9wdHMsIGZpZWxkKSB7XG4gICAgY29uc3QgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICByZXN1bHRzID0gZGYuZm9ybWF0VG9QYXJ0cygpLFxuICAgICAgbWF0Y2hpbmcgPSByZXN1bHRzLmZpbmQoKG0pID0+IG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBmaWVsZCk7XG4gICAgcmV0dXJuIG1hdGNoaW5nID8gbWF0Y2hpbmcudmFsdWUgOiBudWxsO1xuICB9XG5cbiAgbnVtYmVyRm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgcmV0dXJuIG5ldyBQb2x5TnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cy5mb3JjZVNpbXBsZSB8fCB0aGlzLmZhc3ROdW1iZXJzLCBvcHRzKTtcbiAgfVxuXG4gIGR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5RGF0ZUZvcm1hdHRlcihkdCwgdGhpcy5pbnRsLCBpbnRsT3B0cyk7XG4gIH1cblxuICByZWxGb3JtYXR0ZXIob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2x5UmVsRm9ybWF0dGVyKHRoaXMuaW50bCwgdGhpcy5pc0VuZ2xpc2goKSwgb3B0cyk7XG4gIH1cblxuICBsaXN0Rm9ybWF0dGVyKG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBnZXRDYWNoZWRMRih0aGlzLmludGwsIG9wdHMpO1xuICB9XG5cbiAgaXNFbmdsaXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvY2FsZSA9PT0gXCJlblwiIHx8XG4gICAgICB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHxcbiAgICAgIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKVxuICAgICk7XG4gIH1cblxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2NhbGUgPT09IG90aGVyLmxvY2FsZSAmJlxuICAgICAgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG90aGVyLm51bWJlcmluZ1N5c3RlbSAmJlxuICAgICAgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXJcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdW50cnVuY2F0ZVllYXIsXG4gIHNpZ25lZE9mZnNldCxcbiAgcGFyc2VJbnRlZ2VyLFxuICBwYXJzZU1pbGxpcyxcbiAgaWFuYVJlZ2V4LFxuICBpc1VuZGVmaW5lZCxcbiAgcGFyc2VGbG9hdGluZyxcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0ICogYXMgRW5nbGlzaCBmcm9tIFwiLi9lbmdsaXNoLmpzXCI7XG5pbXBvcnQgRml4ZWRPZmZzZXRab25lIGZyb20gXCIuLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi4vem9uZXMvSUFOQVpvbmUuanNcIjtcblxuLypcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XG4gKiBUd28gdGhpbmdzIGdvIGludG8gcGFyc2luZzogYSByZWdleCB0byBtYXRjaCB3aXRoIGFuZCBhbiBleHRyYWN0b3IgdG8gdGFrZSBhcGFydCB0aGUgZ3JvdXBzIGluIHRoZSBtYXRjaC5cbiAqIEFuIGV4dHJhY3RvciBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJlZ2V4IG1hdGNoIGFycmF5IGFuZCByZXR1cm5zIGEgeyB5ZWFyOiAuLi4sIG1vbnRoOiAuLi4gfSBvYmplY3RcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxuICogRXh0cmFjdG9ycyBjYW4gdGFrZSBhIFwiY3Vyc29yXCIgcmVwcmVzZW50aW5nIHRoZSBvZmZzZXQgaW4gdGhlIG1hdGNoIHRvIGxvb2sgYXQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjb21iaW5lIGV4dHJhY3RvcnMuXG4gKiBjb21iaW5lRXh0cmFjdG9ycygpIGRvZXMgdGhlIHdvcmsgb2YgY29tYmluaW5nIHRoZW0sIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGN1cnNvciB0aHJvdWdoIG11bHRpcGxlIGV4dHJhY3Rpb25zLlxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJlZ2V4ZXMoLi4ucmVnZXhlcykge1xuICBjb25zdCBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoKGYsIHIpID0+IGYgKyByLnNvdXJjZSwgXCJcIik7XG4gIHJldHVybiBSZWdFeHAoYF4ke2Z1bGx9JGApO1xufVxuXG5mdW5jdGlvbiBjb21iaW5lRXh0cmFjdG9ycyguLi5leHRyYWN0b3JzKSB7XG4gIHJldHVybiAobSkgPT5cbiAgICBleHRyYWN0b3JzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoW21lcmdlZFZhbHMsIG1lcmdlZFpvbmUsIGN1cnNvcl0sIGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3ZhbCwgem9uZSwgbmV4dF0gPSBleChtLCBjdXJzb3IpO1xuICAgICAgICAgIHJldHVybiBbeyAuLi5tZXJnZWRWYWxzLCAuLi52YWwgfSwgbWVyZ2VkWm9uZSB8fCB6b25lLCBuZXh0XTtcbiAgICAgICAgfSxcbiAgICAgICAgW3t9LCBudWxsLCAxXVxuICAgICAgKVxuICAgICAgLnNsaWNlKDAsIDIpO1xufVxuXG5mdW5jdGlvbiBwYXJzZShzLCAuLi5wYXR0ZXJucykge1xuICBpZiAocyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3JlZ2V4LCBleHRyYWN0b3JdIG9mIHBhdHRlcm5zKSB7XG4gICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIHJldHVybiBleHRyYWN0b3IobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKC4uLmtleXMpIHtcbiAgcmV0dXJuIChtYXRjaCwgY3Vyc29yKSA9PiB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnRlZ2VyKG1hdGNoW2N1cnNvciArIGldKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXQsIG51bGwsIGN1cnNvciArIGldO1xuICB9O1xufVxuXG4vLyBJU08gYW5kIFNRTCBwYXJzaW5nXG5jb25zdCBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gIGlzb1RpbWVCYXNlUmVnZXggPSAvKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSg/OlsuLF0oXFxkezEsMzB9KSk/KT8pPy8sXG4gIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChgJHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0ke29mZnNldFJlZ2V4LnNvdXJjZX0/YCksXG4gIGlzb1RpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChgKD86VCR7aXNvVGltZVJlZ2V4LnNvdXJjZX0pP2ApLFxuICBpc29ZbWRSZWdleCA9IC8oWystXVxcZHs2fXxcXGR7NH0pKD86LT8oXFxkXFxkKSg/Oi0/KFxcZFxcZCkpPyk/LyxcbiAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICBpc29PcmRpbmFsUmVnZXggPSAvKFxcZHs0fSktPyhcXGR7M30pLyxcbiAgZXh0cmFjdElTT1dlZWtEYXRhID0gc2ltcGxlUGFyc2UoXCJ3ZWVrWWVhclwiLCBcIndlZWtOdW1iZXJcIiwgXCJ3ZWVrRGF5XCIpLFxuICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICBzcWxZbWRSZWdleCA9IC8oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKS8sIC8vIGR1bWJlZC1kb3duIHZlcnNpb24gb2YgdGhlIElTTyBvbmVcbiAgc3FsVGltZVJlZ2V4ID0gUmVnRXhwKFxuICAgIGAke2lzb1RpbWVCYXNlUmVnZXguc291cmNlfSA/KD86JHtvZmZzZXRSZWdleC5zb3VyY2V9fCgke2lhbmFSZWdleC5zb3VyY2V9KSk/YFxuICApLFxuICBzcWxUaW1lRXh0ZW5zaW9uUmVnZXggPSBSZWdFeHAoYCg/OiAke3NxbFRpbWVSZWdleC5zb3VyY2V9KT9gKTtcblxuZnVuY3Rpb24gaW50KG1hdGNoLCBwb3MsIGZhbGxiYWNrKSB7XG4gIGNvbnN0IG0gPSBtYXRjaFtwb3NdO1xuICByZXR1cm4gaXNVbmRlZmluZWQobSkgPyBmYWxsYmFjayA6IHBhcnNlSW50ZWdlcihtKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1ltZChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgeWVhcjogaW50KG1hdGNoLCBjdXJzb3IpLFxuICAgIG1vbnRoOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDEpLFxuICAgIGRheTogaW50KG1hdGNoLCBjdXJzb3IgKyAyLCAxKSxcbiAgfTtcblxuICByZXR1cm4gW2l0ZW0sIG51bGwsIGN1cnNvciArIDNdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SVNPVGltZShtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGl0ZW0gPSB7XG4gICAgaG91cnM6IGludChtYXRjaCwgY3Vyc29yLCAwKSxcbiAgICBtaW51dGVzOiBpbnQobWF0Y2gsIGN1cnNvciArIDEsIDApLFxuICAgIHNlY29uZHM6IGludChtYXRjaCwgY3Vyc29yICsgMiwgMCksXG4gICAgbWlsbGlzZWNvbmRzOiBwYXJzZU1pbGxpcyhtYXRjaFtjdXJzb3IgKyAzXSksXG4gIH07XG5cbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyA0XTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT09mZnNldChtYXRjaCwgY3Vyc29yKSB7XG4gIGNvbnN0IGxvY2FsID0gIW1hdGNoW2N1cnNvcl0gJiYgIW1hdGNoW2N1cnNvciArIDFdLFxuICAgIGZ1bGxPZmZzZXQgPSBzaWduZWRPZmZzZXQobWF0Y2hbY3Vyc29yICsgMV0sIG1hdGNoW2N1cnNvciArIDJdKSxcbiAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgY29uc3Qgem9uZSA9IG1hdGNoW2N1cnNvcl0gPyBJQU5BWm9uZS5jcmVhdGUobWF0Y2hbY3Vyc29yXSkgOiBudWxsO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAxXTtcbn1cblxuLy8gSVNPIHRpbWUgcGFyc2luZ1xuXG5jb25zdCBpc29UaW1lT25seSA9IFJlZ0V4cChgXlQ/JHtpc29UaW1lQmFzZVJlZ2V4LnNvdXJjZX0kYCk7XG5cbi8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cbmNvbnN0IGlzb0R1cmF0aW9uID1cbiAgL14tP1AoPzooPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pWSk/KD86KC0/XFxkezEsOX0oPzpcXC5cXGR7MSw5fSk/KU0pPyg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylXKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pRCk/KD86VCg/OigtP1xcZHsxLDl9KD86XFwuXFxkezEsOX0pPylIKT8oPzooLT9cXGR7MSw5fSg/OlxcLlxcZHsxLDl9KT8pTSk/KD86KC0/XFxkezEsMjB9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/KSQvO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPRHVyYXRpb24obWF0Y2gpIHtcbiAgY29uc3QgW3MsIHllYXJTdHIsIG1vbnRoU3RyLCB3ZWVrU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyLCBtaWxsaXNlY29uZHNTdHJdID1cbiAgICBtYXRjaDtcblxuICBjb25zdCBoYXNOZWdhdGl2ZVByZWZpeCA9IHNbMF0gPT09IFwiLVwiO1xuICBjb25zdCBuZWdhdGl2ZVNlY29uZHMgPSBzZWNvbmRTdHIgJiYgc2Vjb25kU3RyWzBdID09PSBcIi1cIjtcblxuICBjb25zdCBtYXliZU5lZ2F0ZSA9IChudW0sIGZvcmNlID0gZmFsc2UpID0+XG4gICAgbnVtICE9PSB1bmRlZmluZWQgJiYgKGZvcmNlIHx8IChudW0gJiYgaGFzTmVnYXRpdmVQcmVmaXgpKSA/IC1udW0gOiBudW07XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB5ZWFyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyh5ZWFyU3RyKSksXG4gICAgICBtb250aHM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcobW9udGhTdHIpKSxcbiAgICAgIHdlZWtzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKHdlZWtTdHIpKSxcbiAgICAgIGRheXM6IG1heWJlTmVnYXRlKHBhcnNlRmxvYXRpbmcoZGF5U3RyKSksXG4gICAgICBob3VyczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhob3VyU3RyKSksXG4gICAgICBtaW51dGVzOiBtYXliZU5lZ2F0ZShwYXJzZUZsb2F0aW5nKG1pbnV0ZVN0cikpLFxuICAgICAgc2Vjb25kczogbWF5YmVOZWdhdGUocGFyc2VGbG9hdGluZyhzZWNvbmRTdHIpLCBzZWNvbmRTdHIgPT09IFwiLTBcIiksXG4gICAgICBtaWxsaXNlY29uZHM6IG1heWJlTmVnYXRlKHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0ciksIG5lZ2F0aXZlU2Vjb25kcyksXG4gICAgfSxcbiAgXTtcbn1cblxuLy8gVGhlc2UgYXJlIGEgbGl0dGxlIGJyYWluZGVhZC4gRURUICpzaG91bGQqIHRlbGwgdXMgdGhhdCB3ZSdyZSBpbiwgc2F5LCBBbWVyaWNhL05ld19Zb3JrXG4vLyBhbmQgbm90IGp1c3QgdGhhdCB3ZSdyZSBpbiAtMjQwICpyaWdodCBub3cqLiBCdXQgc2luY2UgSSBkb24ndCB0aGluayB0aGVzZSBhcmUgdXNlZCB0aGF0IG9mdGVuXG4vLyBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgdGhhdFxuY29uc3Qgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MCxcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmdzKHdlZWtkYXlTdHIsIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50ZWdlcih5ZWFyU3RyKSkgOiBwYXJzZUludGVnZXIoeWVhclN0ciksXG4gICAgbW9udGg6IEVuZ2xpc2gubW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnRlZ2VyKGRheVN0ciksXG4gICAgaG91cjogcGFyc2VJbnRlZ2VyKGhvdXJTdHIpLFxuICAgIG1pbnV0ZTogcGFyc2VJbnRlZ2VyKG1pbnV0ZVN0ciksXG4gIH07XG5cbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50ZWdlcihzZWNvbmRTdHIpO1xuICBpZiAod2Vla2RheVN0cikge1xuICAgIHJlc3VsdC53ZWVrZGF5ID1cbiAgICAgIHdlZWtkYXlTdHIubGVuZ3RoID4gM1xuICAgICAgICA/IEVuZ2xpc2gud2Vla2RheXNMb25nLmluZGV4T2Yod2Vla2RheVN0cikgKyAxXG4gICAgICAgIDogRW5nbGlzaC53ZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0cikgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gUkZDIDI4MjIvNTMyMlxuY29uc3QgcmZjMjgyMiA9XG4gIC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXFxzKT8oXFxkezEsMn0pXFxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyhcXGR7Miw0fSlcXHMoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKSk/XFxzKD86KFVUfEdNVHxbRUNNUF1bU0RdVCl8KFtael0pfCg/OihbKy1dXFxkXFxkKShcXGRcXGQpKSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzI4MjIobWF0Y2gpIHtcbiAgY29uc3QgW1xuICAgICAgLFxuICAgICAgd2Vla2RheVN0cixcbiAgICAgIGRheVN0cixcbiAgICAgIG1vbnRoU3RyLFxuICAgICAgeWVhclN0cixcbiAgICAgIGhvdXJTdHIsXG4gICAgICBtaW51dGVTdHIsXG4gICAgICBzZWNvbmRTdHIsXG4gICAgICBvYnNPZmZzZXQsXG4gICAgICBtaWxPZmZzZXQsXG4gICAgICBvZmZIb3VyU3RyLFxuICAgICAgb2ZmTWludXRlU3RyLFxuICAgIF0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG5cbiAgbGV0IG9mZnNldDtcbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHNcbiAgICAucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIilcbiAgICAudHJpbSgpO1xufVxuXG4vLyBodHRwIGRhdGVcblxuY29uc3QgcmZjMTEyMyA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSwgKFxcZFxcZCkgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoXFxkezR9KSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgcmZjODUwID1cbiAgICAvXihNb25kYXl8VHVlc2RheXxXZWRzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXFxkXFxkKS0oSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpLShcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIEdNVCQvLFxuICBhc2NpaSA9XG4gICAgL14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXFxkfFxcZFxcZCkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgKFxcZHs0fSkkLztcblxuZnVuY3Rpb24gZXh0cmFjdFJGQzExMjNPcjg1MChtYXRjaCkge1xuICBjb25zdCBbLCB3ZWVrZGF5U3RyLCBkYXlTdHIsIG1vbnRoU3RyLCB5ZWFyU3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cl0gPSBtYXRjaCxcbiAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgY29uc3QgWywgd2Vla2RheVN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIsIHllYXJTdHJdID0gbWF0Y2gsXG4gICAgcmVzdWx0ID0gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpO1xuICByZXR1cm4gW3Jlc3VsdCwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXTtcbn1cblxuY29uc3QgaXNvWW1kV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb1ltZFJlZ2V4LCBpc29UaW1lRXh0ZW5zaW9uUmVnZXgpO1xuY29uc3QgaXNvV2Vla1dpdGhUaW1lRXh0ZW5zaW9uUmVnZXggPSBjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCA9IGNvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KTtcbmNvbnN0IGlzb1RpbWVDb21iaW5lZFJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KTtcblxuY29uc3QgZXh0cmFjdElTT1ltZFRpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXRcbik7XG5jb25zdCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXQgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1dlZWtEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09PcmRpbmFsRGF0ZUFuZFRpbWUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT09yZGluYWxEYXRhLFxuICBleHRyYWN0SVNPVGltZSxcbiAgZXh0cmFjdElTT09mZnNldFxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lQW5kT2Zmc2V0ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtpc29ZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPWW1kVGltZUFuZE9mZnNldF0sXG4gICAgW2lzb1dlZWtXaXRoVGltZUV4dGVuc2lvblJlZ2V4LCBleHRyYWN0SVNPV2Vla1RpbWVBbmRPZmZzZXRdLFxuICAgIFtpc29PcmRpbmFsV2l0aFRpbWVFeHRlbnNpb25SZWdleCwgZXh0cmFjdElTT09yZGluYWxEYXRlQW5kVGltZV0sXG4gICAgW2lzb1RpbWVDb21iaW5lZFJlZ2V4LCBleHRyYWN0SVNPVGltZUFuZE9mZnNldF1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUkZDMjgyMkRhdGUocykge1xuICByZXR1cm4gcGFyc2UocHJlcHJvY2Vzc1JGQzI4MjIocyksIFtyZmMyODIyLCBleHRyYWN0UkZDMjgyMl0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIVFRQRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShcbiAgICBzLFxuICAgIFtyZmMxMTIzLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSxcbiAgICBbYXNjaWksIGV4dHJhY3RBU0NJSV1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cblxuY29uc3QgZXh0cmFjdElTT1RpbWVPbmx5ID0gY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJU09UaW1lT25seShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbaXNvVGltZU9ubHksIGV4dHJhY3RJU09UaW1lT25seV0pO1xufVxuXG5jb25zdCBzcWxZbWRXaXRoVGltZUV4dGVuc2lvblJlZ2V4ID0gY29tYmluZVJlZ2V4ZXMoc3FsWW1kUmVnZXgsIHNxbFRpbWVFeHRlbnNpb25SZWdleCk7XG5jb25zdCBzcWxUaW1lQ29tYmluZWRSZWdleCA9IGNvbWJpbmVSZWdleGVzKHNxbFRpbWVSZWdleCk7XG5cbmNvbnN0IGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1ltZCxcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcbmNvbnN0IGV4dHJhY3RJU09UaW1lT2Zmc2V0QW5kSUFOQVpvbmUgPSBjb21iaW5lRXh0cmFjdG9ycyhcbiAgZXh0cmFjdElTT1RpbWUsXG4gIGV4dHJhY3RJU09PZmZzZXQsXG4gIGV4dHJhY3RJQU5BWm9uZVxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKFxuICAgIHMsXG4gICAgW3NxbFltZFdpdGhUaW1lRXh0ZW5zaW9uUmVnZXgsIGV4dHJhY3RJU09ZbWRUaW1lT2Zmc2V0QW5kSUFOQVpvbmVdLFxuICAgIFtzcWxUaW1lQ29tYmluZWRSZWdleCwgZXh0cmFjdElTT1RpbWVPZmZzZXRBbmRJQU5BWm9uZV1cbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgSW52YWxpZER1cmF0aW9uRXJyb3IsIEludmFsaWRVbml0RXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBJbnZhbGlkIGZyb20gXCIuL2ltcGwvaW52YWxpZC5qc1wiO1xuaW1wb3J0IExvY2FsZSBmcm9tIFwiLi9pbXBsL2xvY2FsZS5qc1wiO1xuaW1wb3J0IHsgcGFyc2VJU09EdXJhdGlvbiwgcGFyc2VJU09UaW1lT25seSB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7XG4gIGFzTnVtYmVyLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaXNJbnRlZ2VyLFxuICBpc051bWJlcixcbiAgaXNVbmRlZmluZWQsXG4gIG5vcm1hbGl6ZU9iamVjdCxcbiAgcm91bmRUbyxcbn0gZnJvbSBcIi4vaW1wbC91dGlsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEdXJhdGlvblwiO1xuXG4vLyB1bml0IGNvbnZlcnNpb24gY29uc3RhbnRzXG5leHBvcnQgY29uc3QgbG93T3JkZXJNYXRyaXggPSB7XG4gICAgd2Vla3M6IHtcbiAgICAgIGRheXM6IDcsXG4gICAgICBob3VyczogNyAqIDI0LFxuICAgICAgbWludXRlczogNyAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIGRheXM6IHtcbiAgICAgIGhvdXJzOiAyNCxcbiAgICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBob3VyczogeyBtaW51dGVzOiA2MCwgc2Vjb25kczogNjAgKiA2MCwgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMCB9LFxuICAgIG1pbnV0ZXM6IHsgc2Vjb25kczogNjAsIG1pbGxpc2Vjb25kczogNjAgKiAxMDAwIH0sXG4gICAgc2Vjb25kczogeyBtaWxsaXNlY29uZHM6IDEwMDAgfSxcbiAgfSxcbiAgY2FzdWFsTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogNTIsXG4gICAgICBkYXlzOiAzNjUsXG4gICAgICBob3VyczogMzY1ICogMjQsXG4gICAgICBtaW51dGVzOiAzNjUgKiAyNCAqIDYwLFxuICAgICAgc2Vjb25kczogMzY1ICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgcXVhcnRlcnM6IHtcbiAgICAgIG1vbnRoczogMyxcbiAgICAgIHdlZWtzOiAxMyxcbiAgICAgIGRheXM6IDkxLFxuICAgICAgaG91cnM6IDkxICogMjQsXG4gICAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogOTEgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG4gICAgbW9udGhzOiB7XG4gICAgICB3ZWVrczogNCxcbiAgICAgIGRheXM6IDMwLFxuICAgICAgaG91cnM6IDMwICogMjQsXG4gICAgICBtaW51dGVzOiAzMCAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiAzMCAqIDI0ICogNjAgKiA2MCxcbiAgICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICAgIH0sXG5cbiAgICAuLi5sb3dPcmRlck1hdHJpeCxcbiAgfSxcbiAgZGF5c0luWWVhckFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0MDAsXG4gIGRheXNJbk1vbnRoQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQ4MDAsXG4gIGFjY3VyYXRlTWF0cml4ID0ge1xuICAgIHllYXJzOiB7XG4gICAgICBxdWFydGVyczogNCxcbiAgICAgIG1vbnRoczogMTIsXG4gICAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJblllYXJBY2N1cmF0ZSxcbiAgICAgIGhvdXJzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCxcbiAgICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgICBtaWxsaXNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgfSxcbiAgICBxdWFydGVyczoge1xuICAgICAgbW9udGhzOiAzLFxuICAgICAgd2Vla3M6IGRheXNJblllYXJBY2N1cmF0ZSAvIDI4LFxuICAgICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICAgIGhvdXJzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQpIC8gNCxcbiAgICAgIG1pbnV0ZXM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwKSAvIDQsXG4gICAgICBzZWNvbmRzOiAoZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwKSAvIDQsXG4gICAgICBtaWxsaXNlY29uZHM6IChkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSAvIDQsXG4gICAgfSxcbiAgICBtb250aHM6IHtcbiAgICAgIHdlZWtzOiBkYXlzSW5Nb250aEFjY3VyYXRlIC8gNyxcbiAgICAgIGRheXM6IGRheXNJbk1vbnRoQWNjdXJhdGUsXG4gICAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgICAgbWludXRlczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgICBzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgICB9LFxuICAgIC4uLmxvd09yZGVyTWF0cml4LFxuICB9O1xuXG4vLyB1bml0cyBvcmRlcmVkIGJ5IHNpemVcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcbiAgXCJ5ZWFyc1wiLFxuICBcInF1YXJ0ZXJzXCIsXG4gIFwibW9udGhzXCIsXG4gIFwid2Vla3NcIixcbiAgXCJkYXlzXCIsXG4gIFwiaG91cnNcIixcbiAgXCJtaW51dGVzXCIsXG4gIFwic2Vjb25kc1wiLFxuICBcIm1pbGxpc2Vjb25kc1wiLFxuXTtcblxuY29uc3QgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTtcblxuLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcbmZ1bmN0aW9uIGNsb25lKGR1ciwgYWx0cywgY2xlYXIgPSBmYWxzZSkge1xuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIGNvbnN0IGNvbmYgPSB7XG4gICAgdmFsdWVzOiBjbGVhciA/IGFsdHMudmFsdWVzIDogeyAuLi5kdXIudmFsdWVzLCAuLi4oYWx0cy52YWx1ZXMgfHwge30pIH0sXG4gICAgbG9jOiBkdXIubG9jLmNsb25lKGFsdHMubG9jKSxcbiAgICBjb252ZXJzaW9uQWNjdXJhY3k6IGFsdHMuY29udmVyc2lvbkFjY3VyYWN5IHx8IGR1ci5jb252ZXJzaW9uQWNjdXJhY3ksXG4gIH07XG4gIHJldHVybiBuZXcgRHVyYXRpb24oY29uZik7XG59XG5cbmZ1bmN0aW9uIGFudGlUcnVuYyhuKSB7XG4gIHJldHVybiBuIDwgMCA/IE1hdGguZmxvb3IobikgOiBNYXRoLmNlaWwobik7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNvbnZlcnQobWF0cml4LCBmcm9tTWFwLCBmcm9tVW5pdCwgdG9NYXAsIHRvVW5pdCkge1xuICBjb25zdCBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgIHJhdyA9IGZyb21NYXBbZnJvbVVuaXRdIC8gY29udixcbiAgICBzYW1lU2lnbiA9IE1hdGguc2lnbihyYXcpID09PSBNYXRoLnNpZ24odG9NYXBbdG9Vbml0XSksXG4gICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICAgIGFkZGVkID1cbiAgICAgICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59XG5cbi8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlcyhtYXRyaXgsIHZhbHMpIHtcbiAgcmV2ZXJzZVVuaXRzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHNbY3VycmVudF0pKSB7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgY29udmVydChtYXRyaXgsIHZhbHMsIHByZXZpb3VzLCB2YWxzLCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cblxuLyoqXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZSNwbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXG4gKlxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBEdXJhdGlvbjpcbiAqXG4gKiAqICoqQ3JlYXRpb24qKiBUbyBjcmVhdGUgYSBEdXJhdGlvbiwgdXNlIHtAbGluayBEdXJhdGlvbiNmcm9tTWlsbGlzfSwge0BsaW5rIER1cmF0aW9uI2Zyb21PYmplY3R9LCBvciB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT30uXG4gKiAqICoqVW5pdCB2YWx1ZXMqKiBTZWUgdGhlIHtAbGluayBEdXJhdGlvbiN5ZWFyc30sIHtAbGluayBEdXJhdGlvbi5tb250aHN9LCB7QGxpbmsgRHVyYXRpb24jd2Vla3N9LCB7QGxpbmsgRHVyYXRpb24jZGF5c30sIHtAbGluayBEdXJhdGlvbiNob3Vyc30sIHtAbGluayBEdXJhdGlvbiNtaW51dGVzfSwge0BsaW5rIER1cmF0aW9uI3NlY29uZHN9LCB7QGxpbmsgRHVyYXRpb24jbWlsbGlzZWNvbmRzfSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uI2xvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbiNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBuZXcgRHVyYXRpb25zIG91dCBvZiBvbGQgb25lcyB1c2Uge0BsaW5rIER1cmF0aW9uI3BsdXN9LCB7QGxpbmsgRHVyYXRpb24jbWludXN9LCB7QGxpbmsgRHVyYXRpb24jbm9ybWFsaXplfSwge0BsaW5rIER1cmF0aW9uI3NldH0sIHtAbGluayBEdXJhdGlvbiNyZWNvbmZpZ3VyZX0sIHtAbGluayBEdXJhdGlvbiNzaGlmdFRvfSwgYW5kIHtAbGluayBEdXJhdGlvbiNuZWdhdGV9LlxuICogKiAqKk91dHB1dCoqIFRvIGNvbnZlcnQgdGhlIER1cmF0aW9uIGludG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCBzZWUge0BsaW5rIER1cmF0aW9uI2FzfSwge0BsaW5rIER1cmF0aW9uI3RvSVNPfSwge0BsaW5rIER1cmF0aW9uI3RvRm9ybWF0fSwgYW5kIHtAbGluayBEdXJhdGlvbiN0b0pTT059XG4gKlxuICogVGhlcmUncyBhcmUgbW9yZSBtZXRob2RzIGRvY3VtZW50ZWQgYmVsb3cuIEluIGFkZGl0aW9uLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWJ0bGVyIHRvcGljcyBsaWtlIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCB2YWxpZGl0eSwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEdXJhdGlvbiB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgY29uc3QgYWNjdXJhdGUgPSBjb25maWcuY29udmVyc2lvbkFjY3VyYWN5ID09PSBcImxvbmd0ZXJtXCIgfHwgZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy52YWx1ZXMgPSBjb25maWcudmFsdWVzO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jb252ZXJzaW9uQWNjdXJhY3kgPSBhY2N1cmF0ZSA/IFwibG9uZ3Rlcm1cIiA6IFwiY2FzdWFsXCI7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm1hdHJpeCA9IGFjY3VyYXRlID8gYWNjdXJhdGVNYXRyaXggOiBjYXN1YWxNYXRyaXg7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uRHVyYXRpb24gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBEdXJhdGlvbiBmcm9tIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IG9mIG1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbU1pbGxpcyhjb3VudCwgb3B0cykge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWlsbGlzZWNvbmRzOiBjb3VudCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzJy5cbiAgICogSWYgdGhpcyBvYmplY3QgaXMgZW1wdHkgdGhlbiBhIHplcm8gbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubW9udGhzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91cnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5taW51dGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbGxpc2Vjb25kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHM9W11dIC0gb3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhpcyBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb252ZXJzaW9uQWNjdXJhY3k9J2Nhc3VhbCddIC0gdGhlIGNvbnZlcnNpb24gc3lzdGVtIHRvIHVzZVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tT2JqZWN0KG9iaiwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7XG4gICAgICAgICAgb2JqID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2Ygb2JqXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRHVyYXRpb24oe1xuICAgICAgdmFsdWVzOiBub3JtYWxpemVPYmplY3Qob2JqLCBEdXJhdGlvbi5ub3JtYWxpemVVbml0KSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0cyksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9wdHMuY29udmVyc2lvbkFjY3VyYWN5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gRHVyYXRpb25MaWtlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdCB8IG51bWJlciB8IER1cmF0aW9ufSBkdXJhdGlvbkxpa2VcbiAgICogT25lIG9mOlxuICAgKiAtIG9iamVjdCB3aXRoIGtleXMgbGlrZSAneWVhcnMnIGFuZCAnaG91cnMnLlxuICAgKiAtIG51bWJlciByZXByZXNlbnRpbmcgbWlsbGlzZWNvbmRzXG4gICAqIC0gRHVyYXRpb24gaW5zdGFuY2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbkxpa2UpIHtcbiAgICBpZiAoaXNOdW1iZXIoZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21NaWxsaXMoZHVyYXRpb25MaWtlKTtcbiAgICB9IGVsc2UgaWYgKER1cmF0aW9uLmlzRHVyYXRpb24oZHVyYXRpb25MaWtlKSkge1xuICAgICAgcmV0dXJuIGR1cmF0aW9uTGlrZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbkxpa2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KGR1cmF0aW9uTGlrZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgYFVua25vd24gZHVyYXRpb24gYXJndW1lbnQgJHtkdXJhdGlvbkxpa2V9IG9mIHR5cGUgJHt0eXBlb2YgZHVyYXRpb25MaWtlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgZHVyYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRleHQgdG8gcGFyc2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSB0aGUgbG9jYWxlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU08oJ1AzWTZNMVc0RFQxMkgzME01UycpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAzLCBtb250aHM6IDYsIHdlZWtzOiAxLCBkYXlzOiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUFQyM0gnKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjMgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQNVkzTScpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiA1LCBtb250aHM6IDMgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcGFyc2VkXSA9IHBhcnNlSVNPRHVyYXRpb24odGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QocGFyc2VkLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQoXCJ1bnBhcnNhYmxlXCIsIGB0aGUgaW5wdXQgXCIke3RleHR9XCIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gYW4gSVNPIDg2MDEgdGltZSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGV4dCB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPVGltZSgnMTE6MjI6MzMuNDQ0JykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAyMiwgc2Vjb25kczogMzMsIG1pbGxpc2Vjb25kczogNDQ0IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJzExOjAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTowMCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMCwgc2Vjb25kczogMCB9XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21JU09UaW1lKCcxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTT1RpbWUoJ1QxMTAwJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAwLCBzZWNvbmRzOiAwIH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBzdGF0aWMgZnJvbUlTT1RpbWUodGV4dCwgb3B0cykge1xuICAgIGNvbnN0IFtwYXJzZWRdID0gcGFyc2VJU09UaW1lT25seSh0ZXh0KTtcbiAgICBpZiAocGFyc2VkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChwYXJzZWQsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBzaW1wbGUgc3RyaW5nIG9mIHdoeSB0aGlzIGRhdGV0aW1lIGlzIGludmFsaWQuIFNob3VsZCBub3QgY29udGFpbiBwYXJhbWV0ZXJzIG9yIGFueXRoaW5nIGVsc2UgZGF0YS1kZXBlbmRlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHN0YXRpYyBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24gPSBudWxsKSB7XG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZhbGlkID0gcmVhc29uIGluc3RhbmNlb2YgSW52YWxpZCA/IHJlYXNvbiA6IG5ldyBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pO1xuXG4gICAgaWYgKFNldHRpbmdzLnRocm93T25JbnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZER1cmF0aW9uRXJyb3IoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oeyBpbnZhbGlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICB5ZWFyOiBcInllYXJzXCIsXG4gICAgICB5ZWFyczogXCJ5ZWFyc1wiLFxuICAgICAgcXVhcnRlcjogXCJxdWFydGVyc1wiLFxuICAgICAgcXVhcnRlcnM6IFwicXVhcnRlcnNcIixcbiAgICAgIG1vbnRoOiBcIm1vbnRoc1wiLFxuICAgICAgbW9udGhzOiBcIm1vbnRoc1wiLFxuICAgICAgd2VlazogXCJ3ZWVrc1wiLFxuICAgICAgd2Vla3M6IFwid2Vla3NcIixcbiAgICAgIGRheTogXCJkYXlzXCIsXG4gICAgICBkYXlzOiBcImRheXNcIixcbiAgICAgIGhvdXI6IFwiaG91cnNcIixcbiAgICAgIGhvdXJzOiBcImhvdXJzXCIsXG4gICAgICBtaW51dGU6IFwibWludXRlc1wiLFxuICAgICAgbWludXRlczogXCJtaW51dGVzXCIsXG4gICAgICBzZWNvbmQ6IFwic2Vjb25kc1wiLFxuICAgICAgc2Vjb25kczogXCJzZWNvbmRzXCIsXG4gICAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZHNcIixcbiAgICB9W3VuaXQgPyB1bml0LnRvTG93ZXJDYXNlKCkgOiB1bml0XTtcblxuICAgIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEdXJhdGlvbi4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzRHVyYXRpb24obykge1xuICAgIHJldHVybiAobyAmJiBvLmlzTHV4b25EdXJhdGlvbikgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0ICB0aGUgbG9jYWxlIG9mIGEgRHVyYXRpb24sIHN1Y2ggJ2VuLUdCJ1xuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEdXJhdGlvbiwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEdXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuIFlvdSBtYXkgdXNlIHRoZXNlIHRva2VuczpcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xuICAgKiAqIGBzYCBmb3Igc2Vjb25kc1xuICAgKiAqIGBtYCBmb3IgbWludXRlc1xuICAgKiAqIGBoYCBmb3IgaG91cnNcbiAgICogKiBgZGAgZm9yIGRheXNcbiAgICogKiBgTWAgZm9yIG1vbnRoc1xuICAgKiAqIGB5YCBmb3IgeWVhcnNcbiAgICogTm90ZXM6XG4gICAqICogQWRkIHBhZGRpbmcgYnkgcmVwZWF0aW5nIHRoZSB0b2tlbiwgZS5nLiBcInl5XCIgcGFkcyB0aGUgeWVhcnMgdG8gdHdvIGRpZ2l0cywgXCJoaGhoXCIgcGFkcyB0aGUgaG91cnMgb3V0IHRvIGZvdXIgZGlnaXRzXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uI3NoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCBzdHJpbmdcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInkgZCBzXCIpIC8vPT4gXCIxIDYgMlwiXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b0Zvcm1hdChcInl5IGRkIHNzc1wiKSAvLz0+IFwiMDEgMDYgMDAyXCJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChmbXQsIG9wdHMgPSB7fSkge1xuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICBjb25zdCBmbXRPcHRzID0ge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYywgZm10T3B0cykuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsIGZtdClcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRHVyYXRpb24gd2l0aCBhbGwgdW5pdHMgaW5jbHVkZWRcbiAgICogVG8gbW9kaWZ5IGl0cyBiZWhhdmlvciB1c2UgdGhlIGBsaXN0U3R5bGVgIGFuZCBhbnkgSW50bC5OdW1iZXJGb3JtYXQgb3B0aW9uLCB0aG91Z2ggYHVuaXREaXNwbGF5YCBpcyBlc3BlY2lhbGx5IHJlbGV2YW50LiBTZWUge0BsaW5rIEludGwuTnVtYmVyRm9ybWF0fS5cbiAgICogQHBhcmFtIG9wdHMgLSBPbiBvcHRpb24gb2JqZWN0IHRvIG92ZXJyaWRlIHRoZSBmb3JtYXR0aW5nLiBBY2NlcHRzIHRoZSBzYW1lIGtleXMgYXMgdGhlIG9wdGlvbnMgcGFyYW1ldGVyIG9mIHRoZSBuYXRpdmUgYEludC5OdW1iZXJGb3JtYXRgIGNvbnN0cnVjdG9yLCBhcyB3ZWxsIGFzIGBsaXN0U3R5bGVgLlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqc1xuICAgKiB2YXIgZHVyID0gRHVyYXRpb24uZnJvbU9iamVjdCh7IGRheXM6IDEsIGhvdXJzOiA1LCBtaW51dGVzOiA2IH0pXG4gICAqIGR1ci50b0h1bWFuKCkgLy89PiAnMSBkYXksIDUgaG91cnMsIDYgbWludXRlcydcbiAgICogZHVyLnRvSHVtYW4oeyBsaXN0U3R5bGU6IFwibG9uZ1wiIH0pIC8vPT4gJzEgZGF5LCA1IGhvdXJzLCBhbmQgNiBtaW51dGVzJ1xuICAgKiBkdXIudG9IdW1hbih7IHVuaXREaXNwbGF5OiBcInNob3J0XCIgfSkgLy89PiAnMSBkYXksIDUgaHIsIDYgbWluJ1xuICAgKiBgYGBcbiAgICovXG4gIHRvSHVtYW4ob3B0cyA9IHt9KSB7XG4gICAgY29uc3QgbCA9IG9yZGVyZWRVbml0c1xuICAgICAgLm1hcCgodW5pdCkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnZhbHVlc1t1bml0XTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NcbiAgICAgICAgICAubnVtYmVyRm9ybWF0dGVyKHsgc3R5bGU6IFwidW5pdFwiLCB1bml0RGlzcGxheTogXCJsb25nXCIsIC4uLm9wdHMsIHVuaXQ6IHVuaXQuc2xpY2UoMCwgLTEpIH0pXG4gICAgICAgICAgLmZvcm1hdCh2YWwpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKG4pID0+IG4pO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jXG4gICAgICAubGlzdEZvcm1hdHRlcih7IHR5cGU6IFwiY29uanVuY3Rpb25cIiwgc3R5bGU6IG9wdHMubGlzdFN0eWxlIHx8IFwibmFycm93XCIsIC4uLm9wdHMgfSlcbiAgICAgIC5mb3JtYXQobCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0IHdpdGggdGhpcyBEdXJhdGlvbidzIHZhbHVlcy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgdG9PYmplY3QoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB7fTtcbiAgICByZXR1cm4geyAuLi50aGlzLnZhbHVlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI0R1cmF0aW9uc1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDMsIHNlY29uZHM6IDQ1IH0pLnRvSVNPKCkgLy89PiAnUDNZVDQ1UydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbW9udGhzOiA1IH0pLnRvSVNPKCkgLy89PiAnUDVNJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgbWludXRlczogNSB9KS50b0lTTygpIC8vPT4gJ1BUNU0nXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08oKSB7XG4gICAgLy8gd2UgY291bGQgdXNlIHRoZSBmb3JtYXR0ZXIsIGJ1dCB0aGlzIGlzIGFuIGVhc2llciB3YXkgdG8gZ2V0IHRoZSBtaW5pbXVtIHN0cmluZ1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy53ZWVrcyAhPT0gMCkgcyArPSB0aGlzLndlZWtzICsgXCJXXCI7XG4gICAgaWYgKHRoaXMuZGF5cyAhPT0gMCkgcyArPSB0aGlzLmRheXMgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgcyArPSBcIlRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCkgcyArPSB0aGlzLmhvdXJzICsgXCJIXCI7XG4gICAgaWYgKHRoaXMubWludXRlcyAhPT0gMCkgcyArPSB0aGlzLm1pbnV0ZXMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKVxuICAgICAgLy8gdGhpcyB3aWxsIGhhbmRsZSBcImZsb2F0aW5nIHBvaW50IG1hZG5lc3NcIiBieSByZW1vdmluZyBleHRyYSBkZWNpbWFsIHBsYWNlc1xuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTg4MDA0L2lzLWZsb2F0aW5nLXBvaW50LW1hdGgtYnJva2VuXG4gICAgICBzICs9IHJvdW5kVG8odGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwLCAzKSArIFwiU1wiO1xuICAgIGlmIChzID09PSBcIlBcIikgcyArPSBcIlQwU1wiO1xuICAgIHJldHVybiBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLCBmb3JtYXR0ZWQgYXMgYSB0aW1lIG9mIGRheS5cbiAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgZHVyYXRpb24gaXMgaW52YWxpZCwgbmVnYXRpdmUsIG9yIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAyNCBob3Vycy5cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZVByZWZpeD1mYWxzZV0gLSBpbmNsdWRlIHRoZSBgVGAgcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSgpIC8vPT4gJzExOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc01pbGxpc2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcxMTowMDowMCdcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMSB9KS50b0lTT1RpbWUoeyBzdXBwcmVzc1NlY29uZHM6IHRydWUgfSkgLy89PiAnMTE6MDAnXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMTEgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMTE6MDA6MDAuMDAwJ1xuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDExIH0pLnRvSVNPVGltZSh7IGZvcm1hdDogJ2Jhc2ljJyB9KSAvLz0+ICcxMTAwMDAuMDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT1RpbWUob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWlsbGlzID0gdGhpcy50b01pbGxpcygpO1xuICAgIGlmIChtaWxsaXMgPCAwIHx8IG1pbGxpcyA+PSA4NjQwMDAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICBvcHRzID0ge1xuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHM6IGZhbHNlLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVQcmVmaXg6IGZhbHNlLFxuICAgICAgZm9ybWF0OiBcImV4dGVuZGVkXCIsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2hpZnRUbyhcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIik7XG5cbiAgICBsZXQgZm10ID0gb3B0cy5mb3JtYXQgPT09IFwiYmFzaWNcIiA/IFwiaGhtbVwiIDogXCJoaDptbVwiO1xuXG4gICAgaWYgKCFvcHRzLnN1cHByZXNzU2Vjb25kcyB8fCB2YWx1ZS5zZWNvbmRzICE9PSAwIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgZm10ICs9IG9wdHMuZm9ybWF0ID09PSBcImJhc2ljXCIgPyBcInNzXCIgOiBcIjpzc1wiO1xuICAgICAgaWYgKCFvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IHZhbHVlLm1pbGxpc2Vjb25kcyAhPT0gMCkge1xuICAgICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN0ciA9IHZhbHVlLnRvRm9ybWF0KGZtdCk7XG5cbiAgICBpZiAob3B0cy5pbmNsdWRlUHJlZml4KSB7XG4gICAgICBzdHIgPSBcIlRcIiArIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGRlYnVnZ2luZy5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5hcyhcIm1pbGxpc2Vjb25kc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG1pbGxpc2Vjb25kcyB2YWx1ZSBvZiB0aGlzIER1cmF0aW9uLiBBbGlhcyBvZiB7QGxpbmsgdG9NaWxsaXN9XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9NaWxsaXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gbG9uZ2VyIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHBsdXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5KGR1ci52YWx1ZXMsIGspIHx8IGhhc093blByb3BlcnR5KHRoaXMudmFsdWVzLCBrKSkge1xuICAgICAgICByZXN1bHRba10gPSBkdXIuZ2V0KGspICsgdGhpcy5nZXQoayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGlzIER1cmF0aW9uIHNob3J0ZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnBsdXMoZHVyLm5lZ2F0ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FsZSB0aGlzIER1cmF0aW9uIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB1bml0LiBBcml0eSBpcyAxIG9yIDI6IHRoZSB2YWx1ZSBvZiB0aGUgdW5pdCBhbmQsIG9wdGlvbmFsbHksIHRoZSB1bml0IG5hbWUuIE11c3QgcmV0dXJuIGEgbnVtYmVyLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKHggPT4geCAqIDIpIC8vPT4geyBob3VyczogMiwgbWludXRlczogNjAgfVxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIG1pbnV0ZXM6IDMwIH0pLm1hcFVuaXRzKCh4LCB1KSA9PiB1ID09PSBcImhvdXJcIiA/IHggKiAyIDogeCkgLy89PiB7IGhvdXJzOiAyLCBtaW51dGVzOiAzMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbWFwVW5pdHMoZm4pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgcmVzdWx0W2tdID0gYXNOdW1iZXIoZm4odGhpcy52YWx1ZXNba10sIGspKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiByZXN1bHQgfSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCd5ZWFycycpIC8vPT4gMlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHt5ZWFyczogMiwgZGF5czogM30pLmdldCgnbW9udGhzJykgLy89PiAwXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkuZ2V0KCdkYXlzJykgLy89PiAzXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXNbRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1bml0KV07XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGUgdmFsdWVzIG9mIHNwZWNpZmllZCB1bml0cy4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSBhIG1hcHBpbmcgb2YgdW5pdHMgdG8gbnVtYmVyc1xuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcbiAgICogQGV4YW1wbGUgZHVyLnNldCh7IGhvdXJzOiA4LCBtaW51dGVzOiAzMCB9KVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNldCh2YWx1ZXMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBjb25zdCBtaXhlZCA9IHsgLi4udGhpcy52YWx1ZXMsIC4uLm5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpIH07XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBtaXhlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgZHVyLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgY29udmVyc2lvbkFjY3VyYWN5IH0gPSB7fSkge1xuICAgIGNvbnN0IGxvYyA9IHRoaXMubG9jLmNsb25lKHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0gfSksXG4gICAgICBvcHRzID0geyBsb2MgfTtcblxuICAgIGlmIChjb252ZXJzaW9uQWNjdXJhY3kpIHtcbiAgICAgIG9wdHMuY29udmVyc2lvbkFjY3VyYWN5ID0gY29udmVyc2lvbkFjY3VyYWN5O1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZHVyYXRpb24gaW4gdGhlIHNwZWNpZmllZCB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGVzJyBvciAnZGF5cydcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAxfSkuYXMoJ21vbnRocycpIC8vPT4gMTJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7aG91cnM6IDYwfSkuYXMoJ2RheXMnKSAvLz0+IDIuNVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmVkdWNlIHRoaXMgRHVyYXRpb24gdG8gaXRzIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBpbiBpdHMgY3VycmVudCB1bml0cy5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxMiwgbWludXRlczogLTQ1IH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAxMSwgbWludXRlczogMTUgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIG5vcm1hbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHZhbHVlczogdmFscyB9LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEsIHNlY29uZHM6IDMwIH0pLnNoaWZ0VG8oJ21pbnV0ZXMnLCAnbWlsbGlzZWNvbmRzJykudG9PYmplY3QoKSAvLz0+IHsgbWludXRlczogNjAsIG1pbGxpc2Vjb25kczogMzAwMDAgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHNoaWZ0VG8oLi4udW5pdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAodW5pdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1bml0cyA9IHVuaXRzLm1hcCgodSkgPT4gRHVyYXRpb24ubm9ybWFsaXplVW5pdCh1KSk7XG5cbiAgICBjb25zdCBidWlsdCA9IHt9LFxuICAgICAgYWNjdW11bGF0ZWQgPSB7fSxcbiAgICAgIHZhbHMgPSB0aGlzLnRvT2JqZWN0KCk7XG4gICAgbGV0IGxhc3RVbml0O1xuXG4gICAgZm9yIChjb25zdCBrIG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKHVuaXRzLmluZGV4T2YoaykgPj0gMCkge1xuICAgICAgICBsYXN0VW5pdCA9IGs7XG5cbiAgICAgICAgbGV0IG93biA9IDA7XG5cbiAgICAgICAgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG4gICAgICAgIGZvciAoY29uc3QgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgIGFjY3VtdWxhdGVkW2FrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwbHVzIGFueXRoaW5nIHRoYXQncyBhbHJlYWR5IGluIHRoaXMgdW5pdFxuICAgICAgICBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgICBvd24gKz0gdmFsc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSAob3duICogMTAwMCAtIGkgKiAxMDAwKSAvIDEwMDA7XG5cbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG4gICAgICAgIGZvciAoY29uc3QgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG4gICAgICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHNba10pKSB7XG4gICAgICAgIGFjY3VtdWxhdGVkW2tdID0gdmFsc1trXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhbnl0aGluZyBsZWZ0b3ZlciBiZWNvbWVzIHRoZSBkZWNpbWFsIGZvciB0aGUgbGFzdCB1bml0XG4gICAgLy8gbGFzdFVuaXQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIHVuaXRzIGlzIG5vdCBlbXB0eVxuICAgIGZvciAoY29uc3Qga2V5IGluIGFjY3VtdWxhdGVkKSB7XG4gICAgICBpZiAoYWNjdW11bGF0ZWRba2V5XSAhPT0gMCkge1xuICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz1cbiAgICAgICAgICBrZXkgPT09IGxhc3RVbml0ID8gYWNjdW11bGF0ZWRba2V5XSA6IGFjY3VtdWxhdGVkW2tleV0gLyB0aGlzLm1hdHJpeFtsYXN0VW5pdF1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgeyB2YWx1ZXM6IGJ1aWx0IH0sIHRydWUpLm5vcm1hbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbmVnYXRpdmUgb2YgdGhpcyBEdXJhdGlvbi5cbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAxLCBzZWNvbmRzOiAzMCB9KS5uZWdhdGUoKS50b09iamVjdCgpIC8vPT4geyBob3VyczogLTEsIHNlY29uZHM6IC0zMCB9XG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxuICAgKi9cbiAgbmVnYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBuZWdhdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKSkge1xuICAgICAgbmVnYXRlZFtrXSA9IC10aGlzLnZhbHVlc1trXTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdmFsdWVzOiBuZWdhdGVkIH0sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgeWVhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgeWVhcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnllYXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBxdWFydGVycy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMucXVhcnRlcnMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1vbnRocy5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1vbnRocyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2Vla3NcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMud2Vla3MgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRheXMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuZGF5cyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaG91cnMuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgaG91cnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmhvdXJzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaW51dGVzLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbnV0ZXMgfHwgMCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5zZWNvbmRzIHx8IDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLm1pbGxpc2Vjb25kcyB8fCAwIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRHVyYXRpb24gaXMgaW52YWxpZC4gSW52YWxpZCBkdXJhdGlvbnMgYXJlIHJldHVybmVkIGJ5IGRpZmYgb3BlcmF0aW9uc1xuICAgKiBvbiBpbnZhbGlkIERhdGVUaW1lcyBvciBJbnRlcnZhbHMuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEdXJhdGlvbiBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRHVyYXRpb24gaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIER1cmF0aW9ucyBhcmUgZXF1YWwgaWZmIHRoZXkgaGF2ZSB0aGUgc2FtZSB1bml0cyBhbmQgdGhlIHNhbWUgdmFsdWVzIGZvciBlYWNoIHVuaXQuXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcSh2MSwgdjIpIHtcbiAgICAgIC8vIENvbnNpZGVyIDAgYW5kIHVuZGVmaW5lZCBhcyBlcXVhbFxuICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQgfHwgdjEgPT09IDApIHJldHVybiB2MiA9PT0gdW5kZWZpbmVkIHx8IHYyID09PSAwO1xuICAgICAgcmV0dXJuIHYxID09PSB2MjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHUgb2Ygb3JkZXJlZFVuaXRzKSB7XG4gICAgICBpZiAoIWVxKHRoaXMudmFsdWVzW3VdLCBvdGhlci52YWx1ZXNbdV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgRGF0ZVRpbWUsIHsgZnJpZW5kbHlEYXRlVGltZSB9IGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIEludmFsaWRJbnRlcnZhbEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBJbnRlcnZhbFwiO1xuXG4vLyBjaGVja3MgaWYgdGhlIHN0YXJ0IGlzIGVxdWFsIHRvIG9yIGJlZm9yZSB0aGUgZW5kXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0XCIpO1xuICB9IGVsc2UgaWYgKCFlbmQgfHwgIWVuZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXCJtaXNzaW5nIG9yIGludmFsaWQgZW5kXCIpO1xuICB9IGVsc2UgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgcmV0dXJuIEludGVydmFsLmludmFsaWQoXG4gICAgICBcImVuZCBiZWZvcmUgc3RhcnRcIixcbiAgICAgIGBUaGUgZW5kIG9mIGFuIGludGVydmFsIG11c3QgYmUgYWZ0ZXIgaXRzIHN0YXJ0LCBidXQgeW91IGhhZCBzdGFydD0ke3N0YXJ0LnRvSVNPKCl9IGFuZCBlbmQ9JHtlbmQudG9JU08oKX1gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cbiAqXG4gKiBIZXJlIGlzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBtZXRob2RzIGFuZCBnZXR0ZXJzIGluIEludGVydmFsOlxuICpcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhbiBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNmcm9tRGF0ZVRpbWVzfSwge0BsaW5rIEludGVydmFsI2FmdGVyfSwge0BsaW5rIEludGVydmFsI2JlZm9yZX0sIG9yIHtAbGluayBJbnRlcnZhbCNmcm9tSVNPfS5cbiAqICogKipBY2Nlc3NvcnMqKiBVc2Uge0BsaW5rIEludGVydmFsI3N0YXJ0fSBhbmQge0BsaW5rIEludGVydmFsI2VuZH0gdG8gZ2V0IHRoZSBzdGFydCBhbmQgZW5kLlxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBJbnRlcnZhbCNjb3VudH0sIHtAbGluayBJbnRlcnZhbCNsZW5ndGh9LCB7QGxpbmsgSW50ZXJ2YWwjaGFzU2FtZX0sIHtAbGluayBJbnRlcnZhbCNjb250YWluc30sIHtAbGluayBJbnRlcnZhbCNpc0FmdGVyfSwgb3Ige0BsaW5rIEludGVydmFsI2lzQmVmb3JlfS5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqIFRvIGNyZWF0ZSBvdGhlciBJbnRlcnZhbHMgb3V0IG9mIHRoaXMgb25lLCB1c2Uge0BsaW5rIEludGVydmFsI3NldH0sIHtAbGluayBJbnRlcnZhbCNzcGxpdEF0fSwge0BsaW5rIEludGVydmFsI3NwbGl0Qnl9LCB7QGxpbmsgSW50ZXJ2YWwjZGl2aWRlRXF1YWxseX0sIHtAbGluayBJbnRlcnZhbCNtZXJnZX0sIHtAbGluayBJbnRlcnZhbCN4b3J9LCB7QGxpbmsgSW50ZXJ2YWwjdW5pb259LCB7QGxpbmsgSW50ZXJ2YWwjaW50ZXJzZWN0aW9ufSwgb3Ige0BsaW5rIEludGVydmFsI2RpZmZlcmVuY2V9LlxuICogKiAqKkNvbXBhcmlzb24qKiBUbyBjb21wYXJlIHRoaXMgSW50ZXJ2YWwgdG8gYW5vdGhlciBvbmUsIHVzZSB7QGxpbmsgSW50ZXJ2YWwjZXF1YWxzfSwge0BsaW5rIEludGVydmFsI292ZXJsYXBzfSwge0BsaW5rIEludGVydmFsI2FidXRzU3RhcnR9LCB7QGxpbmsgSW50ZXJ2YWwjYWJ1dHNFbmR9LCB7QGxpbmsgSW50ZXJ2YWwjZW5ndWxmc31cbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBJbnRlcnZhbCBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBJbnRlcnZhbCN0b1N0cmluZ30sIHtAbGluayBJbnRlcnZhbCN0b0lTT30sIHtAbGluayBJbnRlcnZhbCN0b0lTT0RhdGV9LCB7QGxpbmsgSW50ZXJ2YWwjdG9JU09UaW1lfSwge0BsaW5rIEludGVydmFsI3RvRm9ybWF0fSwgYW5kIHtAbGluayBJbnRlcnZhbCN0b0R1cmF0aW9ufS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJ2YWwge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucyA9IGNvbmZpZy5zdGFydDtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmUgPSBjb25maWcuZW5kO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGNvbmZpZy5pbnZhbGlkIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pc0x1eG9uSW50ZXJ2YWwgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbnZhbGlkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBJbnRlcnZhbCBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzdGF0aWMgaW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uID0gbnVsbCkge1xuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRJbnRlcnZhbEVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEludGVydmFsKHsgaW52YWxpZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIGNvbnN0IGJ1aWx0U3RhcnQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KSxcbiAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuXG4gICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IHZhbGlkYXRlU3RhcnRFbmQoYnVpbHRTdGFydCwgYnVpbHRFbmQpO1xuXG4gICAgaWYgKHZhbGlkYXRlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIHN0YXJ0OiBidWlsdFN0YXJ0LFxuICAgICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWxpZGF0ZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSW50ZXJ2YWwgZnJvbSBhIHN0YXJ0IERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCB0by5cbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBhZnRlcihzdGFydCwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tRHVyYXRpb25MaWtlKGR1cmF0aW9uKSxcbiAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCk7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQsIGR0LnBsdXMoZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgc3RhdGljIGJlZm9yZShlbmQsIGR1cmF0aW9uKSB7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbiksXG4gICAgICBkdCA9IGZyaWVuZGx5RGF0ZVRpbWUoZW5kKTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdC5taW51cyhkdXIpLCBkdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKiBBY2NlcHRzIGA8c3RhcnQ+LzxlbmQ+YCwgYDxzdGFydD4vPGR1cmF0aW9uPmAsIGFuZCBgPGR1cmF0aW9uPi88ZW5kPmAgZm9ybWF0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZSNmcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24jZnJvbUlTT31cbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNUaW1lX2ludGVydmFsc1xuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICBjb25zdCBbcywgZV0gPSAodGV4dCB8fCBcIlwiKS5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKHMgJiYgZSkge1xuICAgICAgbGV0IHN0YXJ0LCBzdGFydElzVmFsaWQ7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyk7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IHN0YXJ0LmlzVmFsaWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN0YXJ0SXNWYWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgZW5kLCBlbmRJc1ZhbGlkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcbiAgICAgICAgZW5kSXNWYWxpZCA9IGVuZC5pc1ZhbGlkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlbmRJc1ZhbGlkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydElzVmFsaWQgJiYgZW5kSXNWYWxpZCkge1xuICAgICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCwgZW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0SXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYWZ0ZXIoc3RhcnQsIGR1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZW5kSXNWYWxpZCkge1xuICAgICAgICBjb25zdCBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKHMsIG9wdHMpO1xuICAgICAgICBpZiAoZHVyLmlzVmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJ2YWwuYmVmb3JlKGVuZCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSW50ZXJ2YWwuaW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0ludGVydmFsKG8pIHtcbiAgICByZXR1cm4gKG8gJiYgby5pc0x1eG9uSW50ZXJ2YWwpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgc3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMucyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZW5kIG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAdHlwZSB7RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGF0IGxlYXN0IGl0cyBzdGFydCwgbWVhbmluZyB0aGF0IHRoZSBJbnRlcnZhbCBpc24ndCAnYmFja3dhcmRzJy5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkUmVhc29uID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIEludGVydmFsIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIEludGVydmFsIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBJbnRlcnZhbCBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnRlcnZhbCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgKHN1Y2ggYXMgJ2hvdXJzJyBvciAnZGF5cycpIHRvIHJldHVybiB0aGUgbGVuZ3RoIGluLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBsZW5ndGgodW5pdCA9IFwibWlsbGlzZWNvbmRzXCIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0R1cmF0aW9uKC4uLlt1bml0XSkuZ2V0KHVuaXQpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxuICAgKiBVbmxpa2Uge0BsaW5rIEludGVydmFsI2xlbmd0aH0gdGhpcyBjb3VudHMgc2VjdGlvbnMgb2YgdGhlIGNhbGVuZGFyLCBub3QgcGVyaW9kcyBvZiB0aW1lLCBlLmcuIHNwZWNpZnlpbmcgJ2RheSdcbiAgICogYXNrcyAnd2hhdCBkYXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBpbnRlcnZhbD8nLCBub3QgJ2hvdyBtYW55IGRheXMgbG9uZyBpcyB0aGlzIGludGVydmFsPydcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGNvdW50KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBOYU47XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnN0YXJ0LnN0YXJ0T2YodW5pdCksXG4gICAgICBlbmQgPSB0aGlzLmVuZC5zdGFydE9mKHVuaXQpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGVuZC5kaWZmKHN0YXJ0LCB1bml0KS5nZXQodW5pdCkpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGFuZCBlbmQgYXJlIGJvdGggaW4gdGhlIHNhbWUgdW5pdCBvZiB0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZSh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucywgdW5pdCkgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucy52YWx1ZU9mKCkgPT09IHRoaXMuZS52YWx1ZU9mKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIHN0YXJ0IGlzIGFmdGVyIHRoZSBzcGVjaWZpZWQgRGF0ZVRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0FmdGVyKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zID4gZGF0ZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQmVmb3JlKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5lIDw9IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwgY29udGFpbnMgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gZGF0ZVRpbWVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0c1wiIHRoZSBzdGFydCBhbmQvb3IgZW5kIGRhdGVzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSB2YWx1ZXMuc3RhcnQgLSB0aGUgc3RhcnRpbmcgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gdmFsdWVzLmVuZCAtIHRoZSBlbmRpbmcgRGF0ZVRpbWVcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICBzZXQoeyBzdGFydCwgZW5kIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgYXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIERhdGVUaW1lc1xuICAgKiBAcGFyYW0gey4uLkRhdGVUaW1lfSBkYXRlVGltZXMgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNvdW50LlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHNwbGl0QXQoLi4uZGF0ZVRpbWVzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICBjb25zdCBzb3J0ZWQgPSBkYXRlVGltZXNcbiAgICAgICAgLm1hcChmcmllbmRseURhdGVUaW1lKVxuICAgICAgICAuZmlsdGVyKChkKSA9PiB0aGlzLmNvbnRhaW5zKGQpKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpID0gMDtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBjb25zdCBhZGRlZCA9IHNvcnRlZFtpXSB8fCB0aGlzLmUsXG4gICAgICAgIG5leHQgPSArYWRkZWQgPiArdGhpcy5lID8gdGhpcy5lIDogYWRkZWQ7XG4gICAgICByZXN1bHRzLnB1c2goSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBuZXh0KSk7XG4gICAgICBzID0gbmV4dDtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gc21hbGxlciBJbnRlcnZhbHMsIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIExlZnQgb3ZlciB0aW1lIGlzIGdyb3VwZWQgaW50byBhIHNtYWxsZXIgaW50ZXJ2YWxcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3BsaXRCeShkdXJhdGlvbikge1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIWR1ci5pc1ZhbGlkIHx8IGR1ci5hcyhcIm1pbGxpc2Vjb25kc1wiKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCB7IHMgfSA9IHRoaXMsXG4gICAgICBpZHggPSAxLFxuICAgICAgbmV4dDtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnN0YXJ0LnBsdXMoZHVyLm1hcFVuaXRzKCh4KSA9PiB4ICogaWR4KSk7XG4gICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZlBhcnRzIC0gVGhlIG51bWJlciBvZiBJbnRlcnZhbHMgdG8gZGl2aWRlIHRoZSBJbnRlcnZhbCBpbnRvLlxuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIGRpdmlkZUVxdWFsbHkobnVtYmVyT2ZQYXJ0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpIC8gbnVtYmVyT2ZQYXJ0cykuc2xpY2UoMCwgbnVtYmVyT2ZQYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIG92ZXJsYXBzKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZSA+IG90aGVyLnMgJiYgdGhpcy5zIDwgb3RoZXIuZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3MgZW5kIGlzIGFkamFjZW50IHRvIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwncyBzdGFydC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzU3RhcnQob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiArdGhpcy5lID09PSArb3RoZXIucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGFidXRzRW5kKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gK290aGVyLmUgPT09ICt0aGlzLnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBlbmd1bGZzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBlbmd1bGZzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IG90aGVyLnMgJiYgdGhpcy5lID49IG90aGVyLmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgIW90aGVyLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zLmVxdWFscyhvdGhlci5zKSAmJiB0aGlzLmUuZXF1YWxzKG90aGVyLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtYXhpbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtaW5pbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGludGVyc2VjdGlvbiBpcyBlbXB0eSwgbWVhbmluZywgdGhlIGludGVydmFscyBkb24ndCBpbnRlcnNlY3QuXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKi9cbiAgaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IHMgPSB0aGlzLnMgPiBvdGhlci5zID8gdGhpcy5zIDogb3RoZXIucyxcbiAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID49IGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgcmVzdWx0aW5nIEludGVydmFsIGhhcyB0aGUgbWluaW11bSBzdGFydCB0aW1lIGFuZCB0aGUgbWF4aW11bSBlbmQgdGltZSBvZiB0aGUgdHdvIEludGVydmFscy5cbiAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XG4gICAqL1xuICB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBzID0gdGhpcy5zIDwgb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgYW4gYXJyYXkgb2YgSW50ZXJ2YWxzIGludG8gYSBlcXVpdmFsZW50IG1pbmltYWwgc2V0IG9mIEludGVydmFscy5cbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cbiAgICogQHBhcmFtIHtBcnJheX0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIG1lcmdlKGludGVydmFscykge1xuICAgIGNvbnN0IFtmb3VuZCwgZmluYWxdID0gaW50ZXJ2YWxzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5zIC0gYi5zKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKFtzb2ZhciwgY3VycmVudF0sIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGl0ZW1dO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbc29mYXIsIGN1cnJlbnQudW5pb24oaXRlbSldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtbXSwgbnVsbF1cbiAgICAgICk7XG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxuICAgKiBAcGFyYW0ge0FycmF5fSBpbnRlcnZhbHNcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgeG9yKGludGVydmFscykge1xuICAgIGxldCBzdGFydCA9IG51bGwsXG4gICAgICBjdXJyZW50Q291bnQgPSAwO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXSxcbiAgICAgIGVuZHMgPSBpbnRlcnZhbHMubWFwKChpKSA9PiBbXG4gICAgICAgIHsgdGltZTogaS5zLCB0eXBlOiBcInNcIiB9LFxuICAgICAgICB7IHRpbWU6IGkuZSwgdHlwZTogXCJlXCIgfSxcbiAgICAgIF0pLFxuICAgICAgZmxhdHRlbmVkID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi5lbmRzKSxcbiAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KChhLCBiKSA9PiBhLnRpbWUgLSBiLnRpbWUpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGFycikge1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgcmVwcmVzZW50aW5nIHRoZSBzcGFuIG9mIHRpbWUgaW4gdGhpcyBJbnRlcnZhbCB0aGF0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgc3BlY2lmaWVkIEludGVydmFscy5cbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZGlmZmVyZW5jZSguLi5pbnRlcnZhbHMpIHtcbiAgICByZXR1cm4gSW50ZXJ2YWwueG9yKFt0aGlzXS5jb25jYXQoaW50ZXJ2YWxzKSlcbiAgICAgIC5tYXAoKGkpID0+IHRoaXMuaW50ZXJzZWN0aW9uKGkpKVxuICAgICAgLmZpbHRlcigoaSkgPT4gaSAmJiAhaS5pc0VtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnMudG9JU08oKX0gXHUyMDEzICR7dGhpcy5lLnRvSVNPKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU08ob3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPKG9wdHMpfS8ke3RoaXMuZS50b0lTTyhvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkYXRlIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSB0aW1lIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09EYXRlKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRDtcbiAgICByZXR1cm4gYCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aW1lIG9mIHRoaXMgSW50ZXJ2YWwuXG4gICAqIFRoZSBkYXRlIGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBUaGUgc2FtZSBvcHRpb25zIGFzIHtAbGluayBEYXRlVGltZSN0b0lTT31cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0lTT1RpbWUob3B0cyl9LyR7dGhpcy5lLnRvSVNPVGltZShvcHRzKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVGb3JtYXQgLSB0aGUgZm9ybWF0IHN0cmluZy4gVGhpcyBzdHJpbmcgZm9ybWF0cyB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lLiBTZWUge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSBmb3IgZGV0YWlscy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyBcdTIwMTMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0Zvcm1hdChkYXRlRm9ybWF0LCB7IHNlcGFyYXRvciA9IFwiIFx1MjAxMyBcIiB9ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIGAke3RoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KX0ke3NlcGFyYXRvcn0ke3RoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIER1cmF0aW9uIHJlcHJlc2VudGluZyB0aGUgdGltZSBzcGFubmVkIGJ5IHRoaXMgaW50ZXJ2YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDg4NDg5MjU3IH1cbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oWydob3VycycsICdtaW51dGVzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQuODIwOTUgfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ10pLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyNCwgbWludXRlczogMzQsIHNlY29uZHM6IDQ5LjI1NyB9XG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cbiAgICovXG4gIHRvRHVyYXRpb24odW5pdCwgb3B0cykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWRSZWFzb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gbWFwRm4gb24gdGhlIGludGVydmFsIHN0YXJ0IGFuZCBlbmQsIHJldHVybmluZyBhIG5ldyBJbnRlcnZhbCBmcm9tIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1hcEZuXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS5tYXBFbmRwb2ludHMoZW5kcG9pbnQgPT4gZW5kcG9pbnQudG9VVEMoKSlcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikubWFwRW5kcG9pbnRzKGVuZHBvaW50ID0+IGVuZHBvaW50LnBsdXMoeyBob3VyczogMiB9KSlcbiAgICovXG4gIG1hcEVuZHBvaW50cyhtYXBGbikge1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKG1hcEZuKHRoaXMucyksIG1hcEZuKHRoaXMuZSkpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBMb2NhbGUgZnJvbSBcIi4vaW1wbC9sb2NhbGUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcblxuaW1wb3J0IHsgaGFzUmVsYXRpdmUgfSBmcm9tIFwiLi9pbXBsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZvIHtcbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBjb250YWlucyBhIERTVC5cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGhhc0RTVCh6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmUpIHtcbiAgICBjb25zdCBwcm90byA9IERhdGVUaW1lLm5vdygpLnNldFpvbmUoem9uZSkuc2V0KHsgbW9udGg6IDEyIH0pO1xuXG4gICAgcmV0dXJuICF6b25lLmlzVW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHsgbW9udGg6IDYgfSkub2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgem9uZSBpcyBhIHZhbGlkIElBTkEgc3BlY2lmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiBJQU5BWm9uZS5pc1ZhbGlkU3BlY2lmaWVyKHpvbmUpICYmIElBTkFab25lLmlzVmFsaWRab25lKHpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpbnB1dCBpbnRvIGEge0BsaW5rIFpvbmV9IGluc3RhbmNlLlxuICAgKlxuICAgKiAqIElmIGBpbnB1dGAgaXMgYWxyZWFkeSBhIFpvbmUgaW5zdGFuY2UsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogKiBJZiBgaW5wdXRgIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2YWxpZCB0aW1lIHpvbmUgbmFtZSwgYSBab25lIGluc3RhbmNlXG4gICAqICAgd2l0aCB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgcmVmZXIgdG8gYSBrbm93biB0aW1lIHpvbmUsIGEgWm9uZVxuICAgKiAgIGluc3RhbmNlIHdpdGgge0BsaW5rIFpvbmUjaXNWYWxpZH0gPT0gZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0IGlzIGEgbnVtYmVyLCBhIFpvbmUgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGZpeGVkIG9mZnNldFxuICAgKiAgIGluIG1pbnV0ZXMgaXMgcmV0dXJuZWQuXG4gICAqICogSWYgYGlucHV0YCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBkZWZhdWx0IHpvbmUgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV8bnVtYmVyfSBbaW5wdXRdIC0gdGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtab25lfVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVpvbmUoaW5wdXQpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplWm9uZShpbnB1dCwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoKVswXSAvLz0+ICdKYW51YXJ5J1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdudW1lcmljJylbMF0gLy89PiAnMSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ3Nob3J0JywgeyBsb2NhbGU6ICdmci1DQScgfSApWzBdIC8vPT4gJ2phbnYuJ1xuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ1x1MDY2MSdcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ2xvbmcnLCB7IG91dHB1dENhbGVuZGFyOiAnaXNsYW1pYycgfSlbMF0gLy89PiAnUmFiaVx1MDJCQiBJJ1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyBtb250aHMoXG4gICAgbGVuZ3RoID0gXCJsb25nXCIsXG4gICAgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsLCBvdXRwdXRDYWxlbmRhciA9IFwiZ3JlZ29yeVwiIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gKGxvY09iaiB8fCBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikpLm1vbnRocyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgbW9udGggbmFtZXMuXG4gICAqIEZvcm1hdCBtb250aHMgZGlmZmVyIGZyb20gc3RhbmRhbG9uZSBtb250aHMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJbiBzb21lIGxhbmd1YWdlcywgdGhhdFxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXG4gICAqIFNlZSB7QGxpbmsgSW5mbyNtb250aHN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm51bWVyaWNcIiwgXCIyLWRpZ2l0XCIsIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jT2JqPW51bGxdIC0gYW4gZXhpc3RpbmcgbG9jYWxlIG9iamVjdCB0byB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbW9udGhzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCwgb3V0cHV0Q2FsZW5kYXIgPSBcImdyZWdvcnlcIiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpKS5tb250aHMobGVuZ3RoLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVUaW1lRm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSB3ZWVrZGF5IHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibmFycm93XCIsIFwic2hvcnRcIiwgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JylbMF0gLy89PiAnTW9uJ1xuICAgKiBAZXhhbXBsZSBJbmZvLndlZWtkYXlzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0pWzBdIC8vPT4gJ2x1bi4nXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAnXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjJCXHUwNjQ2XHUwNjRBXHUwNjQ2J1xuICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICovXG4gIHN0YXRpYyB3ZWVrZGF5cyhsZW5ndGggPSBcImxvbmdcIiwgeyBsb2NhbGUgPSBudWxsLCBudW1iZXJpbmdTeXN0ZW0gPSBudWxsLCBsb2NPYmogPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiAobG9jT2JqIHx8IExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG51bGwpKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBmb3JtYXQgd2VlayBuYW1lcy5cbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcbiAgICogY2hhbmdlcyB0aGUgc3RyaW5nLlxuICAgKiBTZWUge0BsaW5rIEluZm8jd2Vla2RheXN9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdsb25nJ10gLSB0aGUgbGVuZ3RoIG9mIHRoZSBtb250aCByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT1udWxsXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY09iaj1udWxsXSAtIGFuIGV4aXN0aW5nIGxvY2FsZSBvYmplY3QgdG8gdXNlXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgc3RhdGljIHdlZWtkYXlzRm9ybWF0KFxuICAgIGxlbmd0aCA9IFwibG9uZ1wiLFxuICAgIHsgbG9jYWxlID0gbnVsbCwgbnVtYmVyaW5nU3lzdGVtID0gbnVsbCwgbG9jT2JqID0gbnVsbCB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIChsb2NPYmogfHwgTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgbnVsbCkpLndlZWtkYXlzKGxlbmd0aCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIG1lcmlkaWVtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXG4gICAqIEBleGFtcGxlIEluZm8ubWVyaWRpZW1zKCkgLy89PiBbICdBTScsICdQTScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLm1lcmlkaWVtcyh7IGxvY2FsZTogJ215JyB9KSAvLz0+IFsgJ1x1MTAxNFx1MTAzNlx1MTAxNFx1MTAwMFx1MTAzQScsICdcdTEwMEFcdTEwMTRcdTEwMzEnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgbWVyaWRpZW1zKHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUpLm1lcmlkaWVtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nc2hvcnQnXSAtIHRoZSBsZW5ndGggb2YgdGhlIGVyYSByZXByZXNlbnRhdGlvbiwgc3VjaCBhcyBcInNob3J0XCIgb3IgXCJsb25nXCIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoKSAvLz0+IFsgJ0JDJywgJ0FEJyBdXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygnbG9uZycpIC8vPT4gWyAnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaScgXVxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IEpcdTAwRTlzdXMtQ2hyaXN0JywgJ2Fwclx1MDBFOHMgSlx1MDBFOXN1cy1DaHJpc3QnIF1cbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICBzdGF0aWMgZXJhcyhsZW5ndGggPSBcInNob3J0XCIsIHsgbG9jYWxlID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bGwsIFwiZ3JlZ29yeVwiKS5lcmFzKGxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXG4gICAqIFNvbWUgZmVhdHVyZXMgb2YgTHV4b24gYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGVudmlyb25tZW50cy4gRm9yIGV4YW1wbGUsIG9uIG9sZGVyIGJyb3dzZXJzLCByZWxhdGl2ZSB0aW1lIGZvcm1hdHRpbmcgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBVc2UgdGhpcyBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGlmIHRoYXQncyB0aGUgY2FzZS5cbiAgICogS2V5czpcbiAgICogKiBgcmVsYXRpdmVgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgcmVsYXRpdmUgdGltZSBmb3JtYXR0aW5nXG4gICAqIEBleGFtcGxlIEluZm8uZmVhdHVyZXMoKSAvLz0+IHsgcmVsYXRpdmU6IGZhbHNlIH1cbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGZlYXR1cmVzKCkge1xuICAgIHJldHVybiB7IHJlbGF0aXZlOiBoYXNSZWxhdGl2ZSgpIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4uL2R1cmF0aW9uLmpzXCI7XG5cbmZ1bmN0aW9uIGRheURpZmYoZWFybGllciwgbGF0ZXIpIHtcbiAgY29uc3QgdXRjRGF5U3RhcnQgPSAoZHQpID0+IGR0LnRvVVRDKDAsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKSxcbiAgICBtcyA9IHV0Y0RheVN0YXJ0KGxhdGVyKSAtIHV0Y0RheVN0YXJ0KGVhcmxpZXIpO1xuICByZXR1cm4gTWF0aC5mbG9vcihEdXJhdGlvbi5mcm9tTWlsbGlzKG1zKS5hcyhcImRheXNcIikpO1xufVxuXG5mdW5jdGlvbiBoaWdoT3JkZXJEaWZmcyhjdXJzb3IsIGxhdGVyLCB1bml0cykge1xuICBjb25zdCBkaWZmZXJzID0gW1xuICAgIFtcInllYXJzXCIsIChhLCBiKSA9PiBiLnllYXIgLSBhLnllYXJdLFxuICAgIFtcInF1YXJ0ZXJzXCIsIChhLCBiKSA9PiBiLnF1YXJ0ZXIgLSBhLnF1YXJ0ZXJdLFxuICAgIFtcIm1vbnRoc1wiLCAoYSwgYikgPT4gYi5tb250aCAtIGEubW9udGggKyAoYi55ZWFyIC0gYS55ZWFyKSAqIDEyXSxcbiAgICBbXG4gICAgICBcIndlZWtzXCIsXG4gICAgICAoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBkYXlzID0gZGF5RGlmZihhLCBiKTtcbiAgICAgICAgcmV0dXJuIChkYXlzIC0gKGRheXMgJSA3KSkgLyA3O1xuICAgICAgfSxcbiAgICBdLFxuICAgIFtcImRheXNcIiwgZGF5RGlmZl0sXG4gIF07XG5cbiAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICBsZXQgbG93ZXN0T3JkZXIsIGhpZ2hXYXRlcjtcblxuICBmb3IgKGNvbnN0IFt1bml0LCBkaWZmZXJdIG9mIGRpZmZlcnMpIHtcbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG5cbiAgICAgIGxldCBkZWx0YSA9IGRpZmZlcihjdXJzb3IsIGxhdGVyKTtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSB9KTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIGN1cnNvciA9IGN1cnNvci5wbHVzKHsgW3VuaXRdOiBkZWx0YSAtIDEgfSk7XG4gICAgICAgIGRlbHRhIC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3IgPSBoaWdoV2F0ZXI7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdHNbdW5pdF0gPSBkZWx0YTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2N1cnNvciwgcmVzdWx0cywgaGlnaFdhdGVyLCBsb3dlc3RPcmRlcl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChlYXJsaWVyLCBsYXRlciwgdW5pdHMsIG9wdHMpIHtcbiAgbGV0IFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdID0gaGlnaE9yZGVyRGlmZnMoZWFybGllciwgbGF0ZXIsIHVuaXRzKTtcblxuICBjb25zdCByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcblxuICBjb25zdCBsb3dlck9yZGVyVW5pdHMgPSB1bml0cy5maWx0ZXIoXG4gICAgKHUpID0+IFtcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl0uaW5kZXhPZih1KSA+PSAwXG4gICk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIGhpZ2hXYXRlciA9IGN1cnNvci5wbHVzKHsgW2xvd2VzdE9yZGVyXTogMSB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHJlc3VsdHMsIG9wdHMpO1xuXG4gIGlmIChsb3dlck9yZGVyVW5pdHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tTWlsbGlzKHJlbWFpbmluZ01pbGxpcywgb3B0cylcbiAgICAgIC5zaGlmdFRvKC4uLmxvd2VyT3JkZXJVbml0cylcbiAgICAgIC5wbHVzKGR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH1cbn1cbiIsICJjb25zdCBudW1iZXJpbmdTeXN0ZW1zID0ge1xuICBhcmFiOiBcIltcXHUwNjYwLVxcdTA2NjldXCIsXG4gIGFyYWJleHQ6IFwiW1xcdTA2RjAtXFx1MDZGOV1cIixcbiAgYmFsaTogXCJbXFx1MUI1MC1cXHUxQjU5XVwiLFxuICBiZW5nOiBcIltcXHUwOUU2LVxcdTA5RUZdXCIsXG4gIGRldmE6IFwiW1xcdTA5NjYtXFx1MDk2Rl1cIixcbiAgZnVsbHdpZGU6IFwiW1xcdUZGMTAtXFx1RkYxOV1cIixcbiAgZ3VqcjogXCJbXFx1MEFFNi1cXHUwQUVGXVwiLFxuICBoYW5pZGVjOiBcIltcdTMwMDd8XHU0RTAwfFx1NEU4Q3xcdTRFMDl8XHU1NkRCfFx1NEU5NHxcdTUxNkR8XHU0RTAzfFx1NTE2QnxcdTRFNURdXCIsXG4gIGtobXI6IFwiW1xcdTE3RTAtXFx1MTdFOV1cIixcbiAga25kYTogXCJbXFx1MENFNi1cXHUwQ0VGXVwiLFxuICBsYW9vOiBcIltcXHUwRUQwLVxcdTBFRDldXCIsXG4gIGxpbWI6IFwiW1xcdTE5NDYtXFx1MTk0Rl1cIixcbiAgbWx5bTogXCJbXFx1MEQ2Ni1cXHUwRDZGXVwiLFxuICBtb25nOiBcIltcXHUxODEwLVxcdTE4MTldXCIsXG4gIG15bXI6IFwiW1xcdTEwNDAtXFx1MTA0OV1cIixcbiAgb3J5YTogXCJbXFx1MEI2Ni1cXHUwQjZGXVwiLFxuICB0YW1sZGVjOiBcIltcXHUwQkU2LVxcdTBCRUZdXCIsXG4gIHRlbHU6IFwiW1xcdTBDNjYtXFx1MEM2Rl1cIixcbiAgdGhhaTogXCJbXFx1MEU1MC1cXHUwRTU5XVwiLFxuICB0aWJ0OiBcIltcXHUwRjIwLVxcdTBGMjldXCIsXG4gIGxhdG46IFwiXFxcXGRcIixcbn07XG5cbmNvbnN0IG51bWJlcmluZ1N5c3RlbXNVVEYxNiA9IHtcbiAgYXJhYjogWzE2MzIsIDE2NDFdLFxuICBhcmFiZXh0OiBbMTc3NiwgMTc4NV0sXG4gIGJhbGk6IFs2OTkyLCA3MDAxXSxcbiAgYmVuZzogWzI1MzQsIDI1NDNdLFxuICBkZXZhOiBbMjQwNiwgMjQxNV0sXG4gIGZ1bGx3aWRlOiBbNjUyOTYsIDY1MzAzXSxcbiAgZ3VqcjogWzI3OTAsIDI3OTldLFxuICBraG1yOiBbNjExMiwgNjEyMV0sXG4gIGtuZGE6IFszMzAyLCAzMzExXSxcbiAgbGFvbzogWzM3OTIsIDM4MDFdLFxuICBsaW1iOiBbNjQ3MCwgNjQ3OV0sXG4gIG1seW06IFszNDMwLCAzNDM5XSxcbiAgbW9uZzogWzYxNjAsIDYxNjldLFxuICBteW1yOiBbNDE2MCwgNDE2OV0sXG4gIG9yeWE6IFsyOTE4LCAyOTI3XSxcbiAgdGFtbGRlYzogWzMwNDYsIDMwNTVdLFxuICB0ZWx1OiBbMzE3NCwgMzE4M10sXG4gIHRoYWk6IFszNjY0LCAzNjczXSxcbiAgdGlidDogWzM4NzIsIDM4ODFdLFxufTtcblxuY29uc3QgaGFuaWRlY0NoYXJzID0gbnVtYmVyaW5nU3lzdGVtcy5oYW5pZGVjLnJlcGxhY2UoL1tcXFt8XFxdXS9nLCBcIlwiKS5zcGxpdChcIlwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGlnaXRzKHN0cikge1xuICBsZXQgdmFsdWUgPSBwYXJzZUludChzdHIsIDEwKTtcbiAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgIHZhbHVlID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICBpZiAoc3RyW2ldLnNlYXJjaChudW1iZXJpbmdTeXN0ZW1zLmhhbmlkZWMpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSArPSBoYW5pZGVjQ2hhcnMuaW5kZXhPZihzdHJbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbnVtYmVyaW5nU3lzdGVtc1VURjE2KSB7XG4gICAgICAgICAgY29uc3QgW21pbiwgbWF4XSA9IG51bWJlcmluZ1N5c3RlbXNVVEYxNltrZXldO1xuICAgICAgICAgIGlmIChjb2RlID49IG1pbiAmJiBjb2RlIDw9IG1heCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gY29kZSAtIG1pbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWdpdFJlZ2V4KHsgbnVtYmVyaW5nU3lzdGVtIH0sIGFwcGVuZCA9IFwiXCIpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7bnVtYmVyaW5nU3lzdGVtc1tudW1iZXJpbmdTeXN0ZW0gfHwgXCJsYXRuXCJdfSR7YXBwZW5kfWApO1xufVxuIiwgImltcG9ydCB7IHBhcnNlTWlsbGlzLCBpc1VuZGVmaW5lZCwgdW50cnVuY2F0ZVllYXIsIHNpZ25lZE9mZnNldCwgaGFzT3duUHJvcGVydHkgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgRm9ybWF0dGVyIGZyb20gXCIuL2Zvcm1hdHRlci5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgSUFOQVpvbmUgZnJvbSBcIi4uL3pvbmVzL0lBTkFab25lLmpzXCI7XG5pbXBvcnQgRGF0ZVRpbWUgZnJvbSBcIi4uL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgeyBkaWdpdFJlZ2V4LCBwYXJzZURpZ2l0cyB9IGZyb20gXCIuL2RpZ2l0cy5qc1wiO1xuaW1wb3J0IHsgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmNvbnN0IE1JU1NJTkdfRlRQID0gXCJtaXNzaW5nIEludGwuRGF0ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0cyBzdXBwb3J0XCI7XG5cbmZ1bmN0aW9uIGludFVuaXQocmVnZXgsIHBvc3QgPSAoaSkgPT4gaSkge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbc10pID0+IHBvc3QocGFyc2VEaWdpdHMocykpIH07XG59XG5cbmNvbnN0IE5CU1AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5jb25zdCBzcGFjZU9yTkJTUCA9IGAoIHwke05CU1B9KWA7XG5jb25zdCBzcGFjZU9yTkJTUFJlZ0V4cCA9IG5ldyBSZWdFeHAoc3BhY2VPck5CU1AsIFwiZ1wiKTtcblxuZnVuY3Rpb24gZml4TGlzdFJlZ2V4KHMpIHtcbiAgLy8gbWFrZSBkb3RzIG9wdGlvbmFsIGFuZCBhbHNvIG1ha2UgdGhlbSBsaXRlcmFsXG4gIC8vIG1ha2Ugc3BhY2UgYW5kIG5vbiBicmVha2FibGUgc3BhY2UgY2hhcmFjdGVycyBpbnRlcmNoYW5nZWFibGVcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuL2csIFwiXFxcXC4/XCIpLnJlcGxhY2Uoc3BhY2VPck5CU1BSZWdFeHAsIHNwYWNlT3JOQlNQKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykge1xuICByZXR1cm4gc1xuICAgIC5yZXBsYWNlKC9cXC4vZywgXCJcIikgLy8gaWdub3JlIGRvdHMgdGhhdCB3ZXJlIG1hZGUgb3B0aW9uYWxcbiAgICAucmVwbGFjZShzcGFjZU9yTkJTUFJlZ0V4cCwgXCIgXCIpIC8vIGludGVyY2hhbmdlIHNwYWNlIGFuZCBuYnNwXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9uZU9mKHN0cmluZ3MsIHN0YXJ0SW5kZXgpIHtcbiAgaWYgKHN0cmluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVnZXg6IFJlZ0V4cChzdHJpbmdzLm1hcChmaXhMaXN0UmVnZXgpLmpvaW4oXCJ8XCIpKSxcbiAgICAgIGRlc2VyOiAoW3NdKSA9PlxuICAgICAgICBzdHJpbmdzLmZpbmRJbmRleCgoaSkgPT4gc3RyaXBJbnNlbnNpdGl2aXRpZXMocykgPT09IHN0cmlwSW5zZW5zaXRpdml0aWVzKGkpKSArIHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZzZXQocmVnZXgsIGdyb3Vwcykge1xuICByZXR1cm4geyByZWdleCwgZGVzZXI6IChbLCBoLCBtXSkgPT4gc2lnbmVkT2Zmc2V0KGgsIG0pLCBncm91cHMgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7IHJlZ2V4LCBkZXNlcjogKFtzXSkgPT4gcyB9O1xufVxuXG5mdW5jdGlvbiBlc2NhcGVUb2tlbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcLVxcW1xcXXt9KCkqKz8uLFxcXFxcXF4kfCNcXHNdL2csIFwiXFxcXCQmXCIpO1xufVxuXG5mdW5jdGlvbiB1bml0Rm9yVG9rZW4odG9rZW4sIGxvYykge1xuICBjb25zdCBvbmUgPSBkaWdpdFJlZ2V4KGxvYyksXG4gICAgdHdvID0gZGlnaXRSZWdleChsb2MsIFwiezJ9XCIpLFxuICAgIHRocmVlID0gZGlnaXRSZWdleChsb2MsIFwiezN9XCIpLFxuICAgIGZvdXIgPSBkaWdpdFJlZ2V4KGxvYywgXCJ7NH1cIiksXG4gICAgc2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezZ9XCIpLFxuICAgIG9uZU9yVHdvID0gZGlnaXRSZWdleChsb2MsIFwiezEsMn1cIiksXG4gICAgb25lVG9UaHJlZSA9IGRpZ2l0UmVnZXgobG9jLCBcInsxLDN9XCIpLFxuICAgIG9uZVRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezEsNn1cIiksXG4gICAgb25lVG9OaW5lID0gZGlnaXRSZWdleChsb2MsIFwiezEsOX1cIiksXG4gICAgdHdvVG9Gb3VyID0gZGlnaXRSZWdleChsb2MsIFwiezIsNH1cIiksXG4gICAgZm91clRvU2l4ID0gZGlnaXRSZWdleChsb2MsIFwiezQsNn1cIiksXG4gICAgbGl0ZXJhbCA9ICh0KSA9PiAoeyByZWdleDogUmVnRXhwKGVzY2FwZVRva2VuKHQudmFsKSksIGRlc2VyOiAoW3NdKSA9PiBzLCBsaXRlcmFsOiB0cnVlIH0pLFxuICAgIHVuaXRhdGUgPSAodCkgPT4ge1xuICAgICAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHQudmFsKSB7XG4gICAgICAgIC8vIGVyYVxuICAgICAgICBjYXNlIFwiR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcInNob3J0XCIsIGZhbHNlKSwgMCk7XG4gICAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MuZXJhcyhcImxvbmdcIiwgZmFsc2UpLCAwKTtcbiAgICAgICAgLy8geWVhcnNcbiAgICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1NpeCk7XG4gICAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3b1RvRm91ciwgdW50cnVuY2F0ZVllYXIpO1xuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwieXl5eXlcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChmb3VyVG9TaXgpO1xuICAgICAgICBjYXNlIFwieXl5eXl5XCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQoc2l4KTtcbiAgICAgICAgLy8gbW9udGhzXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwibG9uZ1wiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiTFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2MubW9udGhzKFwic2hvcnRcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJsb25nXCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuICAgICAgICAvLyBkYXRlc1xuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgLy8gb3JkaW5hbHNcbiAgICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcbiAgICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcbiAgICAgICAgLy8gdGltZVxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgICBjYXNlIFwiSFwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcImhoXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcImhcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lVG9UaHJlZSk7XG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgcmV0dXJuIHNpbXBsZShvbmVUb05pbmUpO1xuICAgICAgICBjYXNlIFwidXVcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKG9uZU9yVHdvKTtcbiAgICAgICAgY2FzZSBcInV1dVwiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG4gICAgICAgIC8vIG1lcmlkaWVtXG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tZXJpZGllbXMoKSwgMCk7XG4gICAgICAgIC8vIHdlZWtZZWFyIChrKVxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcbiAgICAgICAgLy8gd2Vla051bWJlciAoVylcbiAgICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG4gICAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAgIC8vIHdlZWtkYXlzXG4gICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgcmV0dXJuIGludFVuaXQob25lKTtcbiAgICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIHJldHVybiBvbmVPZihsb2Mud2Vla2RheXMoXCJsb25nXCIsIHRydWUsIGZhbHNlKSwgMSk7XG4gICAgICAgIC8vIG9mZnNldC96b25lXG4gICAgICAgIGNhc2UgXCJaXCI6XG4gICAgICAgIGNhc2UgXCJaWlwiOlxuICAgICAgICAgIHJldHVybiBvZmZzZXQobmV3IFJlZ0V4cChgKFsrLV0ke29uZU9yVHdvLnNvdXJjZX0pKD86Oigke3R3by5zb3VyY2V9KSk/YCksIDIpO1xuICAgICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgICAgcmV0dXJuIG9mZnNldChuZXcgUmVnRXhwKGAoWystXSR7b25lT3JUd28uc291cmNlfSkoJHt0d28uc291cmNlfSk/YCksIDIpO1xuICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBhcmVcbiAgICAgICAgY2FzZSBcInpcIjpcbiAgICAgICAgICByZXR1cm4gc2ltcGxlKC9bYS16XystL117MSwyNTZ9Py9pKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gbGl0ZXJhbCh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gIGNvbnN0IHVuaXQgPSB1bml0YXRlKHRva2VuKSB8fCB7XG4gICAgaW52YWxpZFJlYXNvbjogTUlTU0lOR19GVFAsXG4gIH07XG5cbiAgdW5pdC50b2tlbiA9IHRva2VuO1xuXG4gIHJldHVybiB1bml0O1xufVxuXG5jb25zdCBwYXJ0VHlwZVN0eWxlVG9Ub2tlblZhbCA9IHtcbiAgeWVhcjoge1xuICAgIFwiMi1kaWdpdFwiOiBcInl5XCIsXG4gICAgbnVtZXJpYzogXCJ5eXl5eVwiLFxuICB9LFxuICBtb250aDoge1xuICAgIG51bWVyaWM6IFwiTVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIk1NXCIsXG4gICAgc2hvcnQ6IFwiTU1NXCIsXG4gICAgbG9uZzogXCJNTU1NXCIsXG4gIH0sXG4gIGRheToge1xuICAgIG51bWVyaWM6IFwiZFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImRkXCIsXG4gIH0sXG4gIHdlZWtkYXk6IHtcbiAgICBzaG9ydDogXCJFRUVcIixcbiAgICBsb25nOiBcIkVFRUVcIixcbiAgfSxcbiAgZGF5cGVyaW9kOiBcImFcIixcbiAgZGF5UGVyaW9kOiBcImFcIixcbiAgaG91cjoge1xuICAgIG51bWVyaWM6IFwiaFwiLFxuICAgIFwiMi1kaWdpdFwiOiBcImhoXCIsXG4gIH0sXG4gIG1pbnV0ZToge1xuICAgIG51bWVyaWM6IFwibVwiLFxuICAgIFwiMi1kaWdpdFwiOiBcIm1tXCIsXG4gIH0sXG4gIHNlY29uZDoge1xuICAgIG51bWVyaWM6IFwic1wiLFxuICAgIFwiMi1kaWdpdFwiOiBcInNzXCIsXG4gIH0sXG59O1xuXG5mdW5jdGlvbiB0b2tlbkZvclBhcnQocGFydCwgbG9jYWxlLCBmb3JtYXRPcHRzKSB7XG4gIGNvbnN0IHsgdHlwZSwgdmFsdWUgfSA9IHBhcnQ7XG5cbiAgaWYgKHR5cGUgPT09IFwibGl0ZXJhbFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IHRydWUsXG4gICAgICB2YWw6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IGZvcm1hdE9wdHNbdHlwZV07XG5cbiAgbGV0IHZhbCA9IHBhcnRUeXBlU3R5bGVUb1Rva2VuVmFsW3R5cGVdO1xuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikge1xuICAgIHZhbCA9IHZhbFtzdHlsZV07XG4gIH1cblxuICBpZiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpdGVyYWw6IGZhbHNlLFxuICAgICAgdmFsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlZ2V4KHVuaXRzKSB7XG4gIGNvbnN0IHJlID0gdW5pdHMubWFwKCh1KSA9PiB1LnJlZ2V4KS5yZWR1Y2UoKGYsIHIpID0+IGAke2Z9KCR7ci5zb3VyY2V9KWAsIFwiXCIpO1xuICByZXR1cm4gW2BeJHtyZX0kYCwgdW5pdHNdO1xufVxuXG5mdW5jdGlvbiBtYXRjaChpbnB1dCwgcmVnZXgsIGhhbmRsZXJzKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBjb25zdCBhbGwgPSB7fTtcbiAgICBsZXQgbWF0Y2hJbmRleCA9IDE7XG4gICAgZm9yIChjb25zdCBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkoaGFuZGxlcnMsIGkpKSB7XG4gICAgICAgIGNvbnN0IGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICBncm91cHMgPSBoLmdyb3VwcyA/IGguZ3JvdXBzICsgMSA6IDE7XG4gICAgICAgIGlmICghaC5saXRlcmFsICYmIGgudG9rZW4pIHtcbiAgICAgICAgICBhbGxbaC50b2tlbi52YWxbMF1dID0gaC5kZXNlcihtYXRjaGVzLnNsaWNlKG1hdGNoSW5kZXgsIG1hdGNoSW5kZXggKyBncm91cHMpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFttYXRjaGVzLCBhbGxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbbWF0Y2hlcywge31dO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lRnJvbU1hdGNoZXMobWF0Y2hlcykge1xuICBjb25zdCB0b0ZpZWxkID0gKHRva2VuKSA9PiB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIlNcIjpcbiAgICAgICAgcmV0dXJuIFwibWlsbGlzZWNvbmRcIjtcbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIFwibWludXRlXCI7XG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gXCJvcmRpbmFsXCI7XG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIFwibW9udGhcIjtcbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiY1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrZGF5XCI7XG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrTnVtYmVyXCI7XG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIFwicXVhcnRlclwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGxldCB6b25lID0gbnVsbDtcbiAgbGV0IHNwZWNpZmljT2Zmc2V0O1xuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMueikpIHtcbiAgICB6b25lID0gSUFOQVpvbmUuY3JlYXRlKG1hdGNoZXMueik7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuWikpIHtcbiAgICBpZiAoIXpvbmUpIHtcbiAgICAgIHpvbmUgPSBuZXcgRml4ZWRPZmZzZXRab25lKG1hdGNoZXMuWik7XG4gICAgfVxuICAgIHNwZWNpZmljT2Zmc2V0ID0gbWF0Y2hlcy5aO1xuICB9XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLnEpKSB7XG4gICAgbWF0Y2hlcy5NID0gKG1hdGNoZXMucSAtIDEpICogMyArIDE7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMuaCkpIHtcbiAgICBpZiAobWF0Y2hlcy5oIDwgMTIgJiYgbWF0Y2hlcy5hID09PSAxKSB7XG4gICAgICBtYXRjaGVzLmggKz0gMTI7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzLmggPT09IDEyICYmIG1hdGNoZXMuYSA9PT0gMCkge1xuICAgICAgbWF0Y2hlcy5oID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAobWF0Y2hlcy5HID09PSAwICYmIG1hdGNoZXMueSkge1xuICAgIG1hdGNoZXMueSA9IC1tYXRjaGVzLnk7XG4gIH1cblxuICBpZiAoIWlzVW5kZWZpbmVkKG1hdGNoZXMudSkpIHtcbiAgICBtYXRjaGVzLlMgPSBwYXJzZU1pbGxpcyhtYXRjaGVzLnUpO1xuICB9XG5cbiAgY29uc3QgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZSgociwgaykgPT4ge1xuICAgIGNvbnN0IGYgPSB0b0ZpZWxkKGspO1xuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuXG4gIHJldHVybiBbdmFscywgem9uZSwgc3BlY2lmaWNPZmZzZXRdO1xufVxuXG5sZXQgZHVtbXlEYXRlVGltZUNhY2hlID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0RHVtbXlEYXRlVGltZSgpIHtcbiAgaWYgKCFkdW1teURhdGVUaW1lQ2FjaGUpIHtcbiAgICBkdW1teURhdGVUaW1lQ2FjaGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKDE1NTU1NTU1NTU1NTUpO1xuICB9XG5cbiAgcmV0dXJuIGR1bW15RGF0ZVRpbWVDYWNoZTtcbn1cblxuZnVuY3Rpb24gbWF5YmVFeHBhbmRNYWNyb1Rva2VuKHRva2VuLCBsb2NhbGUpIHtcbiAgaWYgKHRva2VuLmxpdGVyYWwpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXRPcHRzID0gRm9ybWF0dGVyLm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHModG9rZW4udmFsKTtcblxuICBpZiAoIWZvcm1hdE9wdHMpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXIgPSBGb3JtYXR0ZXIuY3JlYXRlKGxvY2FsZSwgZm9ybWF0T3B0cyk7XG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdERhdGVUaW1lUGFydHMoZ2V0RHVtbXlEYXRlVGltZSgpKTtcblxuICBjb25zdCB0b2tlbnMgPSBwYXJ0cy5tYXAoKHApID0+IHRva2VuRm9yUGFydChwLCBsb2NhbGUsIGZvcm1hdE9wdHMpKTtcblxuICBpZiAodG9rZW5zLmluY2x1ZGVzKHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBleHBhbmRNYWNyb1Rva2Vucyh0b2tlbnMsIGxvY2FsZSkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50b2tlbnMubWFwKCh0KSA9PiBtYXliZUV4cGFuZE1hY3JvVG9rZW4odCwgbG9jYWxlKSkpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB0b2tlbnMgPSBleHBhbmRNYWNyb1Rva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm9ybWF0KSwgbG9jYWxlKSxcbiAgICB1bml0cyA9IHRva2Vucy5tYXAoKHQpID0+IHVuaXRGb3JUb2tlbih0LCBsb2NhbGUpKSxcbiAgICBkaXNxdWFsaWZ5aW5nVW5pdCA9IHVuaXRzLmZpbmQoKHQpID0+IHQuaW52YWxpZFJlYXNvbik7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvbiB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtyZWdleFN0cmluZywgaGFuZGxlcnNdID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICByZWdleCA9IFJlZ0V4cChyZWdleFN0cmluZywgXCJpXCIpLFxuICAgICAgW3Jhd01hdGNoZXMsIG1hdGNoZXNdID0gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycyksXG4gICAgICBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldF0gPSBtYXRjaGVzXG4gICAgICAgID8gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKVxuICAgICAgICA6IFtudWxsLCBudWxsLCB1bmRlZmluZWRdO1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eShtYXRjaGVzLCBcImFcIikgJiYgaGFzT3duUHJvcGVydHkobWF0Y2hlcywgXCJIXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXRcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5wdXQsIHRva2VucywgcmVnZXgsIHJhd01hdGNoZXMsIG1hdGNoZXMsIHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICBjb25zdCB7IHJlc3VsdCwgem9uZSwgc3BlY2lmaWNPZmZzZXQsIGludmFsaWRSZWFzb24gfSA9IGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCk7XG4gIHJldHVybiBbcmVzdWx0LCB6b25lLCBzcGVjaWZpY09mZnNldCwgaW52YWxpZFJlYXNvbl07XG59XG4iLCAiaW1wb3J0IHtcbiAgaW50ZWdlckJldHdlZW4sXG4gIGlzTGVhcFllYXIsXG4gIHRpbWVPYmplY3QsXG4gIGRheXNJblllYXIsXG4gIGRheXNJbk1vbnRoLFxuICB3ZWVrc0luV2Vla1llYXIsXG4gIGlzSW50ZWdlcixcbn0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuaW1wb3J0IEludmFsaWQgZnJvbSBcIi4vaW52YWxpZC5qc1wiO1xuXG5jb25zdCBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgbGVhcExhZGRlciA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV07XG5cbmZ1bmN0aW9uIHVuaXRPdXRPZlJhbmdlKHVuaXQsIHZhbHVlKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcbiAgICBcInVuaXQgb3V0IG9mIHJhbmdlXCIsXG4gICAgYHlvdSBzcGVjaWZpZWQgJHt2YWx1ZX0gKG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9KSBhcyBhICR7dW5pdH0sIHdoaWNoIGlzIGludmFsaWRgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRheU9mV2Vlayh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIGNvbnN0IGpzID0gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGggLSAxLCBkYXkpKS5nZXRVVENEYXkoKTtcbiAgcmV0dXJuIGpzID09PSAwID8gNyA6IGpzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3JkaW5hbCh5ZWFyLCBtb250aCwgZGF5KSB7XG4gIHJldHVybiBkYXkgKyAoaXNMZWFwWWVhcih5ZWFyKSA/IGxlYXBMYWRkZXIgOiBub25MZWFwTGFkZGVyKVttb250aCAtIDFdO1xufVxuXG5mdW5jdGlvbiB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpIHtcbiAgY29uc3QgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgbW9udGgwID0gdGFibGUuZmluZEluZGV4KChpKSA9PiBpIDwgb3JkaW5hbCksXG4gICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7IG1vbnRoOiBtb250aDAgKyAxLCBkYXkgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBncmVnb3JpYW5Ub1dlZWsoZ3JlZ09iaikge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdPYmosXG4gICAgb3JkaW5hbCA9IGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpLFxuICAgIHdlZWtkYXkgPSBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSk7XG5cbiAgbGV0IHdlZWtOdW1iZXIgPSBNYXRoLmZsb29yKChvcmRpbmFsIC0gd2Vla2RheSArIDEwKSAvIDcpLFxuICAgIHdlZWtZZWFyO1xuXG4gIGlmICh3ZWVrTnVtYmVyIDwgMSkge1xuICAgIHdlZWtZZWFyID0geWVhciAtIDE7XG4gICAgd2Vla051bWJlciA9IHdlZWtzSW5XZWVrWWVhcih3ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAod2Vla051bWJlciA+IHdlZWtzSW5XZWVrWWVhcih5ZWFyKSkge1xuICAgIHdlZWtZZWFyID0geWVhciArIDE7XG4gICAgd2Vla051bWJlciA9IDE7XG4gIH0gZWxzZSB7XG4gICAgd2Vla1llYXIgPSB5ZWFyO1xuICB9XG5cbiAgcmV0dXJuIHsgd2Vla1llYXIsIHdlZWtOdW1iZXIsIHdlZWtkYXksIC4uLnRpbWVPYmplY3QoZ3JlZ09iaikgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlZWtUb0dyZWdvcmlhbih3ZWVrRGF0YSkge1xuICBjb25zdCB7IHdlZWtZZWFyLCB3ZWVrTnVtYmVyLCB3ZWVrZGF5IH0gPSB3ZWVrRGF0YSxcbiAgICB3ZWVrZGF5T2ZKYW40ID0gZGF5T2ZXZWVrKHdlZWtZZWFyLCAxLCA0KSxcbiAgICB5ZWFySW5EYXlzID0gZGF5c0luWWVhcih3ZWVrWWVhcik7XG5cbiAgbGV0IG9yZGluYWwgPSB3ZWVrTnVtYmVyICogNyArIHdlZWtkYXkgLSB3ZWVrZGF5T2ZKYW40IC0gMyxcbiAgICB5ZWFyO1xuXG4gIGlmIChvcmRpbmFsIDwgMSkge1xuICAgIHllYXIgPSB3ZWVrWWVhciAtIDE7XG4gICAgb3JkaW5hbCArPSBkYXlzSW5ZZWFyKHllYXIpO1xuICB9IGVsc2UgaWYgKG9yZGluYWwgPiB5ZWFySW5EYXlzKSB7XG4gICAgeWVhciA9IHdlZWtZZWFyICsgMTtcbiAgICBvcmRpbmFsIC09IGRheXNJblllYXIod2Vla1llYXIpO1xuICB9IGVsc2Uge1xuICAgIHllYXIgPSB3ZWVrWWVhcjtcbiAgfVxuXG4gIGNvbnN0IHsgbW9udGgsIGRheSB9ID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKTtcbiAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSwgLi4udGltZU9iamVjdCh3ZWVrRGF0YSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyZWdvcmlhblRvT3JkaW5hbChncmVnRGF0YSkge1xuICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGdyZWdEYXRhO1xuICBjb25zdCBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiB7IHllYXIsIG9yZGluYWwsIC4uLnRpbWVPYmplY3QoZ3JlZ0RhdGEpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsVG9HcmVnb3JpYW4ob3JkaW5hbERhdGEpIHtcbiAgY29uc3QgeyB5ZWFyLCBvcmRpbmFsIH0gPSBvcmRpbmFsRGF0YTtcbiAgY29uc3QgeyBtb250aCwgZGF5IH0gPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpO1xuICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5LCAuLi50aW1lT2JqZWN0KG9yZGluYWxEYXRhKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICBjb25zdCB2YWxpZFllYXIgPSBpc0ludGVnZXIob2JqLndlZWtZZWFyKSxcbiAgICB2YWxpZFdlZWsgPSBpbnRlZ2VyQmV0d2VlbihvYmoud2Vla051bWJlciwgMSwgd2Vla3NJbldlZWtZZWFyKG9iai53ZWVrWWVhcikpLFxuICAgIHZhbGlkV2Vla2RheSA9IGludGVnZXJCZXR3ZWVuKG9iai53ZWVrZGF5LCAxLCA3KTtcblxuICBpZiAoIXZhbGlkWWVhcikge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtZZWFyXCIsIG9iai53ZWVrWWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vlaykge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtcIiwgb2JqLndlZWspO1xuICB9IGVsc2UgaWYgKCF2YWxpZFdlZWtkYXkpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ3ZWVrZGF5XCIsIG9iai53ZWVrZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRPcmRpbmFsRGF0YShvYmopIHtcbiAgY29uc3QgdmFsaWRZZWFyID0gaXNJbnRlZ2VyKG9iai55ZWFyKSxcbiAgICB2YWxpZE9yZGluYWwgPSBpbnRlZ2VyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIGNvbnN0IHZhbGlkWWVhciA9IGlzSW50ZWdlcihvYmoueWVhciksXG4gICAgdmFsaWRNb250aCA9IGludGVnZXJCZXR3ZWVuKG9iai5tb250aCwgMSwgMTIpLFxuICAgIHZhbGlkRGF5ID0gaW50ZWdlckJldHdlZW4ob2JqLmRheSwgMSwgZGF5c0luTW9udGgob2JqLnllYXIsIG9iai5tb250aCkpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTW9udGgpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtb250aFwiLCBvYmoubW9udGgpO1xuICB9IGVsc2UgaWYgKCF2YWxpZERheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcImRheVwiLCBvYmouZGF5KTtcbiAgfSBlbHNlIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludmFsaWRUaW1lRGF0YShvYmopIHtcbiAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQgfSA9IG9iajtcbiAgY29uc3QgdmFsaWRIb3VyID1cbiAgICAgIGludGVnZXJCZXR3ZWVuKGhvdXIsIDAsIDIzKSB8fFxuICAgICAgKGhvdXIgPT09IDI0ICYmIG1pbnV0ZSA9PT0gMCAmJiBzZWNvbmQgPT09IDAgJiYgbWlsbGlzZWNvbmQgPT09IDApLFxuICAgIHZhbGlkTWludXRlID0gaW50ZWdlckJldHdlZW4obWludXRlLCAwLCA1OSksXG4gICAgdmFsaWRTZWNvbmQgPSBpbnRlZ2VyQmV0d2VlbihzZWNvbmQsIDAsIDU5KSxcbiAgICB2YWxpZE1pbGxpc2Vjb25kID0gaW50ZWdlckJldHdlZW4obWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIGhvdXIpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbnV0ZSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICB9IGVsc2UgaWYgKCF2YWxpZFNlY29uZCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcInNlY29uZFwiLCBzZWNvbmQpO1xuICB9IGVsc2UgaWYgKCF2YWxpZE1pbGxpc2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwibWlsbGlzZWNvbmRcIiwgbWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCBEdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IEludGVydmFsIGZyb20gXCIuL2ludGVydmFsLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCBJbmZvIGZyb20gXCIuL2luZm8uanNcIjtcbmltcG9ydCBGb3JtYXR0ZXIgZnJvbSBcIi4vaW1wbC9mb3JtYXR0ZXIuanNcIjtcbmltcG9ydCBGaXhlZE9mZnNldFpvbmUgZnJvbSBcIi4vem9uZXMvZml4ZWRPZmZzZXRab25lLmpzXCI7XG5pbXBvcnQgTG9jYWxlIGZyb20gXCIuL2ltcGwvbG9jYWxlLmpzXCI7XG5pbXBvcnQge1xuICBpc1VuZGVmaW5lZCxcbiAgbWF5YmVBcnJheSxcbiAgaXNEYXRlLFxuICBpc051bWJlcixcbiAgYmVzdEJ5LFxuICBkYXlzSW5Nb250aCxcbiAgZGF5c0luWWVhcixcbiAgaXNMZWFwWWVhcixcbiAgd2Vla3NJbldlZWtZZWFyLFxuICBub3JtYWxpemVPYmplY3QsXG4gIHJvdW5kVG8sXG4gIG9ialRvTG9jYWxUUyxcbiAgcGFkU3RhcnQsXG59IGZyb20gXCIuL2ltcGwvdXRpbC5qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplWm9uZSB9IGZyb20gXCIuL2ltcGwvem9uZVV0aWwuanNcIjtcbmltcG9ydCBkaWZmIGZyb20gXCIuL2ltcGwvZGlmZi5qc1wiO1xuaW1wb3J0IHsgcGFyc2VSRkMyODIyRGF0ZSwgcGFyc2VJU09EYXRlLCBwYXJzZUhUVFBEYXRlLCBwYXJzZVNRTCB9IGZyb20gXCIuL2ltcGwvcmVnZXhQYXJzZXIuanNcIjtcbmltcG9ydCB7IHBhcnNlRnJvbVRva2VucywgZXhwbGFpbkZyb21Ub2tlbnMgfSBmcm9tIFwiLi9pbXBsL3Rva2VuUGFyc2VyLmpzXCI7XG5pbXBvcnQge1xuICBncmVnb3JpYW5Ub1dlZWssXG4gIHdlZWtUb0dyZWdvcmlhbixcbiAgZ3JlZ29yaWFuVG9PcmRpbmFsLFxuICBvcmRpbmFsVG9HcmVnb3JpYW4sXG4gIGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhLFxuICBoYXNJbnZhbGlkV2Vla0RhdGEsXG4gIGhhc0ludmFsaWRPcmRpbmFsRGF0YSxcbiAgaGFzSW52YWxpZFRpbWVEYXRhLFxufSBmcm9tIFwiLi9pbXBsL2NvbnZlcnNpb25zLmpzXCI7XG5pbXBvcnQgKiBhcyBGb3JtYXRzIGZyb20gXCIuL2ltcGwvZm9ybWF0cy5qc1wiO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yLFxuICBJbnZhbGlkVW5pdEVycm9yLFxuICBJbnZhbGlkRGF0ZVRpbWVFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgSW52YWxpZCBmcm9tIFwiLi9pbXBsL2ludmFsaWQuanNcIjtcblxuY29uc3QgSU5WQUxJRCA9IFwiSW52YWxpZCBEYXRlVGltZVwiO1xuY29uc3QgTUFYX0RBVEUgPSA4LjY0ZTE1O1xuXG5mdW5jdGlvbiB1bnN1cHBvcnRlZFpvbmUoem9uZSkge1xuICByZXR1cm4gbmV3IEludmFsaWQoXCJ1bnN1cHBvcnRlZCB6b25lXCIsIGB0aGUgem9uZSBcIiR7em9uZS5uYW1lfVwiIGlzIG5vdCBzdXBwb3J0ZWRgKTtcbn1cblxuLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcbmZ1bmN0aW9uIHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEoZHQpIHtcbiAgaWYgKGR0LndlZWtEYXRhID09PSBudWxsKSB7XG4gICAgZHQud2Vla0RhdGEgPSBncmVnb3JpYW5Ub1dlZWsoZHQuYyk7XG4gIH1cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufVxuXG4vLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBjbG9uZShpbnN0LCBhbHRzKSB7XG4gIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgdHM6IGluc3QudHMsXG4gICAgem9uZTogaW5zdC56b25lLFxuICAgIGM6IGluc3QuYyxcbiAgICBvOiBpbnN0Lm8sXG4gICAgbG9jOiBpbnN0LmxvYyxcbiAgICBpbnZhbGlkOiBpbnN0LmludmFsaWQsXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyAuLi5jdXJyZW50LCAuLi5hbHRzLCBvbGQ6IGN1cnJlbnQgfSk7XG59XG5cbi8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcbmZ1bmN0aW9uIGZpeE9mZnNldChsb2NhbFRTLCBvLCB0eikge1xuICAvLyBPdXIgVVRDIHRpbWUgaXMganVzdCBhIGd1ZXNzIGJlY2F1c2Ugb3VyIG9mZnNldCBpcyBqdXN0IGEgZ3Vlc3NcbiAgbGV0IHV0Y0d1ZXNzID0gbG9jYWxUUyAtIG8gKiA2MCAqIDEwMDA7XG5cbiAgLy8gVGVzdCB3aGV0aGVyIHRoZSB6b25lIG1hdGNoZXMgdGhlIG9mZnNldCBmb3IgdGhpcyB0c1xuICBjb25zdCBvMiA9IHR6Lm9mZnNldCh1dGNHdWVzcyk7XG5cbiAgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG4gIGlmIChvID09PSBvMikge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG9dO1xuICB9XG5cbiAgLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcbiAgdXRjR3Vlc3MgLT0gKG8yIC0gbykgKiA2MCAqIDEwMDA7XG5cbiAgLy8gSWYgdGhhdCBnaXZlcyB1cyB0aGUgbG9jYWwgdGltZSB3ZSB3YW50LCB3ZSdyZSBkb25lXG4gIGNvbnN0IG8zID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTtcbiAgaWYgKG8yID09PSBvMykge1xuICAgIHJldHVybiBbdXRjR3Vlc3MsIG8yXTtcbiAgfVxuXG4gIC8vIElmIGl0J3MgZGlmZmVyZW50LCB3ZSdyZSBpbiBhIGhvbGUgdGltZS4gVGhlIG9mZnNldCBoYXMgY2hhbmdlZCwgYnV0IHRoZSB3ZSBkb24ndCBhZGp1c3QgdGhlIHRpbWVcbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59XG5cbi8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5mdW5jdGlvbiB0c1RvT2JqKHRzLCBvZmZzZXQpIHtcbiAgdHMgKz0gb2Zmc2V0ICogNjAgKiAxMDAwO1xuXG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh0cyk7XG5cbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBkLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgbW9udGg6IGQuZ2V0VVRDTW9udGgoKSArIDEsXG4gICAgZGF5OiBkLmdldFVUQ0RhdGUoKSxcbiAgICBob3VyOiBkLmdldFVUQ0hvdXJzKCksXG4gICAgbWludXRlOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IGQuZ2V0VVRDU2Vjb25kcygpLFxuICAgIG1pbGxpc2Vjb25kOiBkLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICB9O1xufVxuXG4vLyBjb252ZXJ0IGEgY2FsZW5kYXIgb2JqZWN0IHRvIGEgZXBvY2ggdGltZXN0YW1wXG5mdW5jdGlvbiBvYmpUb1RTKG9iaiwgb2Zmc2V0LCB6b25lKSB7XG4gIHJldHVybiBmaXhPZmZzZXQob2JqVG9Mb2NhbFRTKG9iaiksIG9mZnNldCwgem9uZSk7XG59XG5cbi8vIGNyZWF0ZSBhIG5ldyBEVCBpbnN0YW5jZSBieSBhZGRpbmcgYSBkdXJhdGlvbiwgYWRqdXN0aW5nIGZvciBEU1RzXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICBjb25zdCBvUHJlID0gaW5zdC5vLFxuICAgIHllYXIgPSBpbnN0LmMueWVhciArIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICBtb250aCA9IGluc3QuYy5tb250aCArIE1hdGgudHJ1bmMoZHVyLm1vbnRocykgKyBNYXRoLnRydW5jKGR1ci5xdWFydGVycykgKiAzLFxuICAgIGMgPSB7XG4gICAgICAuLi5pbnN0LmMsXG4gICAgICB5ZWFyLFxuICAgICAgbW9udGgsXG4gICAgICBkYXk6XG4gICAgICAgIE1hdGgubWluKGluc3QuYy5kYXksIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSkgK1xuICAgICAgICBNYXRoLnRydW5jKGR1ci5kYXlzKSArXG4gICAgICAgIE1hdGgudHJ1bmMoZHVyLndlZWtzKSAqIDcsXG4gICAgfSxcbiAgICBtaWxsaXNUb0FkZCA9IER1cmF0aW9uLmZyb21PYmplY3Qoe1xuICAgICAgeWVhcnM6IGR1ci55ZWFycyAtIE1hdGgudHJ1bmMoZHVyLnllYXJzKSxcbiAgICAgIHF1YXJ0ZXJzOiBkdXIucXVhcnRlcnMgLSBNYXRoLnRydW5jKGR1ci5xdWFydGVycyksXG4gICAgICBtb250aHM6IGR1ci5tb250aHMgLSBNYXRoLnRydW5jKGR1ci5tb250aHMpLFxuICAgICAgd2Vla3M6IGR1ci53ZWVrcyAtIE1hdGgudHJ1bmMoZHVyLndlZWtzKSxcbiAgICAgIGRheXM6IGR1ci5kYXlzIC0gTWF0aC50cnVuYyhkdXIuZGF5cyksXG4gICAgICBob3VyczogZHVyLmhvdXJzLFxuICAgICAgbWludXRlczogZHVyLm1pbnV0ZXMsXG4gICAgICBzZWNvbmRzOiBkdXIuc2Vjb25kcyxcbiAgICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kcyxcbiAgICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICBsb2NhbFRTID0gb2JqVG9Mb2NhbFRTKGMpO1xuXG4gIGxldCBbdHMsIG9dID0gZml4T2Zmc2V0KGxvY2FsVFMsIG9QcmUsIGluc3Quem9uZSk7XG5cbiAgaWYgKG1pbGxpc1RvQWRkICE9PSAwKSB7XG4gICAgdHMgKz0gbWlsbGlzVG9BZGQ7XG4gICAgLy8gdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIG9mZnNldCBieSBnb2luZyBvdmVyIGEgRFNULCBidXQgd2Ugd2FudCB0byBrZWVwIHRoZSB0cyB0aGUgc2FtZVxuICAgIG8gPSBpbnN0LnpvbmUub2Zmc2V0KHRzKTtcbiAgfVxuXG4gIHJldHVybiB7IHRzLCBvIH07XG59XG5cbi8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuZnVuY3Rpb24gcGFyc2VEYXRhVG9EYXRlVGltZShwYXJzZWQsIHBhcnNlZFpvbmUsIG9wdHMsIGZvcm1hdCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpIHtcbiAgY29uc3QgeyBzZXRab25lLCB6b25lIH0gPSBvcHRzO1xuICBpZiAocGFyc2VkICYmIE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoICE9PSAwKSB7XG4gICAgY29uc3QgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgaW5zdCA9IERhdGVUaW1lLmZyb21PYmplY3QocGFyc2VkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHpvbmU6IGludGVycHJldGF0aW9uWm9uZSxcbiAgICAgICAgc3BlY2lmaWNPZmZzZXQsXG4gICAgICB9KTtcbiAgICByZXR1cm4gc2V0Wm9uZSA/IGluc3QgOiBpbnN0LnNldFpvbmUoem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoXG4gICAgICBuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgYHRoZSBpbnB1dCBcIiR7dGV4dH1cIiBjYW4ndCBiZSBwYXJzZWQgYXMgJHtmb3JtYXR9YClcbiAgICApO1xuICB9XG59XG5cbi8vIGlmIHlvdSB3YW50IHRvIG91dHB1dCBhIHRlY2huaWNhbCBmb3JtYXQgKGUuZy4gUkZDIDI4MjIpLCB0aGlzIGhlbHBlclxuLy8gaGVscHMgaGFuZGxlIHRoZSBkZXRhaWxzXG5mdW5jdGlvbiB0b1RlY2hGb3JtYXQoZHQsIGZvcm1hdCwgYWxsb3daID0gdHJ1ZSkge1xuICByZXR1cm4gZHQuaXNWYWxpZFxuICAgID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICAgICAgYWxsb3daLFxuICAgICAgICBmb3JjZVNpbXBsZTogdHJ1ZSxcbiAgICAgIH0pLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm9ybWF0KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9JU09EYXRlKG8sIGV4dGVuZGVkKSB7XG4gIGNvbnN0IGxvbmdGb3JtYXQgPSBvLmMueWVhciA+IDk5OTkgfHwgby5jLnllYXIgPCAwO1xuICBsZXQgYyA9IFwiXCI7XG4gIGlmIChsb25nRm9ybWF0ICYmIG8uYy55ZWFyID49IDApIGMgKz0gXCIrXCI7XG4gIGMgKz0gcGFkU3RhcnQoby5jLnllYXIsIGxvbmdGb3JtYXQgPyA2IDogNCk7XG5cbiAgaWYgKGV4dGVuZGVkKSB7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5tb250aCk7XG4gICAgYyArPSBcIi1cIjtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9IGVsc2Uge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLm1vbnRoKTtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5kYXkpO1xuICB9XG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiB0b0lTT1RpbWUobywgZXh0ZW5kZWQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpIHtcbiAgbGV0IGMgPSBwYWRTdGFydChvLmMuaG91cik7XG4gIGlmIChleHRlbmRlZCkge1xuICAgIGMgKz0gXCI6XCI7XG4gICAgYyArPSBwYWRTdGFydChvLmMubWludXRlKTtcbiAgICBpZiAoby5jLnNlY29uZCAhPT0gMCB8fCAhc3VwcHJlc3NTZWNvbmRzKSB7XG4gICAgICBjICs9IFwiOlwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjICs9IHBhZFN0YXJ0KG8uYy5taW51dGUpO1xuICB9XG5cbiAgaWYgKG8uYy5zZWNvbmQgIT09IDAgfHwgIXN1cHByZXNzU2Vjb25kcykge1xuICAgIGMgKz0gcGFkU3RhcnQoby5jLnNlY29uZCk7XG5cbiAgICBpZiAoby5jLm1pbGxpc2Vjb25kICE9PSAwIHx8ICFzdXBwcmVzc01pbGxpc2Vjb25kcykge1xuICAgICAgYyArPSBcIi5cIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoby5jLm1pbGxpc2Vjb25kLCAzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGlmIChvLmlzT2Zmc2V0Rml4ZWQgJiYgby5vZmZzZXQgPT09IDApIHtcbiAgICAgIGMgKz0gXCJaXCI7XG4gICAgfSBlbHNlIGlmIChvLm8gPCAwKSB7XG4gICAgICBjICs9IFwiLVwiO1xuICAgICAgYyArPSBwYWRTdGFydChNYXRoLnRydW5jKC1vLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYygtby5vICUgNjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYyArPSBcIitcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gLyA2MCkpO1xuICAgICAgYyArPSBcIjpcIjtcbiAgICAgIGMgKz0gcGFkU3RhcnQoTWF0aC50cnVuYyhvLm8gJSA2MCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYztcbn1cblxuLy8gZGVmYXVsdHMgZm9yIHVuc3BlY2lmaWVkIHVuaXRzIGluIHRoZSBzdXBwb3J0ZWQgY2FsZW5kYXJzXG5jb25zdCBkZWZhdWx0VW5pdFZhbHVlcyA9IHtcbiAgICBtb250aDogMSxcbiAgICBkYXk6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9LFxuICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gICAgd2Vla051bWJlcjogMSxcbiAgICB3ZWVrZGF5OiAxLFxuICAgIGhvdXI6IDAsXG4gICAgbWludXRlOiAwLFxuICAgIHNlY29uZDogMCxcbiAgICBtaWxsaXNlY29uZDogMCxcbiAgfSxcbiAgZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzID0ge1xuICAgIG9yZGluYWw6IDEsXG4gICAgaG91cjogMCxcbiAgICBtaW51dGU6IDAsXG4gICAgc2Vjb25kOiAwLFxuICAgIG1pbGxpc2Vjb25kOiAwLFxuICB9O1xuXG4vLyBVbml0cyBpbiB0aGUgc3VwcG9ydGVkIGNhbGVuZGFycywgc29ydGVkIGJ5IGJpZ25lc3NcbmNvbnN0IG9yZGVyZWRVbml0cyA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgb3JkZXJlZFdlZWtVbml0cyA9IFtcbiAgICBcIndlZWtZZWFyXCIsXG4gICAgXCJ3ZWVrTnVtYmVyXCIsXG4gICAgXCJ3ZWVrZGF5XCIsXG4gICAgXCJob3VyXCIsXG4gICAgXCJtaW51dGVcIixcbiAgICBcInNlY29uZFwiLFxuICAgIFwibWlsbGlzZWNvbmRcIixcbiAgXSxcbiAgb3JkZXJlZE9yZGluYWxVbml0cyA9IFtcInllYXJcIiwgXCJvcmRpbmFsXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdO1xuXG4vLyBzdGFuZGFyZGl6ZSBjYXNlIGFuZCBwbHVyYWxpdHkgaW4gdW5pdHNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCkge1xuICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBxdWFydGVyOiBcInF1YXJ0ZXJcIixcbiAgICBxdWFydGVyczogXCJxdWFydGVyXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWlsbGlzZWNvbmQ6IFwibWlsbGlzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZHM6IFwibWlsbGlzZWNvbmRcIixcbiAgICB3ZWVrZGF5OiBcIndlZWtkYXlcIixcbiAgICB3ZWVrZGF5czogXCJ3ZWVrZGF5XCIsXG4gICAgd2Vla251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla3NudW1iZXI6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWtudW1iZXJzOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVreWVhcjogXCJ3ZWVrWWVhclwiLFxuICAgIHdlZWt5ZWFyczogXCJ3ZWVrWWVhclwiLFxuICAgIG9yZGluYWw6IFwib3JkaW5hbFwiLFxuICB9W3VuaXQudG9Mb3dlckNhc2UoKV07XG5cbiAgaWYgKCFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gdGhpcyBpcyBhIGR1bWJlZCBkb3duIHZlcnNpb24gb2YgZnJvbU9iamVjdCgpIHRoYXQgcnVucyBhYm91dCA2MCUgZmFzdGVyXG4vLyBidXQgZG9lc24ndCBkbyBhbnkgdmFsaWRhdGlvbiwgbWFrZXMgYSBidW5jaCBvZiBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IHVuaXRzXG4vLyBhcmUgcHJlc2VudCwgYW5kIHNvIG9uLlxuXG4vLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5mdW5jdGlvbiBxdWlja0RUKG9iaiwgb3B0cykge1xuICBjb25zdCB6b25lID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKSxcbiAgICB0c05vdyA9IFNldHRpbmdzLm5vdygpO1xuXG4gIGxldCB0cywgbztcblxuICAvLyBhc3N1bWUgd2UgaGF2ZSB0aGUgaGlnaGVyLW9yZGVyIHVuaXRzXG4gIGlmICghaXNVbmRlZmluZWQob2JqLnllYXIpKSB7XG4gICAgZm9yIChjb25zdCB1IG9mIG9yZGVyZWRVbml0cykge1xuICAgICAgaWYgKGlzVW5kZWZpbmVkKG9ialt1XSkpIHtcbiAgICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW52YWxpZCA9IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG9iaikgfHwgaGFzSW52YWxpZFRpbWVEYXRhKG9iaik7XG4gICAgaWYgKGludmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKGludmFsaWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KTtcbiAgICBbdHMsIG9dID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSk7XG4gIH0gZWxzZSB7XG4gICAgdHMgPSB0c05vdztcbiAgfVxuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoeyB0cywgem9uZSwgbG9jLCBvIH0pO1xufVxuXG5mdW5jdGlvbiBkaWZmUmVsYXRpdmUoc3RhcnQsIGVuZCwgb3B0cykge1xuICBjb25zdCByb3VuZCA9IGlzVW5kZWZpbmVkKG9wdHMucm91bmQpID8gdHJ1ZSA6IG9wdHMucm91bmQsXG4gICAgZm9ybWF0ID0gKGMsIHVuaXQpID0+IHtcbiAgICAgIGMgPSByb3VuZFRvKGMsIHJvdW5kIHx8IG9wdHMuY2FsZW5kYXJ5ID8gMCA6IDIsIHRydWUpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZW5kLmxvYy5jbG9uZShvcHRzKS5yZWxGb3JtYXR0ZXIob3B0cyk7XG4gICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChjLCB1bml0KTtcbiAgICB9LFxuICAgIGRpZmZlciA9ICh1bml0KSA9PiB7XG4gICAgICBpZiAob3B0cy5jYWxlbmRhcnkpIHtcbiAgICAgICAgaWYgKCFlbmQuaGFzU2FtZShzdGFydCwgdW5pdCkpIHtcbiAgICAgICAgICByZXR1cm4gZW5kLnN0YXJ0T2YodW5pdCkuZGlmZihzdGFydC5zdGFydE9mKHVuaXQpLCB1bml0KS5nZXQodW5pdCk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgaWYgKG9wdHMudW5pdCkge1xuICAgIHJldHVybiBmb3JtYXQoZGlmZmVyKG9wdHMudW5pdCksIG9wdHMudW5pdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygb3B0cy51bml0cykge1xuICAgIGNvbnN0IGNvdW50ID0gZGlmZmVyKHVuaXQpO1xuICAgIGlmIChNYXRoLmFicyhjb3VudCkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZvcm1hdChjb3VudCwgdW5pdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtYXQoc3RhcnQgPiBlbmQgPyAtMCA6IDAsIG9wdHMudW5pdHNbb3B0cy51bml0cy5sZW5ndGggLSAxXSk7XG59XG5cbmZ1bmN0aW9uIGxhc3RPcHRzKGFyZ0xpc3QpIHtcbiAgbGV0IG9wdHMgPSB7fSxcbiAgICBhcmdzO1xuICBpZiAoYXJnTGlzdC5sZW5ndGggPiAwICYmIHR5cGVvZiBhcmdMaXN0W2FyZ0xpc3QubGVuZ3RoIC0gMV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICBvcHRzID0gYXJnTGlzdFthcmdMaXN0Lmxlbmd0aCAtIDFdO1xuICAgIGFyZ3MgPSBBcnJheS5mcm9tKGFyZ0xpc3QpLnNsaWNlKDAsIGFyZ0xpc3QubGVuZ3RoIC0gMSk7XG4gIH0gZWxzZSB7XG4gICAgYXJncyA9IEFycmF5LmZyb20oYXJnTGlzdCk7XG4gIH1cbiAgcmV0dXJuIFtvcHRzLCBhcmdzXTtcbn1cblxuLyoqXG4gKiBBIERhdGVUaW1lIGlzIGFuIGltbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyBkYXRlIGFuZCB0aW1lIGFuZCBhY2NvbXBhbnlpbmcgbWV0aG9kcy4gSXQgY29udGFpbnMgY2xhc3MgYW5kIGluc3RhbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCB0cmFuc2Zvcm1pbmcsIGFuZCBmb3JtYXR0aW5nIHRoZW0uXG4gKlxuICogQSBEYXRlVGltZSBjb21wcmlzZXMgb2Y6XG4gKiAqIEEgdGltZXN0YW1wLiBFYWNoIERhdGVUaW1lIGluc3RhbmNlIHJlZmVycyB0byBhIHNwZWNpZmljIG1pbGxpc2Vjb25kIG9mIHRoZSBVbml4IGVwb2NoLlxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXG4gKiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGVmZmVjdCBob3cgb3V0cHV0IHN0cmluZ3MgYXJlIGZvcm1hdHRlZCwgc3VjaCBhcyBgbG9jYWxlYCwgYG51bWJlcmluZ1N5c3RlbWAsIGFuZCBgb3V0cHV0Q2FsZW5kYXJgLlxuICpcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XG4gKlxuICogKiAqKkNyZWF0aW9uKio6IFRvIGNyZWF0ZSBhIERhdGVUaW1lIGZyb20gaXRzIGNvbXBvbmVudHMsIHVzZSBvbmUgb2YgaXRzIGZhY3RvcnkgY2xhc3MgbWV0aG9kczoge0BsaW5rIERhdGVUaW1lI2xvY2FsfSwge0BsaW5rIERhdGVUaW1lI3V0Y30sIGFuZCAobW9zdCBmbGV4aWJseSkge0BsaW5rIERhdGVUaW1lI2Zyb21PYmplY3R9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21JU099LCB7QGxpbmsgRGF0ZVRpbWUjZnJvbUhUVFB9LCBhbmQge0BsaW5rIERhdGVUaW1lI2Zyb21SRkMyODIyfS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQsIHVzZSB7QGxpbmsgRGF0ZVRpbWUjZnJvbUZvcm1hdH0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIG5hdGl2ZSBKUyBkYXRlLCB1c2Uge0BsaW5rIERhdGVUaW1lI2Zyb21KU0RhdGV9LlxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIERhdGVUaW1lI3RvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3llYXJ9LCB7QGxpbmsgRGF0ZVRpbWUjbW9udGh9LFxuICoge0BsaW5rIERhdGVUaW1lI2RheX0sIHtAbGluayBEYXRlVGltZSNob3VyfSwge0BsaW5rIERhdGVUaW1lI21pbnV0ZX0sIHtAbGluayBEYXRlVGltZSNzZWNvbmR9LCB7QGxpbmsgRGF0ZVRpbWUjbWlsbGlzZWNvbmR9IGFjY2Vzc29ycy5cbiAqICogKipXZWVrIGNhbGVuZGFyKio6IEZvciBJU08gd2VlayBjYWxlbmRhciBhdHRyaWJ1dGVzLCBzZWUgdGhlIHtAbGluayBEYXRlVGltZSN3ZWVrWWVhcn0sIHtAbGluayBEYXRlVGltZSN3ZWVrTnVtYmVyfSwgYW5kIHtAbGluayBEYXRlVGltZSN3ZWVrZGF5fSBhY2Nlc3NvcnMuXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIERhdGVUaW1lI2xvY2FsZX0gYW5kIHtAbGluayBEYXRlVGltZSNudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cbiAqICogKipUcmFuc2Zvcm1hdGlvbioqOiBUbyB0cmFuc2Zvcm0gdGhlIERhdGVUaW1lIGludG8gb3RoZXIgRGF0ZVRpbWVzLCB1c2Uge0BsaW5rIERhdGVUaW1lI3NldH0sIHtAbGluayBEYXRlVGltZSNyZWNvbmZpZ3VyZX0sIHtAbGluayBEYXRlVGltZSNzZXRab25lfSwge0BsaW5rIERhdGVUaW1lI3NldExvY2FsZX0sIHtAbGluayBEYXRlVGltZS5wbHVzfSwge0BsaW5rIERhdGVUaW1lI21pbnVzfSwge0BsaW5rIERhdGVUaW1lI2VuZE9mfSwge0BsaW5rIERhdGVUaW1lI3N0YXJ0T2Z9LCB7QGxpbmsgRGF0ZVRpbWUjdG9VVEN9LCBhbmQge0BsaW5rIERhdGVUaW1lI3RvTG9jYWx9LlxuICogKiAqKk91dHB1dCoqOiBUbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHVzZSB0aGUge0BsaW5rIERhdGVUaW1lI3RvUmVsYXRpdmV9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SZWxhdGl2ZUNhbGVuZGFyfSwge0BsaW5rIERhdGVUaW1lI3RvSlNPTn0sIHtAbGluayBEYXRlVGltZSN0b0lTT30sIHtAbGluayBEYXRlVGltZSN0b0hUVFB9LCB7QGxpbmsgRGF0ZVRpbWUjdG9PYmplY3R9LCB7QGxpbmsgRGF0ZVRpbWUjdG9SRkMyODIyfSwge0BsaW5rIERhdGVUaW1lI3RvU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSwge0BsaW5rIERhdGVUaW1lI3RvRm9ybWF0fSwge0BsaW5rIERhdGVUaW1lI3RvTWlsbGlzfSBhbmQge0BsaW5rIERhdGVUaW1lI3RvSlNEYXRlfS5cbiAqXG4gKiBUaGVyZSdzIHBsZW50eSBvdGhlcnMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24sIHRpbWUgem9uZXMsIGFsdGVybmF0aXZlIGNhbGVuZGFycywgdmFsaWRpdHksIGFuZCBzbyBvbiwgc2VlIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRlVGltZSB7XG4gIC8qKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIGNvbnN0IHpvbmUgPSBjb25maWcuem9uZSB8fCBTZXR0aW5ncy5kZWZhdWx0Wm9uZTtcblxuICAgIGxldCBpbnZhbGlkID1cbiAgICAgIGNvbmZpZy5pbnZhbGlkIHx8XG4gICAgICAoTnVtYmVyLmlzTmFOKGNvbmZpZy50cykgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsKSB8fFxuICAgICAgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuXG4gICAgbGV0IGMgPSBudWxsLFxuICAgICAgbyA9IG51bGw7XG4gICAgaWYgKCFpbnZhbGlkKSB7XG4gICAgICBjb25zdCB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcblxuICAgICAgaWYgKHVuY2hhbmdlZCkge1xuICAgICAgICBbYywgb10gPSBbY29uZmlnLm9sZC5jLCBjb25maWcub2xkLm9dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3QgPSB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICAgICAgYyA9IHRzVG9PYmoodGhpcy50cywgb3QpO1xuICAgICAgICBpbnZhbGlkID0gTnVtYmVyLmlzTmFOKGMueWVhcikgPyBuZXcgSW52YWxpZChcImludmFsaWQgaW5wdXRcIikgOiBudWxsO1xuICAgICAgICBjID0gaW52YWxpZCA/IG51bGwgOiBjO1xuICAgICAgICBvID0gaW52YWxpZCA/IG51bGwgOiBvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl96b25lID0gem9uZTtcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmxvYyA9IGNvbmZpZy5sb2MgfHwgTG9jYWxlLmNyZWF0ZSgpO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy53ZWVrRGF0YSA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGFjY2VzcyBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5jID0gYztcbiAgICAvKipcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm8gPSBvO1xuICAgIC8qKlxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXNMdXhvbkRhdGVUaW1lID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIENPTlNUUlVDVFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmb3IgdGhlIGN1cnJlbnQgaW5zdGFudCwgaW4gdGhlIHN5c3RlbSdzIHRpbWUgem9uZS5cbiAgICpcbiAgICogVXNlIFNldHRpbmdzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGlmIG5lZWRlZC5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvL34+IG5vdyBpbiB0aGUgSVNPIGZvcm1hdFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBub3coKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7fSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbG9jYWwgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgbG9jYWwoKWAgd2l0aCBubyBhcmd1bWVudHMpLCB0aGUgY3VycmVudCB0aW1lIHdpbGwgYmUgdXNlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkYXk9MV0gLSBUaGUgZGF5IG9mIHRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaG91cj0wXSAtIFRoZSBob3VyIG9mIHRoZSBkYXksIGluIDI0LWhvdXIgdGltZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbnV0ZT0wXSAtIFRoZSBtaW51dGUgb2YgdGhlIGhvdXIsIG1lYW5pbmcgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA1OVxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWlsbGlzZWNvbmQ9MF0gLSBUaGUgbWlsbGlzZWNvbmQgb2YgdGhlIHNlY29uZCwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDk5OVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKHsgem9uZTogXCJBbWVyaWNhL05ld19Zb3JrXCIgfSkgICAgICAvL34+IG5vdywgaW4gVVMgZWFzdCBjb2FzdCB0aW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDAsIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCB7IHpvbmU6IFwidXRjXCIgfSkgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDAsIGluIFVUQ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUpICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwLCA3NjUpICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgbG9jYWwoKSB7XG4gICAgY29uc3QgW29wdHMsIGFyZ3NdID0gbGFzdE9wdHMoYXJndW1lbnRzKSxcbiAgICAgIFt5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdID0gYXJncztcbiAgICByZXR1cm4gcXVpY2tEVCh7IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCB9LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt5ZWFyXSAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttb250aD0xXSAtIFRoZSBtb250aCwgMS1pbmRleGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF5PTFdIC0gVGhlIGRheSBvZiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWludXRlPTBdIC0gVGhlIG1pbnV0ZSBvZiB0aGUgaG91ciwgbWVhbmluZyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbc2Vjb25kPTBdIC0gVGhlIHNlY29uZCBvZiB0aGUgbWludXRlLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBtZWFuaW5nIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsZV0gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub3V0cHV0Q2FsZW5kYXJdIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubnVtYmVyaW5nU3lzdGVtXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gbm93XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMS0wMVQwMDowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDA6MDA6MDBaXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTowMDowMFpcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCB7IGxvY2FsZTogXCJmclwiIH0pICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NTowMFogd2l0aCBhIEZyZW5jaCBsb2NhbGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTApICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwWlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1LCB7IGxvY2FsZTogXCJmclwiIH0pIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMC43NjVaIHdpdGggYSBGcmVuY2ggbG9jYWxlXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIHV0YygpIHtcbiAgICBjb25zdCBbb3B0cywgYXJnc10gPSBsYXN0T3B0cyhhcmd1bWVudHMpLFxuICAgICAgW3llYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF0gPSBhcmdzO1xuXG4gICAgb3B0cy56b25lID0gRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlO1xuICAgIHJldHVybiBxdWlja0RUKHsgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kIH0sIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhU2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIGEgSmF2YVNjcmlwdCBEYXRlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNEYXRlKGRhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHRzID0gaXNEYXRlKGRhdGUpID8gZGF0ZS52YWx1ZU9mKCkgOiBOYU47XG4gICAgaWYgKE51bWJlci5pc05hTih0cykpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiaW52YWxpZCBpbnB1dFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB6b25lVG9Vc2UgPSBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0cyxcbiAgICAgIHpvbmU6IHpvbmVUb1VzZSxcbiAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtZWFuaW5nIHNpbmNlIDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuIFVzZXMgdGhlIGRlZmF1bHQgem9uZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCFpc051bWJlcihtaWxsaXNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXG4gICAgICAgIGBmcm9tTWlsbGlzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0LCBidXQgcmVjZWl2ZWQgYSAke3R5cGVvZiBtaWxsaXNlY29uZHN9IHdpdGggdmFsdWUgJHttaWxsaXNlY29uZHN9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA8IC1NQVhfREFURSB8fCBtaWxsaXNlY29uZHMgPiBNQVhfREFURSkge1xuICAgICAgLy8gdGhpcyBpc24ndCBwZXJmZWN0IGJlY2F1c2UgYmVjYXVzZSB3ZSBjYW4gc3RpbGwgZW5kIHVwIG91dCBvZiByYW5nZSBiZWNhdXNlIG9mIGFkZGl0aW9uYWwgc2hpZnRpbmcsIGJ1dCBpdCdzIGEgc3RhcnRcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFwiVGltZXN0YW1wIG91dCBvZiByYW5nZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBtaWxsaXNlY29uZHMsXG4gICAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICAgIGxvYzogTG9jYWxlLmZyb21PYmplY3Qob3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAobWVhbmluZyBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tU2Vjb25kcyhzZWNvbmRzLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YVNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIG9iamVjdCB0byBjcmVhdGUgdGhlIERhdGVUaW1lIGZyb21cbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai55ZWFyIC0gYSB5ZWFyLCBzdWNoIGFzIDE5ODdcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXkgLSBhIGRheSBvZiB0aGUgbW9udGgsIDEtMzEsIGRlcGVuZGluZyBvbiB0aGUgbW9udGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5vcmRpbmFsIC0gZGF5IG9mIHRoZSB5ZWFyLCAxLTM2NSBvciAzNjZcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrTnVtYmVyIC0gYW4gSVNPIHdlZWsgbnVtYmVyLCBiZXR3ZWVuIDEgYW5kIDUyIG9yIDUzLCBkZXBlbmRpbmcgb24gdGhlIHllYXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrZGF5IC0gYW4gSVNPIHdlZWtkYXksIDEtNywgd2hlcmUgMSBpcyBNb25kYXkgYW5kIDcgaXMgU3VuZGF5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLm1pbnV0ZSAtIG1pbnV0ZSBvZiB0aGUgaG91ciwgMC01OVxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnNlY29uZCAtIHNlY29uZCBvZiB0aGUgbWludXRlLCAwLTU5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIsIG1vbnRoOiA1LCBkYXk6IDI1fSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wNS0yNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSkgLy9+PiB0b2RheSBhdCAxMDoyNjowNlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICd1dGMnIH0pLFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9LCB7IHpvbmU6ICdsb2NhbCcgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYgfSwgeyB6b25lOiAnQW1lcmljYS9OZXdfWW9yaycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHdlZWtZZWFyOiAyMDE2LCB3ZWVrTnVtYmVyOiAyLCB3ZWVrZGF5OiAzIH0pLnRvSVNPRGF0ZSgpIC8vPT4gJzIwMTYtMDEtMTMnXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGZyb21PYmplY3Qob2JqLCBvcHRzID0ge30pIHtcbiAgICBvYmogPSBvYmogfHwge307XG4gICAgY29uc3Qgem9uZVRvVXNlID0gbm9ybWFsaXplWm9uZShvcHRzLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcbiAgICBpZiAoIXpvbmVUb1VzZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZVRvVXNlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9ICFpc1VuZGVmaW5lZChvcHRzLnNwZWNpZmljT2Zmc2V0KVxuICAgICAgICA/IG9wdHMuc3BlY2lmaWNPZmZzZXRcbiAgICAgICAgOiB6b25lVG9Vc2Uub2Zmc2V0KHRzTm93KSxcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0KSxcbiAgICAgIGNvbnRhaW5zT3JkaW5hbCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpLFxuICAgICAgY29udGFpbnNHcmVnb3JZZWFyID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQueWVhciksXG4gICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICBjb250YWluc0dyZWdvciA9IGNvbnRhaW5zR3JlZ29yWWVhciB8fCBjb250YWluc0dyZWdvck1ELFxuICAgICAgZGVmaW5pdGVXZWVrRGVmID0gbm9ybWFsaXplZC53ZWVrWWVhciB8fCBub3JtYWxpemVkLndlZWtOdW1iZXIsXG4gICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvcHRzKTtcblxuICAgIC8vIGNhc2VzOlxuICAgIC8vIGp1c3QgYSB3ZWVrZGF5IC0+IHRoaXMgd2VlaydzIGluc3RhbmNlIG9mIHRoYXQgd2Vla2RheSwgbm8gd29ycmllc1xuICAgIC8vIChncmVnb3JpYW4gZGF0YSBvciBvcmRpbmFsKSArICh3ZWVrWWVhciBvciB3ZWVrTnVtYmVyKSAtPiBlcnJvclxuICAgIC8vIChncmVnb3JpYW4gbW9udGggb3IgZGF5KSArIG9yZGluYWwgLT4gZXJyb3JcbiAgICAvLyBvdGhlcndpc2UganVzdCB1c2Ugd2Vla3Mgb3Igb3JkaW5hbHMgb3IgZ3JlZ29yaWFuLCBkZXBlbmRpbmcgb24gd2hhdCdzIHNwZWNpZmllZFxuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZVdlZWtEYXRhID0gZGVmaW5pdGVXZWVrRGVmIHx8IChub3JtYWxpemVkLndlZWtkYXkgJiYgIWNvbnRhaW5zR3JlZ29yKTtcblxuICAgIC8vIGNvbmZpZ3VyZSBvdXJzZWx2ZXMgdG8gZGVhbCB3aXRoIGdyZWdvcmlhbiBkYXRlcyBvciB3ZWVrIHN0dWZmXG4gICAgbGV0IHVuaXRzLFxuICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgIG9iak5vdyA9IHRzVG9PYmoodHNOb3csIG9mZnNldFByb3Zpcyk7XG4gICAgaWYgKHVzZVdlZWtEYXRhKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRXZWVrVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFdlZWtVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9XZWVrKG9iak5vdyk7XG4gICAgfSBlbHNlIGlmIChjb250YWluc09yZGluYWwpIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZE9yZGluYWxVbml0cztcbiAgICAgIGRlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXM7XG4gICAgICBvYmpOb3cgPSBncmVnb3JpYW5Ub09yZGluYWwob2JqTm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIHN0dWZmXG4gICAgbGV0IGZvdW5kRmlyc3QgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdW5pdHMpIHtcbiAgICAgIGNvbnN0IHYgPSBub3JtYWxpemVkW3VdO1xuICAgICAgaWYgKCFpc1VuZGVmaW5lZCh2KSkge1xuICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdCkge1xuICAgICAgICBub3JtYWxpemVkW3VdID0gZGVmYXVsdFZhbHVlc1t1XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBvYmpOb3dbdV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSB2YWx1ZXMgd2UgaGF2ZSBhcmUgaW4gcmFuZ2VcbiAgICBjb25zdCBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKVxuICAgICAgICA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgaW52YWxpZCA9IGhpZ2hlck9yZGVySW52YWxpZCB8fCBoYXNJbnZhbGlkVGltZURhdGEobm9ybWFsaXplZCk7XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfVxuXG4gICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHRpbWVcbiAgICBjb25zdCBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YVxuICAgICAgICA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IGNvbnRhaW5zT3JkaW5hbFxuICAgICAgICA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKVxuICAgICAgICA6IG5vcm1hbGl6ZWQsXG4gICAgICBbdHNGaW5hbCwgb2Zmc2V0RmluYWxdID0gb2JqVG9UUyhncmVnb3JpYW4sIG9mZnNldFByb3Zpcywgem9uZVRvVXNlKSxcbiAgICAgIGluc3QgPSBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogdHNGaW5hbCxcbiAgICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgICBvOiBvZmZzZXRGaW5hbCxcbiAgICAgICAgbG9jLFxuICAgICAgfSk7XG5cbiAgICAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcbiAgICBpZiAobm9ybWFsaXplZC53ZWVrZGF5ICYmIGNvbnRhaW5zR3JlZ29yICYmIG9iai53ZWVrZGF5ICE9PSBpbnN0LndlZWtkYXkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKFxuICAgICAgICBcIm1pc21hdGNoZWQgd2Vla2RheVwiLFxuICAgICAgICBgeW91IGNhbid0IHNwZWNpZnkgYm90aCBhIHdlZWtkYXkgb2YgJHtub3JtYWxpemVkLndlZWtkYXl9IGFuZCBhIGRhdGUgb2YgJHtpbnN0LnRvSVNPKCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIElTTyA4NjAxIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBJU08gc3RyaW5nXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdzeXN0ZW0ncyBsb2NhbGUnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5vdXRwdXRDYWxlbmRhcl0gLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW1dIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzKzA2OjAwJywge3NldFpvbmU6IHRydWV9KVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMycsIHt6b25lOiAndXRjJ30pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSVNPKHRleHQsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IFt2YWxzLCBwYXJzZWRab25lXSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIklTTyA4NjAxXCIsIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gUkZDIDI4MjIgc3RyaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIFJGQyAyODIyIHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzdHJpbmcsIG1lcmVseSB0aGUgem9uZSB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGlzIGV4cHJlc3NlZCBpbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzOjEyIEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21SRkMyODIyKCdGcmksIDI1IE5vdiAyMDE2IDEzOjIzOjEyICswNjAwJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVJGQzI4MjJEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiUkZDIDI4MjJcIiwgdGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIEhUVFAgaGVhZGVyIGRhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lLiBTaW5jZSBIVFRQIGRhdGVzIGFyZSBhbHdheXMgaW4gVVRDLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCB0aGUgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcuIEZvciBIVFRQIGRhdGVzLCB0aGlzIGlzIGFsd2F5cyBVVEMsIHNvIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUgYHpvbmVgIG9wdGlvbiB0byAndXRjJywgYnV0IHRoaXMgb3B0aW9uIGlzIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbWlsYXIgbWV0aG9kcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nc3lzdGVtJ3MgbG9jYWxlJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UJylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUhUVFAoJ1N1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tSFRUUCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZUhUVFBEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiSFRUUFwiLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZy5cbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlLiBGb3IgYSB0YWJsZSBvZiB0b2tlbnMgYW5kIHRoZWlyIGludGVycHJldGF0aW9ucywgc2VlIFtoZXJlXShodHRwczovL21vbWVudC5naXRodWIuaW8vbHV4b24vIy9wYXJzaW5nP2lkPXRhYmxlLW9mLXRva2VucykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgdGhlIGxpbmsgYmVsb3cgZm9yIHRoZSBmb3JtYXRzKVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm91dHB1dENhbGVuZGFyIC0gdGhlIG91dHB1dCBjYWxlbmRhciB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXRpYyBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKHRleHQpIHx8IGlzVW5kZWZpbmVkKGZtdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21Gb3JtYXQgcmVxdWlyZXMgYW4gaW5wdXQgc3RyaW5nIGFuZCBhIGZvcm1hdFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdHMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgW3ZhbHMsIHBhcnNlZFpvbmUsIHNwZWNpZmljT2Zmc2V0LCBpbnZhbGlkXSA9IHBhcnNlRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIGBmb3JtYXQgJHtmbXR9YCwgdGV4dCwgc3BlY2lmaWNPZmZzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdCBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZnJvbVN0cmluZyh0ZXh0LCBmbXQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhIFNRTCBkYXRlLCB0aW1lLCBvciBkYXRldGltZVxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgc3RyaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIERhdGVUaW1lIHRvIHRoaXMgbG9jYWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0JylcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiswNjowMCcpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyIEFtZXJpY2EvTG9zX0FuZ2VsZXMnKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyJywgeyB6b25lOiAnQW1lcmljYS9Mb3NfQW5nZWxlcycgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMDk6MTI6MzQuMzQyJylcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzdGF0aWMgZnJvbVNRTCh0ZXh0LCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBbdmFscywgcGFyc2VkWm9uZV0gPSBwYXJzZVNRTCh0ZXh0KTtcbiAgICByZXR1cm4gcGFyc2VEYXRhVG9EYXRlVGltZSh2YWxzLCBwYXJzZWRab25lLCBvcHRzLCBcIlNRTFwiLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4cGxhbmF0aW9uPW51bGxdIC0gbG9uZ2VyIGV4cGxhbmF0aW9uLCBtYXkgaW5jbHVkZSBwYXJhbWV0ZXJzIGFuZCBvdGhlciB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc3RhdGljIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoIXJlYXNvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibmVlZCB0byBzcGVjaWZ5IGEgcmVhc29uIHRoZSBEYXRlVGltZSBpcyBpbnZhbGlkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZVRpbWVFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7IGludmFsaWQgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBhIERhdGVUaW1lLiBXb3JrcyBhY3Jvc3MgY29udGV4dCBib3VuZGFyaWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNEYXRlVGltZShvKSB7XG4gICAgcmV0dXJuIChvICYmIG8uaXNMdXhvbkRhdGVUaW1lKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8vIElORk9cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB1bml0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIGEgdW5pdCBzdWNoIGFzICdtaW51dGUnIG9yICdkYXknXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnZGF5Jyk7IC8vPT4gNFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW3VuaXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgdmFsaWQuIEludmFsaWQgRGF0ZVRpbWVzIG9jY3VyIHdoZW46XG4gICAqICogVGhlIERhdGVUaW1lIHdhcyBjcmVhdGVkIGZyb20gaW52YWxpZCBjYWxlbmRhciBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgMTN0aCBtb250aCBvciBGZWJydWFyeSAzMFxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID09PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGlzIERhdGVUaW1lIGlzIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW52YWxpZFJlYXNvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLnJlYXNvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBEYXRlVGltZSBiZWNhbWUgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgRGF0ZVRpbWUgaXMgdmFsaWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnZhbGlkRXhwbGFuYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5leHBsYW5hdGlvbiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2NhbGUgb2YgYSBEYXRlVGltZSwgc3VjaCAnZW4tR0InLiBUaGUgbG9jYWxlIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubG9jYWxlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlcmluZyBzeXN0ZW0gb2YgYSBEYXRlVGltZSwgc3VjaCAnYmVuZycuIFRoZSBudW1iZXJpbmcgc3lzdGVtIGlzIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBEYXRlVGltZVxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG51bWJlcmluZ1N5c3RlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvdXRwdXRDYWxlbmRhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2Mub3V0cHV0Q2FsZW5kYXIgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSB6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERhdGVUaW1lLlxuICAgKiBAdHlwZSB7Wm9uZX1cbiAgICovXG4gIGdldCB6b25lKCkge1xuICAgIHJldHVybiB0aGlzLl96b25lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgdGltZSB6b25lLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHpvbmVOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnpvbmUubmFtZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB5ZWFyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS55ZWFyIC8vPT4gMjAxN1xuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHllYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy55ZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcXVhcnRlclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBxdWFydGVyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5tb250aCAvLz0+IDVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtb250aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1vbnRoIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCAoMS0zMGlzaCkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5kYXkgLy89PiAyNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGRheSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLmRheSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhvdXIgb2YgdGhlIGRheSAoMC0yMykuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGhvdXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwKS5taW51dGUgLy89PiAzMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG1pbnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbnV0ZSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KS5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUsIDksIDMwLCA1Mikuc2Vjb25kIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzZWNvbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5zZWNvbmQgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kICgwLTk5OSkuXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBtaWxsaXNlY29uZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayB5ZWFyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMiwgMzEpLndlZWtZZWFyIC8vPT4gMjAxNVxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHdlZWtZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtZZWFyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd2VlayBudW1iZXIgb2YgdGhlIHdlZWsgeWVhciAoMS01MmlzaCkuXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkud2Vla051bWJlciAvLz0+IDIxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgd2Vla051bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrTnVtYmVyIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLlxuICAgKiAxIGlzIE1vbmRheSBhbmQgNyBpcyBTdW5kYXlcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla2RheSAvLz0+IDRcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrZGF5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKHRoaXMpLndlZWtkYXkgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmRpbmFsIChtZWFuaW5nIHRoZSBkYXkgb2YgdGhlIHllYXIpXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1KS5vcmRpbmFsIC8vPT4gMTQ1XG4gICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XG4gICAqL1xuICBnZXQgb3JkaW5hbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZ3JlZ29yaWFuVG9PcmRpbmFsKHRoaXMuYykub3JkaW5hbCA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIHNob3J0IG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdCcuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoU2hvcnQgLy89PiBPY3RcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBtb250aFNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLm1vbnRocyhcInNob3J0XCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyBtb250aCBuYW1lLCBzdWNoIGFzICdPY3RvYmVyJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkubW9udGhMb25nIC8vPT4gT2N0b2JlclxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vbnRoTG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJsb25nXCIsIHsgbG9jT2JqOiB0aGlzLmxvYyB9KVt0aGlzLm1vbnRoIC0gMV0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgd2Vla2RheSwgc3VjaCBhcyAnTW9uJy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheVNob3J0IC8vPT4gTW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgd2Vla2RheVNob3J0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBJbmZvLndlZWtkYXlzKFwic2hvcnRcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGh1bWFuIHJlYWRhYmxlIGxvbmcgd2Vla2RheSwgc3VjaCBhcyAnTW9uZGF5Jy5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDEwLCAzMCkud2Vla2RheUxvbmcgLy89PiBNb25kYXlcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWVrZGF5TG9uZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcImxvbmdcIiwgeyBsb2NPYmo6IHRoaXMubG9jIH0pW3RoaXMud2Vla2RheSAtIDFdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgb2YgdGhpcyBEYXRlVGltZSBpbiBtaW51dGVzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm9mZnNldCAvLz0+IC0yNDBcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gK3RoaXMubyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgb2Zmc2V0TmFtZVNob3J0KCkge1xuICAgIGlmICh0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgIGZvcm1hdDogXCJzaG9ydFwiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmcgaHVtYW4gbmFtZSBmb3IgdGhlIHpvbmUncyBjdXJyZW50IG9mZnNldCwgZm9yIGV4YW1wbGUgXCJFYXN0ZXJuIFN0YW5kYXJkIFRpbWVcIiBvciBcIkVhc3Rlcm4gRGF5bGlnaHQgVGltZVwiLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGdldCBvZmZzZXROYW1lTG9uZygpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cywge1xuICAgICAgICBmb3JtYXQ6IFwibG9uZ1wiLFxuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGlzIHpvbmUncyBvZmZzZXQgZXZlciBjaGFuZ2VzLCBhcyBpbiBhIERTVC5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaXNPZmZzZXRGaXhlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLmlzVW5pdmVyc2FsIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgRGF0ZVRpbWUgaXMgaW4gYSBEU1QuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGlzSW5EU1QoKSB7XG4gICAgaWYgKHRoaXMuaXNPZmZzZXRGaXhlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHsgbW9udGg6IDEgfSkub2Zmc2V0IHx8IHRoaXMub2Zmc2V0ID4gdGhpcy5zZXQoeyBtb250aDogNSB9KS5vZmZzZXRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuaXNJbkxlYXBZZWFyIC8vPT4gdHJ1ZVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5pc0luTGVhcFllYXIgLy89PiBmYWxzZVxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpc0luTGVhcFllYXIoKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGlzIERhdGVUaW1lJ3MgbW9udGhcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2LCAzKS5kYXlzSW5Nb250aCAvLz0+IDMxXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luTW9udGgoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhciwgdGhpcy5tb250aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhpcyBEYXRlVGltZSdzIHllYXJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNikuZGF5c0luWWVhciAvLz0+IDM2NlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGF5c0luWWVhcigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAwNCkud2Vla3NJbldlZWtZZWFyIC8vPT4gNTNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB3ZWVrc0luV2Vla1llYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBJbnRsIG9wdGlvbnMgZm9yIHRoaXMgRGF0ZVRpbWUuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGluIHVuZGVyc3RhbmRpbmcgdGhlIGJlaGF2aW9yIG9mIGZvcm1hdHRpbmcgbWV0aG9kc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgcmVzb2x2ZWRMb2NhbGVPcHRpb25zKG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyIH0gPSBGb3JtYXR0ZXIuY3JlYXRlKFxuICAgICAgdGhpcy5sb2MuY2xvbmUob3B0cyksXG4gICAgICBvcHRzXG4gICAgKS5yZXNvbHZlZE9wdGlvbnModGhpcyk7XG4gICAgcmV0dXJuIHsgbG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyOiBjYWxlbmRhciB9O1xuICB9XG5cbiAgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBVVEMuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgRGF0ZVRpbWUjc2V0Wm9uZX0oJ3V0YycpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdIC0gb3B0aW9uYWxseSwgYW4gb2Zmc2V0IGZyb20gVVRDIGluIG1pbnV0ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRzPXt9XSAtIG9wdGlvbnMgdG8gcGFzcyB0byBgc2V0Wm9uZSgpYFxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHRvVVRDKG9mZnNldCA9IDAsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKG9mZnNldCksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICpcbiAgICogRXF1aXZhbGVudCB0byBgc2V0Wm9uZSgnbG9jYWwnKWBcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICB0b0xvY2FsKCkge1xuICAgIHJldHVybiB0aGlzLnNldFpvbmUoU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byBzcGVjaWZpZWQgem9uZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2V0dGVyIGtlZXBzIHRoZSB1bmRlcmx5aW5nIHRpbWUgdGhlIHNhbWUgKGFzIGluLCB0aGUgc2FtZSB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBEYXRlVGltZSNwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbH0gYW5kIHtAbGluayBEYXRlVGltZSN0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFt6b25lPSdsb2NhbCddIC0gYSB6b25lIGlkZW50aWZpZXIuIEFzIGEgc3RyaW5nLCB0aGF0IGNhbiBiZSBhbnkgSUFOQSB6b25lIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBlbnZpcm9ubWVudCwgb3IgYSBmaXhlZC1vZmZzZXQgbmFtZSBvZiB0aGUgZm9ybSAnVVRDKzMnLCBvciB0aGUgc3RyaW5ncyAnbG9jYWwnIG9yICd1dGMnLiBZb3UgbWF5IGFsc28gc3VwcGx5IGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIERhdGVUaW1lI1pvbmV9IGNsYXNzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBzZXRab25lKHpvbmUsIHsga2VlcExvY2FsVGltZSA9IGZhbHNlLCBrZWVwQ2FsZW5kYXJUaW1lID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgem9uZSA9IG5vcm1hbGl6ZVpvbmUoem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpO1xuICAgIGlmICh6b25lLmVxdWFscyh0aGlzLnpvbmUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKCF6b25lLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdUUyA9IHRoaXMudHM7XG4gICAgICBpZiAoa2VlcExvY2FsVGltZSB8fCBrZWVwQ2FsZW5kYXJUaW1lKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldEd1ZXNzID0gem9uZS5vZmZzZXQodGhpcy50cyk7XG4gICAgICAgIGNvbnN0IGFzT2JqID0gdGhpcy50b09iamVjdCgpO1xuICAgICAgICBbbmV3VFNdID0gb2JqVG9UUyhhc09iaiwgb2Zmc2V0R3Vlc3MsIHpvbmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgdHM6IG5ld1RTLCB6b25lIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3Igb3V0cHV0Q2FsZW5kYXIuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgLSB0aGUgcHJvcGVydGllcyB0byBzZXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgcmVjb25maWd1cmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSA9IHt9KSB7XG4gICAgY29uc3QgbG9jID0gdGhpcy5sb2MuY2xvbmUoeyBsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIgfSk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHsgbG9jIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZS4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxuICAgKiBKdXN0IGEgY29udmVuaWVudCBhbGlhcyBmb3IgcmVjb25maWd1cmUoeyBsb2NhbGUgfSlcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7IGxvY2FsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXG4gICAqIFlvdSBjYW4gb25seSBzZXQgdW5pdHMgd2l0aCB0aGlzIG1ldGhvZDsgZm9yIFwic2V0dGluZ1wiIG1ldGFkYXRhLCBzZWUge0BsaW5rIERhdGVUaW1lI3JlY29uZmlndXJlfSBhbmQge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9LlxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyBob3VyOiA4LCBtaW51dGU6IDMwIH0pXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IHdlZWtkYXk6IDUgfSlcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3QodmFsdWVzLCBub3JtYWxpemVVbml0KSxcbiAgICAgIHNldHRpbmdXZWVrU3R1ZmYgPVxuICAgICAgICAhaXNVbmRlZmluZWQobm9ybWFsaXplZC53ZWVrWWVhcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla051bWJlcikgfHxcbiAgICAgICAgIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla2RheSksXG4gICAgICBjb250YWluc09yZGluYWwgPSAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSxcbiAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgY29udGFpbnNHcmVnb3JNRCA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLm1vbnRoKSB8fCAhaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpLFxuICAgICAgY29udGFpbnNHcmVnb3IgPSBjb250YWluc0dyZWdvclllYXIgfHwgY29udGFpbnNHcmVnb3JNRCxcbiAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyO1xuXG4gICAgaWYgKChjb250YWluc0dyZWdvciB8fCBjb250YWluc09yZGluYWwpICYmIGRlZmluaXRlV2Vla0RlZikge1xuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0aW5nU3BlY2lmaWNhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbnNHcmVnb3JNRCAmJiBjb250YWluc09yZGluYWwpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCBvcmRpbmFsIGRhdGVzIHdpdGggbW9udGgvZGF5XCIpO1xuICAgIH1cblxuICAgIGxldCBtaXhlZDtcbiAgICBpZiAoc2V0dGluZ1dlZWtTdHVmZikge1xuICAgICAgbWl4ZWQgPSB3ZWVrVG9HcmVnb3JpYW4oeyAuLi5ncmVnb3JpYW5Ub1dlZWsodGhpcy5jKSwgLi4ubm9ybWFsaXplZCB9KTtcbiAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChub3JtYWxpemVkLm9yZGluYWwpKSB7XG4gICAgICBtaXhlZCA9IG9yZGluYWxUb0dyZWdvcmlhbih7IC4uLmdyZWdvcmlhblRvT3JkaW5hbCh0aGlzLmMpLCAuLi5ub3JtYWxpemVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IHsgLi4udGhpcy50b09iamVjdCgpLCAuLi5ub3JtYWxpemVkIH07XG5cbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBzZXQgdGhlIGRheSBidXQgd2UgZW5kZWQgdXAgb24gYW4gb3ZlcmZsb3cgZGF0ZSxcbiAgICAgIC8vIHVzZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHJpZ2h0IG1vbnRoXG4gICAgICBpZiAoaXNVbmRlZmluZWQobm9ybWFsaXplZC5kYXkpKSB7XG4gICAgICAgIG1peGVkLmRheSA9IE1hdGgubWluKGRheXNJbk1vbnRoKG1peGVkLnllYXIsIG1peGVkLm1vbnRoKSwgbWl4ZWQuZGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbdHMsIG9dID0gb2JqVG9UUyhtaXhlZCwgdGhpcy5vLCB0aGlzLnpvbmUpO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7IHRzLCBvIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXG4gICAqXG4gICAqIEFkZGluZyBob3VycywgbWludXRlcywgc2Vjb25kcywgb3IgbWlsbGlzZWNvbmRzIGluY3JlYXNlcyB0aGUgdGltZXN0YW1wIGJ5IHRoZSByaWdodCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBBZGRpbmcgZGF5cywgbW9udGhzLCBvciB5ZWFycyBzaGlmdHMgdGhlIGNhbGVuZGFyLCBhY2NvdW50aW5nIGZvciBEU1RzIGFuZCBsZWFwIHllYXJzIGFsb25nIHRoZSB3YXkuIFRodXMsIGBkdC5wbHVzKHsgaG91cnM6IDI0IH0pYCBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHRpbWUgdGhhbiBgZHQucGx1cyh7IGRheXM6IDEgfSlgIGlmIHRoZXJlJ3MgYSBEU1Qgc2hpZnQgaW4gYmV0d2Vlbi5cbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKDEyMykgLy9+PiBpbiAxMjMgbWlsbGlzZWNvbmRzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBtaW51dGVzOiAxNSB9KSAvL34+IGluIDE1IG1pbnV0ZXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IC0xIH0pIC8vfj4gdGhpcyB0aW1lIHllc3RlcmRheVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgaG91cnM6IDMsIG1pbnV0ZXM6IDEzIH0pIC8vfj4gaW4gMyBociwgMTMgbWluXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAzIGhyLCAxMyBtaW5cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XG4gICAqL1xuICBwbHVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGR1ciA9IER1cmF0aW9uLmZyb21EdXJhdGlvbkxpa2UoZHVyYXRpb24pO1xuICAgIHJldHVybiBjbG9uZSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnRyYWN0IGEgcGVyaW9kIG9mIHRpbWUgdG8gdGhpcyBEYXRlVGltZSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWVcbiAgICogU2VlIHtAbGluayBEYXRlVGltZSNwbHVzfVxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcbiAgIEByZXR1cm4ge0RhdGVUaW1lfVxuICAgKi9cbiAgbWludXMoZHVyYXRpb24pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgZHVyID0gRHVyYXRpb24uZnJvbUR1cmF0aW9uTGlrZShkdXJhdGlvbikubmVnYXRlKCk7XG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIGFkanVzdFRpbWUodGhpcywgZHVyKSk7XG4gIH1cblxuICAvKipcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB1bml0IG9mIHRpbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gVGhlIHVuaXQgdG8gZ28gdG8gdGhlIGJlZ2lubmluZyBvZi4gQ2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZignbW9udGgnKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMy0wMSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuc3RhcnRPZigneWVhcicpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAxLTAxJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCd3ZWVrJykudG9JU09EYXRlKCk7IC8vPT4gJzIwMTQtMDMtMDMnLCB3ZWVrcyBhbHdheXMgc3RhcnQgb24gTW9uZGF5c1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMywgNSwgMzApLnN0YXJ0T2YoJ2hvdXInKS50b0lTT1RpbWUoKTsgLy89PiAnMDU6MDA6MDAuMDAwLTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBvID0ge30sXG4gICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG4gICAgc3dpdGNoIChub3JtYWxpemVkVW5pdCkge1xuICAgICAgY2FzZSBcInllYXJzXCI6XG4gICAgICAgIG8ubW9udGggPSAxO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgY2FzZSBcInF1YXJ0ZXJzXCI6XG4gICAgICBjYXNlIFwibW9udGhzXCI6XG4gICAgICAgIG8uZGF5ID0gMTtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgXCJob3Vyc1wiOlxuICAgICAgICBvLm1pbnV0ZSA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwibWludXRlc1wiOlxuICAgICAgICBvLnNlY29uZCA9IDA7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gbm8gZGVmYXVsdCwgaW52YWxpZCB1bml0cyB0aHJvdyBpbiBub3JtYWxpemVVbml0KClcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwid2Vla3NcIikge1xuICAgICAgby53ZWVrZGF5ID0gMTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFVuaXQgPT09IFwicXVhcnRlcnNcIikge1xuICAgICAgY29uc3QgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGVuZCAobWVhbmluZyB0aGUgbGFzdCBtaWxsaXNlY29uZCkgb2YgYSB1bml0IG9mIHRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLCBvciAnbWlsbGlzZWNvbmQnLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5lbmRPZignbW9udGgnKS50b0lTTygpOyAvLz0+ICcyMDE0LTAzLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3dlZWsnKS50b0lTTygpOyAvLyA9PiAnMjAxNC0wMy0wOVQyMzo1OTo1OS45OTktMDU6MDAnLCB3ZWVrcyBzdGFydCBvbiBNb25kYXlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignZGF5JykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0wM1QyMzo1OTo1OS45OTktMDU6MDAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cbiAgICovXG4gIGVuZE9mKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkXG4gICAgICA/IHRoaXMucGx1cyh7IFt1bml0XTogMSB9KVxuICAgICAgICAgIC5zdGFydE9mKHVuaXQpXG4gICAgICAgICAgLm1pbnVzKDEpXG4gICAgICA6IHRoaXM7XG4gIH1cblxuICAvLyBPVVRQVVRcblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLlxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uLyMvZm9ybWF0dGluZz9pZD10YWJsZS1vZi10b2tlbnMpLlxuICAgKiBEZWZhdWx0cyB0byBlbi1VUyBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCByZWdhcmRsZXNzIG9mIHRoZSBzeXN0ZW0ncyBsb2NhbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoJ2ZyJykudG9Gb3JtYXQoJ3l5eXkgTExMIGRkJykgLy89PiAnMjAxNyBhdnIuIDIyJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0Zvcm1hdCgneXl5eSBMTEwgZGQnLCB7IGxvY2FsZTogXCJmclwiIH0pIC8vPT4gJzIwMTcgYXZyLiAyMidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvRm9ybWF0KGZtdCwgb3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpXG4gICAgICA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0ZS4gQWNjZXB0cyB0aGUgc2FtZSBvcHRpb25zIGFzIHRoZSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIGFuZCBhbnkgcHJlc2V0cyBkZWZpbmVkIGJ5IEx1eG9uLCBzdWNoIGFzIGBEYXRlVGltZS5EQVRFX0ZVTExgIG9yIGBEYXRlVGltZS5USU1FX1NJTVBMRWAuXG4gICAqIFRoZSBleGFjdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBicm93c2VyLXNwZWNpZmljLCBidXQgaW4gZ2VuZXJhbCBpdCB3aWxsIHJldHVybiBhbiBhcHByb3ByaWF0ZSByZXByZXNlbnRhdGlvblxuICAgKiBvZiB0aGUgRGF0ZVRpbWUgaW4gdGhlIGFzc2lnbmVkIGxvY2FsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcbiAgICogQHBhcmFtIGZvcm1hdE9wdHMge09iamVjdH0gLSBJbnRsLkRhdGVUaW1lRm9ybWF0IGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdHMgdG8gb3ZlcnJpZGUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnNldExvY2FsZSgnZW4tZ2InKS50b0xvY2FsZVN0cmluZygpOyAvLz0+ICcyMC8wNC8yMDE3J1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVN0cmluZyh7IGxvY2FsZTogJ2VuLWdiJyB9KTsgLy89PiAnMjAvMDQvMjAxNydcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9GVUxMKTsgLy89PiAnQXByaWwgMjAsIDIwMTcnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVUSU1FX1NIT1JUKTsgLy89PiAnNC8yMC8yMDE3LCAxMTozMiBBTSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9Mb2NhbGVTdHJpbmcoeyB3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHVyc2RheSwgQXByaWwgMjAnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnIH0pOyAvLz0+ICdUaHUsIEFwciAyMCwgMTE6MjcgQU0nXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvTG9jYWxlU3RyaW5nKHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JywgaG91ckN5Y2xlOiAnaDIzJyB9KTsgLy89PiAnMTE6MzInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvTG9jYWxlU3RyaW5nKGZvcm1hdE9wdHMgPSBGb3JtYXRzLkRBVEVfU0hPUlQsIG9wdHMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRcbiAgICAgID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgZm9ybWF0T3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcylcbiAgICAgIDogSU5WQUxJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZvcm1hdCBcInBhcnRzXCIsIG1lYW5pbmcgaW5kaXZpZHVhbCB0b2tlbnMgYWxvbmcgd2l0aCBtZXRhZGF0YS4gVGhpcyBpcyBhbGxvd3MgY2FsbGVycyB0byBwb3N0LXByb2Nlc3MgaW5kaXZpZHVhbCBzZWN0aW9ucyBvZiB0aGUgZm9ybWF0dGVkIG91dHB1dC5cbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xuICAgKiBAcGFyYW0gb3B0cyB7T2JqZWN0fSAtIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3Igb3B0aW9ucywgc2FtZSBhcyBgdG9Mb2NhbGVTdHJpbmdgLlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b0xvY2FsZVBhcnRzKCk7IC8vPT4gW1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2RheScsIHZhbHVlOiAnMjUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdtb250aCcsIHZhbHVlOiAnMDUnIH0sXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbGl0ZXJhbCcsIHZhbHVlOiAnLycgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICd5ZWFyJywgdmFsdWU6ICcxOTgyJyB9XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IF1cbiAgICovXG4gIHRvTG9jYWxlUGFydHMob3B0cyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZFxuICAgICAgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLmNsb25lKG9wdHMpLCBvcHRzKS5mb3JtYXREYXRlVGltZVBhcnRzKHRoaXMpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDE5ODMsIDUsIDI1KS50b0lTTygpIC8vPT4gJzE5ODItMDUtMjVUMDA6MDA6MDAuMDAwWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oKSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNS0wNDowMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9JU08oeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMjAxNzA0MjJUMjA0NzA1LjMzNS0wNDAwJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTTyh7XG4gICAgZm9ybWF0ID0gXCJleHRlbmRlZFwiLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzID0gZmFsc2UsXG4gICAgaW5jbHVkZU9mZnNldCA9IHRydWUsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBleHQgPSBmb3JtYXQgPT09IFwiZXh0ZW5kZWRcIjtcblxuICAgIGxldCBjID0gdG9JU09EYXRlKHRoaXMsIGV4dCk7XG4gICAgYyArPSBcIlRcIjtcbiAgICBjICs9IHRvSVNPVGltZSh0aGlzLCBleHQsIHN1cHByZXNzU2Vjb25kcywgc3VwcHJlc3NNaWxsaXNlY29uZHMsIGluY2x1ZGVPZmZzZXQpO1xuICAgIHJldHVybiBjO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5mb3JtYXQ9J2V4dGVuZGVkJ10gLSBjaG9vc2UgYmV0d2VlbiB0aGUgYmFzaWMgYW5kIGV4dGVuZGVkIGZvcm1hdFxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09EYXRlKHsgZm9ybWF0OiAnYmFzaWMnIH0pIC8vPT4gJzE5ODIwNTI1J1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b0lTT0RhdGUoeyBmb3JtYXQgPSBcImV4dGVuZGVkXCIgfSA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0b0lTT0RhdGUodGhpcywgZm9ybWF0ID09PSBcImV4dGVuZGVkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3Mgd2VlayBkYXRlXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU09XZWVrRGF0ZSgpIC8vPT4gJzE5ODItVzIxLTInXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvSVNPV2Vla0RhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcImtra2stJ1cnV1ctY1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnN1cHByZXNzTWlsbGlzZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVQcmVmaXg9ZmFsc2VdIC0gaW5jbHVkZSB0aGUgYFRgIHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuZm9ybWF0PSdleHRlbmRlZCddIC0gY2hvb3NlIGJldHdlZW4gdGhlIGJhc2ljIGFuZCBleHRlbmRlZCBmb3JtYXRcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoKSAvLz0+ICcwNzozNDoxOS4zNjFaJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS5zZXQoeyBob3VyOiA3LCBtaW51dGU6IDM0LCBzZWNvbmRzOiAwLCBtaWxsaXNlY29uZHM6IDAgfSkudG9JU09UaW1lKHsgc3VwcHJlc3NTZWNvbmRzOiB0cnVlIH0pIC8vPT4gJzA3OjM0WidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuc2V0KHsgaG91cjogNywgbWludXRlOiAzNCB9KS50b0lTT1RpbWUoeyBmb3JtYXQ6ICdiYXNpYycgfSkgLy89PiAnMDczNDE5LjM2MVonXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygpLnNldCh7IGhvdXI6IDcsIG1pbnV0ZTogMzQgfSkudG9JU09UaW1lKHsgaW5jbHVkZVByZWZpeDogdHJ1ZSB9KSAvLz0+ICdUMDc6MzQ6MTkuMzYxWidcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9JU09UaW1lKHtcbiAgICBzdXBwcmVzc01pbGxpc2Vjb25kcyA9IGZhbHNlLFxuICAgIHN1cHByZXNzU2Vjb25kcyA9IGZhbHNlLFxuICAgIGluY2x1ZGVPZmZzZXQgPSB0cnVlLFxuICAgIGluY2x1ZGVQcmVmaXggPSBmYWxzZSxcbiAgICBmb3JtYXQgPSBcImV4dGVuZGVkXCIsXG4gIH0gPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgYyA9IGluY2x1ZGVQcmVmaXggPyBcIlRcIiA6IFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgK1xuICAgICAgdG9JU09UaW1lKHRoaXMsIGZvcm1hdCA9PT0gXCJleHRlbmRlZFwiLCBzdXBwcmVzc1NlY29uZHMsIHN1cHByZXNzTWlsbGlzZWNvbmRzLCBpbmNsdWRlT2Zmc2V0KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9SRkMyODIyKCkgLy89PiAnU3VuLCAxMyBKdWwgMjAxNCAwMDowMDowMCArMDAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvUkZDMjgyMigpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgLTA0MDAnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvUkZDMjgyMigpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyBaWlpcIiwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEhUVFAgaGVhZGVycy4gVGhlIG91dHB1dCBpcyBhbHdheXMgZXhwcmVzc2VkIGluIEdNVC5cbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzMuaHRtbCNzZWMzLjMuMVxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvSFRUUCgpIC8vPT4gJ1N1biwgMTMgSnVsIDIwMTQgMDA6MDA6MDAgR01UJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0b1NRTERhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdG9JU09EYXRlKHRoaXMsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkudG9TUUwoeyBpbmNsdWRlWm9uZTogZmFsc2UgfSkgLy89PiAnMDU6MTU6MTYuMzQ1IEFtZXJpY2EvTmV3X1lvcmsnXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvU1FMVGltZSh7IGluY2x1ZGVPZmZzZXQgPSB0cnVlLCBpbmNsdWRlWm9uZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGxldCBmbXQgPSBcIkhIOm1tOnNzLlNTU1wiO1xuXG4gICAgaWYgKGluY2x1ZGVab25lIHx8IGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgIGZtdCArPSBcIiBcIjtcbiAgICAgIGlmIChpbmNsdWRlWm9uZSkge1xuICAgICAgICBmbXQgKz0gXCJ6XCI7XG4gICAgICB9IGVsc2UgaWYgKGluY2x1ZGVPZmZzZXQpIHtcbiAgICAgICAgZm10ICs9IFwiWlpcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIGZtdCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVab25lPWZhbHNlXSAtIGluY2x1ZGUgdGhlIHpvbmUsIHN1Y2ggYXMgJ0FtZXJpY2EvTmV3X1lvcmsnLiBPdmVycmlkZXMgaW5jbHVkZU9mZnNldC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgWidcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKCkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgLTA0OjAwJ1xuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgNywgMTMpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IHRydWUgfSkgLy89PiAnMjAxNC0wNy0xMyAwMDowMDowMC4wMDAgQW1lcmljYS9OZXdfWW9yaydcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TUUwob3B0cyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLnRvU1FMRGF0ZSgpfSAke3RoaXMudG9TUUxUaW1lKG9wdHMpfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudG9JU08oKSA6IElOVkFMSUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggbWlsbGlzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuIEFsaWFzIG9mIHtAbGluayBEYXRlVGltZSN0b01pbGxpc31cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVwb2NoIG1pbGxpc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBzZWNvbmRzIG9mIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHRvU2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyAvIDEwMDAgOiBOYU47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBJU08gODYwMSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gSlNPTi5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvSVNPKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cbiAgICogQHJldHVybiB7RGF0ZX1cbiAgICovXG4gIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRGF0ZVRpbWUncyB5ZWFyLCBtb250aCwgZGF5LCBhbmQgc28gb24uXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaW5jbHVkZUNvbmZpZz1mYWxzZV0gLSBpbmNsdWRlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyBpbiB0aGUgb3V0cHV0XG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIHRvT2JqZWN0KG9wdHMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4ge307XG5cbiAgICBjb25zdCBiYXNlID0geyAuLi50aGlzLmMgfTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEphdmFTY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXG4gICAqIEByZXR1cm4ge0RhdGV9XG4gICAqL1xuICB0b0pTRGF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTik7XG4gIH1cblxuICAvLyBDT01QQVJFXG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBEYXRlVGltZSB0byBjb21wYXJlIHRoaXMgb25lIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIGFycmF5IG9mIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcbiAgICogICAgIGkyID0gRGF0ZVRpbWUuZnJvbUlTTygnMTk4My0xMC0xNFQxMDozMCcpO1xuICAgKiBpMi5kaWZmKGkxKS50b09iamVjdCgpIC8vPT4geyBtaWxsaXNlY29uZHM6IDQzODA3NTAwMDAwIH1cbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cbiAgICogaTIuZGlmZihpMSwgWydtb250aHMnLCAnZGF5cyddKS50b09iamVjdCgpIC8vPT4geyBtb250aHM6IDE2LCBkYXlzOiAxOS4wMzEyNSB9XG4gICAqIGkyLmRpZmYoaTEsIFsnbW9udGhzJywgJ2RheXMnLCAnaG91cnMnXSkudG9PYmplY3QoKSAvLz0+IHsgbW9udGhzOiAxNiwgZGF5czogMTksIGhvdXJzOiAwLjc1IH1cbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmKG90aGVyRGF0ZVRpbWUsIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGR1ck9wdHMgPSB7IGxvY2FsZTogdGhpcy5sb2NhbGUsIG51bWJlcmluZ1N5c3RlbTogdGhpcy5udW1iZXJpbmdTeXN0ZW0sIC4uLm9wdHMgfTtcblxuICAgIGNvbnN0IHVuaXRzID0gbWF5YmVBcnJheSh1bml0KS5tYXAoRHVyYXRpb24ubm9ybWFsaXplVW5pdCksXG4gICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgZWFybGllciA9IG90aGVySXNMYXRlciA/IHRoaXMgOiBvdGhlckRhdGVUaW1lLFxuICAgICAgbGF0ZXIgPSBvdGhlcklzTGF0ZXIgPyBvdGhlckRhdGVUaW1lIDogdGhpcyxcbiAgICAgIGRpZmZlZCA9IGRpZmYoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBkdXJPcHRzKTtcblxuICAgIHJldHVybiBvdGhlcklzTGF0ZXIgPyBkaWZmZWQubmVnYXRlKCkgOiBkaWZmZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBEYXRlVGltZSBhbmQgcmlnaHQgbm93LlxuICAgKiBTZWUge0BsaW5rIERhdGVUaW1lI2RpZmZ9XG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIHRoZSBEdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcbiAgICogQHJldHVybiB7RHVyYXRpb259XG4gICAqL1xuICBkaWZmTm93KHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiLCBvcHRzID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLm5vdygpLCB1bml0LCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgZW5kIHBvaW50IG9mIHRoZSBJbnRlcnZhbFxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cbiAgICovXG4gIHVudGlsKG90aGVyRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyh0aGlzLCBvdGhlckRhdGVUaW1lKSA6IHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBEYXRlVGltZSBpcyBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWUgYXMgYW5vdGhlciBEYXRlVGltZS5cbiAgICogSGlnaGVyLW9yZGVyIHVuaXRzIG11c3QgYWxzbyBiZSBpZGVudGljYWwgZm9yIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIGB0cnVlYC5cbiAgICogTm90ZSB0aGF0IHRpbWUgem9uZXMgYXJlICoqaWdub3JlZCoqIGluIHRoaXMgY29tcGFyaXNvbiwgd2hpY2ggY29tcGFyZXMgdGhlICoqbG9jYWwqKiBjYWxlbmRhciB0aW1lLiBVc2Uge0BsaW5rIERhdGVUaW1lI3NldFpvbmV9IHRvIGNvbnZlcnQgb25lIG9mIHRoZSBkYXRlcyBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IG90aGVyRGF0ZVRpbWUgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSB0aGUgdW5pdCBvZiB0aW1lIHRvIGNoZWNrIHNhbWVuZXNzIG9uXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLmhhc1NhbWUob3RoZXJEVCwgJ2RheScpOyAvL34+IHRydWUgaWYgb3RoZXJEVCBpcyBpbiB0aGUgc2FtZSBjdXJyZW50IGNhbGVuZGFyIGRheVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzU2FtZShvdGhlckRhdGVUaW1lLCB1bml0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGlucHV0TXMgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKTtcbiAgICBjb25zdCBhZGp1c3RlZFRvWm9uZSA9IHRoaXMuc2V0Wm9uZShvdGhlckRhdGVUaW1lLnpvbmUsIHsga2VlcExvY2FsVGltZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gYWRqdXN0ZWRUb1pvbmUuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gYWRqdXN0ZWRUb1pvbmUuZW5kT2YodW5pdCk7XG4gIH1cblxuICAvKipcbiAgICogRXF1YWxpdHkgY2hlY2tcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXG4gICAqIFRvIGNvbXBhcmUganVzdCB0aGUgbWlsbGlzZWNvbmQgdmFsdWVzLCB1c2UgYCtkdDEgPT09ICtkdDJgLlxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlciAtIHRoZSBvdGhlciBEYXRlVGltZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNWYWxpZCAmJlxuICAgICAgb3RoZXIuaXNWYWxpZCAmJlxuICAgICAgdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyLnZhbHVlT2YoKSAmJlxuICAgICAgdGhpcy56b25lLmVxdWFscyhvdGhlci56b25lKSAmJlxuICAgICAgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aGlzIHRpbWUgcmVsYXRpdmUgdG8gbm93LCBzdWNoIGFzIFwiaW4gdHdvIGRheXNcIi4gQ2FuIG9ubHkgaW50ZXJuYXRpb25hbGl6ZSBpZiB5b3VyXG4gICAqIHBsYXRmb3JtIHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LiBSb3VuZHMgZG93biBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9XCJsb25nXCJdIC0gdGhlIHN0eWxlIG9mIHVuaXRzLCBtdXN0IGJlIFwibG9uZ1wiLCBcInNob3J0XCIsIG9yIFwibmFycm93XCJcbiAgICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQgb3IgYXJyYXkgb2YgdW5pdHM7IGlmIG9taXR0ZWQsIG9yIGFuIGFycmF5LCB0aGUgbWV0aG9kIHdpbGwgcGljayB0aGUgYmVzdCB1bml0LiBVc2UgYW4gYXJyYXkgb3Igb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBvciBcInNlY29uZHNcIlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJvdW5kPXRydWVdIC0gd2hldGhlciB0byByb3VuZCB0aGUgbnVtYmVycyBpbiB0aGUgb3V0cHV0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFkZGluZz0wXSAtIHBhZGRpbmcgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIGFsbG93cyB5b3UgdG8gcm91bmQgdXAgdGhlIHJlc3VsdCBpZiBpdCBmaXRzIGluc2lkZSB0aGUgdGhyZXNob2xkLiBEb24ndCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCB7cm91bmQ6IGZhbHNlfSBiZWNhdXNlIHRoZSBkZWNpbWFsIG91dHB1dCB3aWxsIGluY2x1ZGUgdGhlIHBhZGRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxvY2FsZSAtIG92ZXJyaWRlIHRoZSBsb2NhbGUgb2YgdGhpcyBEYXRlVGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0gLSBvdmVycmlkZSB0aGUgbnVtYmVyaW5nU3lzdGVtIG9mIHRoaXMgRGF0ZVRpbWUuIFRoZSBJbnRsIHN5c3RlbSBtYXkgY2hvb3NlIG5vdCB0byBob25vciB0aGlzXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLnBsdXMoeyBkYXlzOiAxIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiaW4gMSBkYXlcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5zZXRMb2NhbGUoXCJlc1wiKS50b1JlbGF0aXZlKHsgZGF5czogMSB9KSAvLz0+IFwiZGVudHJvIGRlIDEgZFx1MDBFRGFcIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5wbHVzKHsgZGF5czogMSB9KS50b1JlbGF0aXZlKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRhbnMgMjMgaGV1cmVzXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkubWludXMoeyBkYXlzOiAyIH0pLnRvUmVsYXRpdmUoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlKHsgdW5pdDogXCJob3Vyc1wiIH0pIC8vPT4gXCI0OCBob3VycyBhZ29cIlxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5ub3coKS5taW51cyh7IGhvdXJzOiAzNiB9KS50b1JlbGF0aXZlKHsgcm91bmQ6IGZhbHNlIH0pIC8vPT4gXCIxLjUgZGF5cyBhZ29cIlxuICAgKi9cbiAgdG9SZWxhdGl2ZShvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYmFzZSA9IG9wdGlvbnMuYmFzZSB8fCBEYXRlVGltZS5mcm9tT2JqZWN0KHt9LCB7IHpvbmU6IHRoaXMuem9uZSB9KSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcgPyAodGhpcyA8IGJhc2UgPyAtb3B0aW9ucy5wYWRkaW5nIDogb3B0aW9ucy5wYWRkaW5nKSA6IDA7XG4gICAgbGV0IHVuaXRzID0gW1wieWVhcnNcIiwgXCJtb250aHNcIiwgXCJkYXlzXCIsIFwiaG91cnNcIiwgXCJtaW51dGVzXCIsIFwic2Vjb25kc1wiXTtcbiAgICBsZXQgdW5pdCA9IG9wdGlvbnMudW5pdDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnVuaXQpKSB7XG4gICAgICB1bml0cyA9IG9wdGlvbnMudW5pdDtcbiAgICAgIHVuaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBkaWZmUmVsYXRpdmUoYmFzZSwgdGhpcy5wbHVzKHBhZGRpbmcpLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbnVtZXJpYzogXCJhbHdheXNcIixcbiAgICAgIHVuaXRzLFxuICAgICAgdW5pdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZGF0ZSByZWxhdGl2ZSB0byB0b2RheSwgc3VjaCBhcyBcInllc3RlcmRheVwiIG9yIFwibmV4dCBtb250aFwiLlxuICAgKiBPbmx5IGludGVybmF0aW9uYWxpemVzIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnRzIEludGwuUmVsYXRpdmVUaW1lRm9ybWF0LlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdGhhdCBhZmZlY3QgdGhlIG91dHB1dFxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBbb3B0aW9ucy5iYXNlPURhdGVUaW1lLm5vdygpXSAtIHRoZSBEYXRlVGltZSB0byB1c2UgYXMgdGhlIGJhc2lzIHRvIHdoaWNoIHRoaXMgdGltZSBpcyBjb21wYXJlZC4gRGVmYXVsdHMgdG8gbm93LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5sb2NhbGUgLSBvdmVycmlkZSB0aGUgbG9jYWxlIG9mIHRoaXMgRGF0ZVRpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudW5pdCAtIHVzZSBhIHNwZWNpZmljIHVuaXQ7IGlmIG9taXR0ZWQsIHRoZSBtZXRob2Qgd2lsbCBwaWNrIHRoZSB1bml0LiBVc2Ugb25lIG9mIFwieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIG9yIFwiZGF5c1wiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm51bWJlcmluZ1N5c3RlbSAtIG92ZXJyaWRlIHRoZSBudW1iZXJpbmdTeXN0ZW0gb2YgdGhpcyBEYXRlVGltZS4gVGhlIEludGwgc3lzdGVtIG1heSBjaG9vc2Ugbm90IHRvIGhvbm9yIHRoaXNcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKCkgLy89PiBcInRvbW9ycm93XCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkuc2V0TG9jYWxlKFwiZXNcIikucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZSgpIC8vPT4gXCJcIm1hXHUwMEYxYW5hXCJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubm93KCkucGx1cyh7IGRheXM6IDEgfSkudG9SZWxhdGl2ZUNhbGVuZGFyKHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiBcImRlbWFpblwiXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLm5vdygpLm1pbnVzKHsgZGF5czogMiB9KS50b1JlbGF0aXZlQ2FsZW5kYXIoKSAvLz0+IFwiMiBkYXlzIGFnb1wiXG4gICAqL1xuICB0b1JlbGF0aXZlQ2FsZW5kYXIob3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGRpZmZSZWxhdGl2ZShvcHRpb25zLmJhc2UgfHwgRGF0ZVRpbWUuZnJvbU9iamVjdCh7fSwgeyB6b25lOiB0aGlzLnpvbmUgfSksIHRoaXMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBudW1lcmljOiBcImF1dG9cIixcbiAgICAgIHVuaXRzOiBbXCJ5ZWFyc1wiLCBcIm1vbnRoc1wiLCBcImRheXNcIl0sXG4gICAgICBjYWxlbmRhcnk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtaW4gb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtaW4gRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1pbiguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWluIHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1pbik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBtYXggb2Ygc2V2ZXJhbCBkYXRlIHRpbWVzXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cbiAgICogQHJldHVybiB7RGF0ZVRpbWV9IHRoZSBtYXggRGF0ZVRpbWUsIG9yIHVuZGVmaW5lZCBpZiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudFxuICAgKi9cbiAgc3RhdGljIG1heCguLi5kYXRlVGltZXMpIHtcbiAgICBpZiAoIWRhdGVUaW1lcy5ldmVyeShEYXRlVGltZS5pc0RhdGVUaW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwibWF4IHJlcXVpcmVzIGFsbCBhcmd1bWVudHMgYmUgRGF0ZVRpbWVzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgKGkpID0+IGkudmFsdWVPZigpLCBNYXRoLm1heCk7XG4gIH1cblxuICAvLyBNSVNDXG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxvY2FsZSA9IG51bGwsIG51bWJlcmluZ1N5c3RlbSA9IG51bGwgfSA9IG9wdGlvbnMsXG4gICAgICBsb2NhbGVUb1VzZSA9IExvY2FsZS5mcm9tT3B0cyh7XG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBkZWZhdWx0VG9FTjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIHJldHVybiBleHBsYWluRnJvbVRva2Vucyhsb2NhbGVUb1VzZSwgdGV4dCwgZm10KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGZyb21TdHJpbmdFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBGT1JNQVQgUFJFU0VUU1xuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlIDEwLzE0LzE5ODNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9TSE9SVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdCAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9NRUQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9NRUQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpLCBPY3QgMTQsIDE5ODMnXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFX01FRF9XSVRIX1dFRUtEQVk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MydcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURV9GVUxMKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdUdWVzZGF5LCBPY3RvYmVyIDE0LCAxOTgzJ1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURV9IVUdFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfU0lNUExFO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfV0lUSF9MT05HX09GRlNFVCgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5USU1FX1dJVEhfTE9OR19PRkZTRVQ7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzAnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9TSU1QTEU7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX1NFQ09ORFMoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NFQ09ORFM7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIERhdGVUaW1lI3RvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBFYXN0ZXJuIERheWxpZ2h0IFRpbWUnLCBhbHdheXMgMjQtaG91ci5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgVElNRV8yNF9XSVRIX0xPTkdfT0ZGU0VUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLlRJTUVfMjRfV0lUSF9MT05HX09GRlNFVDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX01FRDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMsIDk6MzA6MzMgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ0ZyaSwgMTQgT2N0IDE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREFURVRJTUVfTUVEX1dJVEhfV0VFS0RBWSgpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9NRURfV0lUSF9XRUVLREFZO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBEYXRlVGltZSN0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRURUJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTEwoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfRlVMTDtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUygpIHtcbiAgICByZXR1cm4gRm9ybWF0cy5EQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzAgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0UoKSB7XG4gICAgcmV0dXJuIEZvcm1hdHMuREFURVRJTUVfSFVHRTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgRGF0ZVRpbWUjdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdGcmlkYXksIE9jdG9iZXIgMTQsIDE5ODMsIDk6MzA6MzMgQU0gRWFzdGVybiBEYXlsaWdodCBUaW1lJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCkge1xuICAgIHJldHVybiBGb3JtYXRzLkRBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyaWVuZGx5RGF0ZVRpbWUoZGF0ZVRpbWVpc2gpIHtcbiAgaWYgKERhdGVUaW1lLmlzRGF0ZVRpbWUoZGF0ZVRpbWVpc2gpKSB7XG4gICAgcmV0dXJuIGRhdGVUaW1laXNoO1xuICB9IGVsc2UgaWYgKGRhdGVUaW1laXNoICYmIGRhdGVUaW1laXNoLnZhbHVlT2YgJiYgaXNOdW1iZXIoZGF0ZVRpbWVpc2gudmFsdWVPZigpKSkge1xuICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGVUaW1laXNoKTtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiB0eXBlb2YgZGF0ZVRpbWVpc2ggPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbU9iamVjdChkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgYFVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6ICR7ZGF0ZVRpbWVpc2h9LCBvZiB0eXBlICR7dHlwZW9mIGRhdGVUaW1laXNofWBcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGVUaW1lIGZyb20gXCIuL2RhdGV0aW1lLmpzXCI7XG5pbXBvcnQgRHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCBJbnRlcnZhbCBmcm9tIFwiLi9pbnRlcnZhbC5qc1wiO1xuaW1wb3J0IEluZm8gZnJvbSBcIi4vaW5mby5qc1wiO1xuaW1wb3J0IFpvbmUgZnJvbSBcIi4vem9uZS5qc1wiO1xuaW1wb3J0IEZpeGVkT2Zmc2V0Wm9uZSBmcm9tIFwiLi96b25lcy9maXhlZE9mZnNldFpvbmUuanNcIjtcbmltcG9ydCBJQU5BWm9uZSBmcm9tIFwiLi96b25lcy9JQU5BWm9uZS5qc1wiO1xuaW1wb3J0IEludmFsaWRab25lIGZyb20gXCIuL3pvbmVzL2ludmFsaWRab25lLmpzXCI7XG5pbXBvcnQgU3lzdGVtWm9uZSBmcm9tIFwiLi96b25lcy9zeXN0ZW1ab25lLmpzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcblxuY29uc3QgVkVSU0lPTiA9IFwiMi4zLjBcIjtcblxuZXhwb3J0IHtcbiAgVkVSU0lPTixcbiAgRGF0ZVRpbWUsXG4gIER1cmF0aW9uLFxuICBJbnRlcnZhbCxcbiAgSW5mbyxcbiAgWm9uZSxcbiAgRml4ZWRPZmZzZXRab25lLFxuICBJQU5BWm9uZSxcbiAgSW52YWxpZFpvbmUsXG4gIFN5c3RlbVpvbmUsXG4gIFNldHRpbmdzLFxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjIxJztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbicsXG4gICAgICBJTlZBTElEX1RFTVBMX1ZBUl9FUlJPUl9URVhUID0gJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJztcblxuICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG4gIHZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuICAvKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG4gIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi9cbiAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG4gIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG4gIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgdmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsXG4gICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7XG5cbiAgLyoqIFVzZWQgYXMgZGVmYXVsdCBvcHRpb25zIGZvciBgXy50cnVuY2F0ZWAuICovXG4gIHZhciBERUZBVUxUX1RSVU5DX0xFTkdUSCA9IDMwLFxuICAgICAgREVGQVVMVF9UUlVOQ19PTUlTU0lPTiA9ICcuLi4nO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbiAgdmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICAgIEhPVF9TUEFOID0gMTY7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyLFxuICAgICAgTEFaWV9XSElMRV9GTEFHID0gMztcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbiAgdmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgICBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MSxcbiAgICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgICBOQU4gPSAwIC8gMDtcblxuICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xuICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICBNQVhfQVJSQVlfSU5ERVggPSBNQVhfQVJSQVlfTEVOR1RIIC0gMSxcbiAgICAgIEhBTEZfTUFYX0FSUkFZX0xFTkdUSCA9IE1BWF9BUlJBWV9MRU5HVEggPj4+IDE7XG5cbiAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi9cbiAgdmFyIHdyYXBGbGFncyA9IFtcbiAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLFxuICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSxcbiAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLFxuICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sXG4gICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSxcbiAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSxcbiAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuICBdO1xuXG4gIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICAgIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBkb21FeGNUYWcgPSAnW29iamVjdCBET01FeGNlcHRpb25dJyxcbiAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nLFxuICAgICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXScsXG4gICAgICB3ZWFrU2V0VGFnID0gJ1tvYmplY3QgV2Vha1NldF0nO1xuXG4gIHZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi9cbiAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xcYl9fcCBcXCs9ICcnOy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ01pZGRsZSA9IC9cXGIoX19wIFxcKz0pICcnIFxcKy9nLFxuICAgICAgcmVFbXB0eVN0cmluZ1RyYWlsaW5nID0gLyhfX2VcXCguKj9cXCl8XFxiX190XFwpKSBcXCtcXG4nJzsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIiddL2csXG4gICAgICByZUhhc0VzY2FwZWRIdG1sID0gUmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxcbiAgICAgIHJlSGFzVW5lc2NhcGVkSHRtbCA9IFJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGUgPSAvPCUtKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlRXZhbHVhdGUgPSAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xcc1xcU10rPyklPi9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXG4gICAgICByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gICAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhciA9IFJlZ0V4cChyZVJlZ0V4cENoYXIuc291cmNlKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG4gIHZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHZhbGlkYXRlIHRoZSBgdmFsaWRhdGVgIG9wdGlvbiBpbiBgXy50ZW1wbGF0ZWAgdmFyaWFibGUuXG4gICAqXG4gICAqIEZvcmJpZHMgY2hhcmFjdGVycyB3aGljaCBjb3VsZCBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlZmluaXRpb246XG4gICAqIC0gXCIoKSxcIiAobW9kaWZpY2F0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMpXG4gICAqIC0gXCI9XCIgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gXCJbXXt9XCIgKGRlc3RydWN0dXJpbmcgb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIi9cIiAoYmVnaW5uaW5nIG9mIGEgY29tbWVudClcbiAgICogLSB3aGl0ZXNwYWNlXG4gICAqL1xuICB2YXIgcmVGb3JiaWRkZW5JZGVudGlmaWVyQ2hhcnMgPSAvWygpPSx7fVxcW1xcXVxcL1xcc10vO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZ1xuICAgICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICAgIDogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gICAqIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHtcbiAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVN0YXJ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sXG4gICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYHBsYWNlaG9sZGVyYCBvY2N1cnJlbmNlcyBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgY291bnQuXG4gICAqL1xuICBmdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICsrcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXR0ZXIgVGhlIG1hdGNoZWQgbGV0dGVyIHRvIGRlYnVyci5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgbGV0dGVyLlxuICAgKi9cbiAgdmFyIGRlYnVyckxldHRlciA9IGJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciBlc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikge1xuICAgIHJldHVybiAnXFxcXCcgKyBzdHJpbmdFc2NhcGVzW2Nocl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgc3ltYm9sIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGUudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBpdGVyYXRvcmAgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVyYXRvciBUaGUgaXRlcmF0b3IgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3IpIHtcbiAgICB2YXIgZGF0YSxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoIShkYXRhID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaChkYXRhLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHZhbHVlID09PSBwbGFjZWhvbGRlciB8fCB2YWx1ZSA9PT0gUExBQ0VIT0xERVIpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzZXRgIHRvIGl0cyB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb1BhaXJzKHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW3ZhbHVlLCB2YWx1ZV07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubGFzdEluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVRvQXJyYXkoc3RyaW5nKVxuICAgICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnVuZXNjYXBlYCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gdW5lc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgdW5lc2NhcGVIdG1sQ2hhciA9IGJhc2VQcm9wZXJ0eU9mKGh0bWxVbmVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgICArK3Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIFVuaWNvZGUgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYSBVbmljb2RlIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCkgfHwgW107XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHVzaW5nIHRoZSBgY29udGV4dGAgb2JqZWN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBtZW1iZXJPZiBfXG4gICAqIEBzaW5jZSAxLjEuMFxuICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHQ9cm9vdF0gVGhlIGNvbnRleHQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYSBuZXcgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIF8ubWl4aW4oeyAnZm9vJzogXy5jb25zdGFudCgnZm9vJykgfSk7XG4gICAqXG4gICAqIHZhciBsb2Rhc2ggPSBfLnJ1bkluQ29udGV4dCgpO1xuICAgKiBsb2Rhc2gubWl4aW4oeyAnYmFyJzogbG9kYXNoLmNvbnN0YW50KCdiYXInKSB9KTtcbiAgICpcbiAgICogXy5pc0Z1bmN0aW9uKF8uZm9vKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKiBfLmlzRnVuY3Rpb24oXy5iYXIpO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKlxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guZm9vKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmJhcik7XG4gICAqIC8vID0+IHRydWVcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgc3VwZWQtdXAgYGRlZmVyYCBpbiBOb2RlLmpzLlxuICAgKiB2YXIgZGVmZXIgPSBfLnJ1bkluQ29udGV4dCh7ICdzZXRUaW1lb3V0Jzogc2V0SW1tZWRpYXRlIH0pLmRlZmVyO1xuICAgKi9cbiAgdmFyIHJ1bkluQ29udGV4dCA9IChmdW5jdGlvbiBydW5JbkNvbnRleHQoY29udGV4dCkge1xuICAgIGNvbnRleHQgPSBjb250ZXh0ID09IG51bGwgPyByb290IDogXy5kZWZhdWx0cyhyb290Lk9iamVjdCgpLCBjb250ZXh0LCBfLnBpY2socm9vdCwgY29udGV4dFByb3BzKSk7XG5cbiAgICAvKiogQnVpbHQtaW4gY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgT2JqZWN0ID0gY29udGV4dC5PYmplY3QsXG4gICAgICAgIFJlZ0V4cCA9IGNvbnRleHQuUmVnRXhwLFxuICAgICAgICBTdHJpbmcgPSBjb250ZXh0LlN0cmluZyxcbiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dC5UeXBlRXJyb3I7XG5cbiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsXG4gICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xuICAgIHZhciBjb3JlSnNEYXRhID0gY29udGV4dFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4gICAgLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbiAgICB2YXIgaWRDb3VudGVyID0gMDtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG4gICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICAgICAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gICAgICogb2YgdmFsdWVzLlxuICAgICAqL1xuICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xuICAgIHZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4gICAgKTtcblxuICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sLFxuICAgICAgICBVaW50OEFycmF5ID0gY29udGV4dC5VaW50OEFycmF5LFxuICAgICAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCksXG4gICAgICAgIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlLFxuICAgICAgICBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4gICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICAgICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH0oKSk7XG5cbiAgICAvKiogTW9ja2VkIGJ1aWx0LWlucy4gKi9cbiAgICB2YXIgY3R4Q2xlYXJUaW1lb3V0ID0gY29udGV4dC5jbGVhclRpbWVvdXQgIT09IHJvb3QuY2xlYXJUaW1lb3V0ICYmIGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBjdHhOb3cgPSBEYXRlICYmIERhdGUubm93ICE9PSByb290LkRhdGUubm93ICYmIERhdGUubm93LFxuICAgICAgICBjdHhTZXRUaW1lb3V0ID0gY29udGV4dC5zZXRUaW1lb3V0ICE9PSByb290LnNldFRpbWVvdXQgJiYgY29udGV4dC5zZXRUaW1lb3V0O1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xuICAgIHZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgICAgICBuYXRpdmVGbG9vciA9IE1hdGguZmxvb3IsXG4gICAgICAgIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICAgICAgICBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLFxuICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLFxuICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLFxuICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdyxcbiAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LFxuICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSxcbiAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbiAgICB2YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUoY29udGV4dCwgJ0RhdGFWaWV3JyksXG4gICAgICAgIE1hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnTWFwJyksXG4gICAgICAgIFByb21pc2UgPSBnZXROYXRpdmUoY29udGV4dCwgJ1Byb21pc2UnKSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgV2Vha01hcCA9IGdldE5hdGl2ZShjb250ZXh0LCAnV2Vha01hcCcpLFxuICAgICAgICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbiAgICAvKiogVXNlZCB0byBzdG9yZSBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbiAgICB2YXIgbWV0YU1hcCA9IFdlYWtNYXAgJiYgbmV3IFdlYWtNYXA7XG5cbiAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbiAgICB2YXIgcmVhbE5hbWVzID0ge307XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xuICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgICAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgICAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICAgICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuICAgIC8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xuICAgIHZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gICAgICogYW5kIGZ1bmN0aW9ucyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci4gTWV0aG9kcyB0aGF0IHJldHJpZXZlIGEgc2luZ2xlIHZhbHVlXG4gICAgICogb3IgbWF5IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZW5kIHRoZSBjaGFpbiBzZXF1ZW5jZVxuICAgICAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAgICAgKiB3aXRoIGBfI3ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICAgICAqIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLlxuICAgICAqXG4gICAgICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICAgICAqIGBfI3ZhbHVlYCBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gICAgICogU2hvcnRjdXQgZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiB0byBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBhdm9pZHNcbiAgICAgKiB0aGUgY3JlYXRpb24gb2YgaW50ZXJtZWRpYXRlIGFycmF5cyBhbmQgY2FuIGdyZWF0bHkgcmVkdWNlIHRoZSBudW1iZXIgb2ZcbiAgICAgKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlmIHRoZSBzZWN0aW9uIGlzIGFwcGxpZWQgdG8gYW4gYXJyYXkgYW5kIGl0ZXJhdGVlcyBhY2NlcHQgb25seVxuICAgICAqIG9uZSBhcmd1bWVudC4gVGhlIGhldXJpc3RpYyBmb3Igd2hldGhlciBhIHNlY3Rpb24gcXVhbGlmaWVzIGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGBzaGlmdGAsIGBzb3J0YCwgYHNwbGljZWAsIGFuZCBgdW5zaGlmdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBTdHJpbmdgIG1ldGhvZHMgYXJlOlxuICAgICAqIGByZXBsYWNlYCBhbmQgYHNwbGl0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uIGFyZTpcbiAgICAgKiBgYXRgLCBgY29tcGFjdGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBkcm9wV2hpbGVgLCBgZmlsdGVyYCwgYGZpbmRgLFxuICAgICAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICAgICAqIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGFuZCBgdG9BcnJheWBcbiAgICAgKlxuICAgICAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAgICAgKiBgYWZ0ZXJgLCBgYXJ5YCwgYGFzc2lnbmAsIGBhc3NpZ25JbmAsIGBhc3NpZ25JbldpdGhgLCBgYXNzaWduV2l0aGAsIGBhdGAsXG4gICAgICogYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsIGBjYXN0QXJyYXlgLCBgY2hhaW5gLCBgY2h1bmtgLFxuICAgICAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICAgICAqIGBjdXJyeWAsIGBkZWJvdW5jZWAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgZGVmZXJgLCBgZGVsYXlgLFxuICAgICAqIGBkaWZmZXJlbmNlYCwgYGRpZmZlcmVuY2VCeWAsIGBkaWZmZXJlbmNlV2l0aGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsXG4gICAgICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gICAgICogYGZsYXRNYXBgLCBgZmxhdE1hcERlZXBgLCBgZmxhdE1hcERlcHRoYCwgYGZsYXR0ZW5gLCBgZmxhdHRlbkRlZXBgLFxuICAgICAqIGBmbGF0dGVuRGVwdGhgLCBgZmxpcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsIGBmcm9tUGFpcnNgLCBgZnVuY3Rpb25zYCxcbiAgICAgKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gICAgICogYGludGVyc2VjdGlvbldpdGhgLCBgaW52ZXJ0YCwgYGludmVydEJ5YCwgYGludm9rZU1hcGAsIGBpdGVyYXRlZWAsIGBrZXlCeWAsXG4gICAgICogYGtleXNgLCBga2V5c0luYCwgYG1hcGAsIGBtYXBLZXlzYCwgYG1hcFZhbHVlc2AsIGBtYXRjaGVzYCwgYG1hdGNoZXNQcm9wZXJ0eWAsXG4gICAgICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICAgICAqIGBudGhBcmdgLCBgb21pdGAsIGBvbWl0QnlgLCBgb25jZWAsIGBvcmRlckJ5YCwgYG92ZXJgLCBgb3ZlckFyZ3NgLFxuICAgICAqIGBvdmVyRXZlcnlgLCBgb3ZlclNvbWVgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLCBgcGFydGl0aW9uYCwgYHBpY2tgLFxuICAgICAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAgICAgKiBgcHVsbEFsbFdpdGhgLCBgcHVsbEF0YCwgYHB1c2hgLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZWFyZ2AsIGByZWplY3RgLFxuICAgICAqIGByZW1vdmVgLCBgcmVzdGAsIGByZXZlcnNlYCwgYHNhbXBsZVNpemVgLCBgc2V0YCwgYHNldFdpdGhgLCBgc2h1ZmZsZWAsXG4gICAgICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0YXBgLCBgdGhyb3R0bGVgLCBgdGhydWAsIGB0b0FycmF5YCxcbiAgICAgKiBgdG9QYWlyc2AsIGB0b1BhaXJzSW5gLCBgdG9QYXRoYCwgYHRvUGxhaW5PYmplY3RgLCBgdHJhbnNmb3JtYCwgYHVuYXJ5YCxcbiAgICAgKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICAgICAqIGB1bnNoaWZ0YCwgYHVuemlwYCwgYHVuemlwV2l0aGAsIGB1cGRhdGVgLCBgdXBkYXRlV2l0aGAsIGB2YWx1ZXNgLFxuICAgICAqIGB2YWx1ZXNJbmAsIGB3aXRob3V0YCwgYHdyYXBgLCBgeG9yYCwgYHhvckJ5YCwgYHhvcldpdGhgLCBgemlwYCxcbiAgICAgKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgYXJlICoqbm90KiogY2hhaW5hYmxlIGJ5IGRlZmF1bHQgYXJlOlxuICAgICAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAgICAgKiBgY2xvbmVEZWVwYCwgYGNsb25lRGVlcFdpdGhgLCBgY2xvbmVXaXRoYCwgYGNvbmZvcm1zVG9gLCBgZGVidXJyYCxcbiAgICAgKiBgZGVmYXVsdFRvYCwgYGRpdmlkZWAsIGBlYWNoYCwgYGVhY2hSaWdodGAsIGBlbmRzV2l0aGAsIGBlcWAsIGBlc2NhcGVgLFxuICAgICAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gICAgICogYGZpbmRMYXN0SW5kZXhgLCBgZmluZExhc3RLZXlgLCBgZmlyc3RgLCBgZmxvb3JgLCBgZm9yRWFjaGAsIGBmb3JFYWNoUmlnaHRgLFxuICAgICAqIGBmb3JJbmAsIGBmb3JJblJpZ2h0YCwgYGZvck93bmAsIGBmb3JPd25SaWdodGAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsXG4gICAgICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gICAgICogYGlzQXJndW1lbnRzYCwgYGlzQXJyYXlgLCBgaXNBcnJheUJ1ZmZlcmAsIGBpc0FycmF5TGlrZWAsIGBpc0FycmF5TGlrZU9iamVjdGAsXG4gICAgICogYGlzQm9vbGVhbmAsIGBpc0J1ZmZlcmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCwgYGlzRW1wdHlgLCBgaXNFcXVhbGAsXG4gICAgICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICAgICAqIGBpc01hcGAsIGBpc01hdGNoYCwgYGlzTWF0Y2hXaXRoYCwgYGlzTmFOYCwgYGlzTmF0aXZlYCwgYGlzTmlsYCwgYGlzTnVsbGAsXG4gICAgICogYGlzTnVtYmVyYCwgYGlzT2JqZWN0YCwgYGlzT2JqZWN0TGlrZWAsIGBpc1BsYWluT2JqZWN0YCwgYGlzUmVnRXhwYCxcbiAgICAgKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICAgICAqIGBpc1dlYWtNYXBgLCBgaXNXZWFrU2V0YCwgYGpvaW5gLCBga2ViYWJDYXNlYCwgYGxhc3RgLCBgbGFzdEluZGV4T2ZgLFxuICAgICAqIGBsb3dlckNhc2VgLCBgbG93ZXJGaXJzdGAsIGBsdGAsIGBsdGVgLCBgbWF4YCwgYG1heEJ5YCwgYG1lYW5gLCBgbWVhbkJ5YCxcbiAgICAgKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gICAgICogYHBhZEVuZGAsIGBwYWRTdGFydGAsIGBwYXJzZUludGAsIGBwb3BgLCBgcmFuZG9tYCwgYHJlZHVjZWAsIGByZWR1Y2VSaWdodGAsXG4gICAgICogYHJlcGVhdGAsIGByZXN1bHRgLCBgcm91bmRgLCBgcnVuSW5Db250ZXh0YCwgYHNhbXBsZWAsIGBzaGlmdGAsIGBzaXplYCxcbiAgICAgKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICAgICAqIGBzb3J0ZWRMYXN0SW5kZXhCeWAsIGBzdGFydENhc2VgLCBgc3RhcnRzV2l0aGAsIGBzdHViQXJyYXlgLCBgc3R1YkZhbHNlYCxcbiAgICAgKiBgc3R1Yk9iamVjdGAsIGBzdHViU3RyaW5nYCwgYHN0dWJUcnVlYCwgYHN1YnRyYWN0YCwgYHN1bWAsIGBzdW1CeWAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICAgICAqIGB0b0xvd2VyYCwgYHRvTnVtYmVyYCwgYHRvU2FmZUludGVnZXJgLCBgdG9TdHJpbmdgLCBgdG9VcHBlcmAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBgdHJ1bmNhdGVgLCBgdW5lc2NhcGVgLCBgdW5pcXVlSWRgLCBgdXBwZXJDYXNlYCxcbiAgICAgKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAbmFtZSBfXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAgaW4gYSBgbG9kYXNoYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDIsIDNdKTtcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIHdyYXBwZWQucmVkdWNlKF8uYWRkKTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB2YXIgc3F1YXJlcyA9IHdyYXBwZWQubWFwKHNxdWFyZSk7XG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb2Rhc2godmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdExpa2UodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXJDbG9uZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUxvZGFzaCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGBsb2Rhc2hgIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSwgY2hhaW5BbGwpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICAgIHRoaXMuX19pbmRleF9fID0gMDtcbiAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdGVtcGxhdGUgZGVsaW1pdGVycyB1c2VkIGJ5IGxvZGFzaCBhcmUgbGlrZSB0aG9zZSBpblxuICAgICAqIGVtYmVkZGVkIFJ1YnkgKEVSQikgYXMgd2VsbCBhcyBFUzIwMTUgdGVtcGxhdGUgc3RyaW5ncy4gQ2hhbmdlIHRoZVxuICAgICAqIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2VzY2FwZSc6IHJlRXNjYXBlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2ludGVycG9sYXRlJzogcmVJbnRlcnBvbGF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIHJlZmVyZW5jZSB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIHRlbXBsYXRlIHRleHQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAqL1xuICAgICAgJ3ZhcmlhYmxlJzogJycsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICAnXyc6IGxvZGFzaFxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFbnN1cmUgd3JhcHBlcnMgYXJlIGluc3RhbmNlcyBvZiBgYmFzZUxvZGFzaGAuXG4gICAgbG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsb2Rhc2g7XG5cbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgICAgIHRoaXMuX19maWx0ZXJlZF9fID0gZmFsc2U7XG4gICAgICB0aGlzLl9faXRlcmF0ZWVzX18gPSBbXTtcbiAgICAgIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKGxlbmd0aC0tICYmIHJlc0luZGV4IDwgdGFrZUNvdW50KSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcblxuICAgICAgICB2YXIgaXRlckluZGV4ID0gLTEsXG4gICAgICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcblxuICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSxcbiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLFxuICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICAgIGlmICh0eXBlID09IExBWllfTUFQX0ZMQUcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29tcHV0ZWQ7XG4gICAgICAgICAgfSBlbHNlIGlmICghY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09IExBWllfRklMVEVSX0ZMQUcpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXp5V3JhcHBlcjtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgICAgIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG4gICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbiAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgZGF0YS5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIC0tdGhpcy5zaXplO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICsrdGhpcy5zaXplO1xuICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAgICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAgICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLFxuICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplICs9IGRhdGEuc2l6ZSA9PSBzaXplID8gMCA6IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuICAgIE1hcENhY2hlLnByb3RvdHlwZS5jbGVhciA9IG1hcENhY2hlQ2xlYXI7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuaGFzID0gbWFwQ2FjaGVIYXM7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGFkZFxuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBhbGlhcyBwdXNoXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IHNldENhY2hlSGFzO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICAgICAgfVxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG4gICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcbiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG4gICAgU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgICAgICkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlU2l6ZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNhbXBsZVNpemUoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICAgICAqIGJ5IGBpdGVyYXRlZWAgYW5kIHZhbHVlcyBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBZ2dyZWdhdG9yKGNvbGxlY3Rpb24sIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAgICAgKiB2YWx1ZSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXQob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgc2tpcCA9IG9iamVjdCA9PSBudWxsO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCA6IGdldChvYmplY3QsIHBhdGhzW2luZGV4XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsYW1wYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmIChudW1iZXIgPT09IG51bWJlcikge1xuICAgICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyID49IGxvd2VyID8gbnVtYmVyIDogbG93ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBEZWVwIGNsb25lXG4gICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gICAgICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgICAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQ7XG4gICAgICB9XG4gICAgICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgICAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXMoc291cmNlKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc1RvYCB3aGljaCBhY2NlcHRzIGBwcm9wc2AgdG8gY2hlY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2xlbmd0aF0sXG4gICAgICAgICAgICBwcmVkaWNhdGUgPSBzb3VyY2Vba2V5XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHx8ICFwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5kZWxheWAgYW5kIGBfLmRlZmVyYCB3aGljaCBhY2NlcHRzIGBhcmdzYFxuICAgICAqIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0sIHdhaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgZXhjbHVkaW5nIG11bHRpcGxlIGFycmF5cyBvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgICB2YWx1ZXNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID09IG51bGwgPyB2YWx1ZSA6IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDtcbiAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93bik7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICovXG4gICAgdmFyIGJhc2VFYWNoUmlnaHQgPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICAgICAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICAgICAgfVxuICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IGxlbmd0aCkgPyBsZW5ndGggOiB0b0ludGVnZXIoZW5kKTtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbmQgPSBzdGFydCA+IGVuZCA/IDAgOiB0b0xlbmd0aChlbmQpO1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGFycmF5W3N0YXJ0KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiBwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICAgIGJhc2VGbGF0dGVuKHZhbHVlLCBkZXB0aCAtIDEsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VGb3JgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllc1xuICAgICAqIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvclJpZ2h0ID0gY3JlYXRlQmFzZUZvcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZmlsdGVyLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZ1bmN0aW9ucyhvYmplY3QsIHByb3BzKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluY2x1ZGVzID0gY29tcGFyYXRvciA/IGFycmF5SW5jbHVkZXNXaXRoIDogYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheXNbMF0ubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGgsXG4gICAgICAgICAgY2FjaGVzID0gQXJyYXkob3RoTGVuZ3RoKSxcbiAgICAgICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKG90aEluZGV4LS0pIHtcbiAgICAgICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICAgICAgaWYgKG90aEluZGV4ICYmIGl0ZXJhdGVlKSB7XG4gICAgICAgICAgYXJyYXkgPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGVuZ3RoID0gbmF0aXZlTWluKGFycmF5Lmxlbmd0aCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9ICFjb21wYXJhdG9yICYmIChpdGVyYXRlZSB8fCAobGVuZ3RoID49IDEyMCAmJiBhcnJheS5sZW5ndGggPj0gMTIwKSlcbiAgICAgICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBzZWVuID0gY2FjaGVzWzBdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPCBtYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoIShzZWVuXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcilcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZlcnRgIGFuZCBgXy5pbnZlcnRCeWAgd2hpY2ggaW52ZXJ0c1xuICAgICAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgaXRlcmF0ZWUodmFsdWUpLCBrZXksIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbnZva2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIG1ldGhvZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncykge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHZhciBmdW5jID0gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJyYXlCdWZmZXJgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcnJheUJ1ZmZlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJyYXlCdWZmZXJUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICAgICAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICAgICAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgICAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgICAgIG9iaklzT2JqID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICAgICAgOiAhKGRhdGFbMF0gaW4gb2JqZWN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBkYXRhID0gbWF0Y2hEYXRhW2luZGV4XTtcbiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xuXG4gICAgICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrO1xuICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICAgICA6IHJlc3VsdFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgICAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgICAgIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICAgICAgaWYgKG1hdGNoRGF0YS5sZW5ndGggPT0gMSAmJiBtYXRjaERhdGFbMF1bMl0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHtcbiAgICAgIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSlcbiAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJhc2VGb3Ioc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBiYXNlTWVyZ2UsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDtcbiAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgaWYgKGl0ZXJhdGVlcy5sZW5ndGgpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VTb3J0QnkocmVzdWx0LCBmdW5jdGlvbihvYmplY3QsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQWxsQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICAgKiBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5kZXhPZiA9IGNvbXBhcmF0b3IgPyBiYXNlSW5kZXhPZldpdGggOiBiYXNlSW5kZXhPZixcbiAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgc2VlbiA9IGFycmF5O1xuXG4gICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKHNlZW4sIGNvbXB1dGVkLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpKSA+IC0xKSB7XG4gICAgICAgICAgaWYgKHNlZW4gIT09IGFycmF5KSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChzZWVuLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgZnJvbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogaW5kZXhlcyBvciBjYXB0dXJpbmcgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gaW5kZXhlcyBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gaW5kZXhlcy5sZW5ndGggOiAwLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZG9tYCB3aXRob3V0IHN1cHBvcnQgZm9yIHJldHVybmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlciBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKSB7XG4gICAgICByZXR1cm4gbG93ZXIgKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqICh1cHBlciAtIGxvd2VyICsgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICAgICAqIGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICAgICAgc3RhcnQgKz0gc3RlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVwZWF0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICghc3RyaW5nIHx8IG4gPCAxIHx8IG4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHN0cmluZyArPSBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKG4pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zYW1wbGVTaXplYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4pIHtcbiAgICAgIHZhciBhcnJheSA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihhcnJheSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBiYXNlU2V0RGF0YSA9ICFtZXRhTWFwID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBkYXRhKSB7XG4gICAgICBtZXRhTWFwLnNldChmdW5jLCBkYXRhKTtcbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoXG4gICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT09IHZhbHVlICYmIGhpZ2ggPD0gSEFMRl9NQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBhcnJheVttaWRdO1xuXG4gICAgICAgICAgaWYgKGNvbXB1dGVkICE9PSBudWxsICYmICFpc1N5bWJvbChjb21wdXRlZCkgJiZcbiAgICAgICAgICAgICAgKHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpKSkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZ2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpZGVudGl0eSwgcmV0SGlnaGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YFxuICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZVxuICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGl0ZXJhdGVlKHZhbHVlKTtcbiAgICAgIHZhciB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTtcblxuICAgICAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICAgICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgICAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgICAgIDogY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUsIGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoIShjb21wYXJlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xuICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC5cbiAgICAgICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gKGZ1bmMubmFtZSArICcnKSxcbiAgICAgICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgICAgIGxlbmd0aCA9IGhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCByZXN1bHQpID8gYXJyYXkubGVuZ3RoIDogMDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgICAgIG90aGVyRnVuYyA9IGRhdGEuZnVuYztcbiAgICAgICAgaWYgKG90aGVyRnVuYyA9PSBudWxsIHx8IG90aGVyRnVuYyA9PSBmdW5jKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykge1xuICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7XG4gICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIFwiaXRlcmF0ZWVcIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC5cbiAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0O1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gICAgICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICAgICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICAgICAgOiBkYXRhLm1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICAgICAqL1xuICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgd2hpbGUgKG9iamVjdCkge1xuICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKi9cbiAgICB2YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuICAgIC8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbiAgICBpZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAgICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgICAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgICAgIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICAgICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3LCBhcHBseWluZyBhbnkgYHRyYW5zZm9ybXNgIHRvIHRoZSBgc3RhcnRgIGFuZCBgZW5kYCBwb3NpdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybXMgVGhlIHRyYW5zZm9ybWF0aW9ucyB0byBhcHBseSB0byB0aGUgdmlldy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBgc3RhcnRgIGFuZCBgZW5kYFxuICAgICAqICBwb3NpdGlvbnMgb2YgdGhlIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmlldyhzdGFydCwgZW5kLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSxcbiAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcm9wJzogICAgICBzdGFydCArPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wUmlnaHQnOiBlbmQgLT0gc2l6ZTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZSc6ICAgICAgZW5kID0gbmF0aXZlTWluKGVuZCwgc3RhcnQgKyBzaXplKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndGFrZVJpZ2h0Jzogc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQsIGVuZCAtIHNpemUpOyBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ3N0YXJ0Jzogc3RhcnQsICdlbmQnOiBlbmQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdyYXBwZXIgZGV0YWlscy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNvdXJjZS5tYXRjaChyZVdyYXBEZXRhaWxzKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdLnNwbGl0KHJlU3BsaXREZXRhaWxzKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICAgICAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICAgICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgICAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBzZXRUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07XG4gICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgICAgIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICAgICAgKSB7XG4gICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgICAgIDogKHZhbHVlID09PSBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykge1xuICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIG90aGVyICE9ICdmdW5jdGlvbicgfHwgIShmdW5jTmFtZSBpbiBMYXp5V3JhcHBlci5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICAgICAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICAgICAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gICAgICpcbiAgICAgKiBNZXJnaW5nIG1ldGFkYXRhIHJlZHVjZXMgdGhlIG51bWJlciBvZiB3cmFwcGVycyB1c2VkIHRvIGludm9rZSBhIGZ1bmN0aW9uLlxuICAgICAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gICAgICogbWF5IGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiBleGVjdXRpb24gb3JkZXIuIE1ldGhvZHMgbGlrZSBgXy5hcnlgIGFuZFxuICAgICAqIGBfLnJlYXJnYCBtb2RpZnkgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlXG4gICAgICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gICAgICogYW4gZXhjZXB0aW9uIGZvciBhIHNhZmUgY29tYmluZWQgY2FzZSB3aGVyZSBjdXJyaWVkIGZ1bmN0aW9ucyBoYXZlIGBfLmFyeWBcbiAgICAgKiBhbmQgb3IgYF8ucmVhcmdgIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGRhdGEgVGhlIGRlc3RpbmF0aW9uIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGF0YWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICAgICAgdmFyIGJpdG1hc2sgPSBkYXRhWzFdLFxuICAgICAgICAgIHNyY0JpdG1hc2sgPSBzb3VyY2VbMV0sXG4gICAgICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgICAgIGlzQ29tbW9uID0gbmV3Qml0bWFzayA8IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyB8IFdSQVBfQVJZX0ZMQUcpO1xuXG4gICAgICB2YXIgaXNDb21ibyA9XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHxcbiAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTtcblxuICAgICAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gICAgICBpZiAoIShpc0NvbW1vbiB8fCBpc0NvbWJvKSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYHRoaXNBcmdgIGlmIGF2YWlsYWJsZS5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcgPyAwIDogV1JBUF9DVVJSWV9CT1VORF9GTEFHO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIGFyZ3VtZW50cy5cbiAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVszXTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YXIgcGFydGlhbHMgPSBkYXRhWzNdO1xuICAgICAgICBkYXRhWzNdID0gcGFydGlhbHMgPyBjb21wb3NlQXJncyhwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs0XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICAgICAgfVxuICAgICAgLy8gQ29tcG9zZSBwYXJ0aWFsIHJpZ2h0IGFyZ3VtZW50cy5cbiAgICAgIHZhbHVlID0gc291cmNlWzVdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHBhcnRpYWxzID0gZGF0YVs1XTtcbiAgICAgICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICAgICAgZGF0YVs2XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVs1XSwgUExBQ0VIT0xERVIpIDogc291cmNlWzZdO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcnlgIGlmIGl0J3Mgc21hbGxlci5cbiAgICAgIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwYXJlbnQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGgubGVuZ3RoIDwgMiA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eVxuICAgICAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICAgICAqIFtWOCBpc3N1ZSAyMDcwXShodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMDcwKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBtZXRhZGF0YSB3aXRoLlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BzZXRUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBzZXRUaW1lb3V0ID0gY3R4U2V0VGltZW91dCB8fCBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgICByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGZ1bmMsIHdhaXQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgd3JhcHBlcmAgdG8gbWltaWMgdGhlIHNvdXJjZSBvZiBgcmVmZXJlbmNlYFxuICAgICAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZmVyZW5jZSBUaGUgcmVmZXJlbmNlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlciwgcmVmZXJlbmNlLCBiaXRtYXNrKSB7XG4gICAgICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyh3cmFwcGVyLCBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIHVwZGF0ZVdyYXBEZXRhaWxzKGdldFdyYXBEZXRhaWxzKHNvdXJjZSksIGJpdG1hc2spKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gICAgICogbWlsbGlzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgICAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIHNpemUgPSBzaXplID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBzaXplO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBzaXplKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbcmFuZF07XG5cbiAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07XG4gICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICB2YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICB9XG4gICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB3cmFwcGVyIGBkZXRhaWxzYCBiYXNlZCBvbiBgYml0bWFza2AgZmxhZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gZGV0YWlscyBUaGUgZGV0YWlscyB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsIGJpdG1hc2spIHtcbiAgICAgIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJ18uJyArIHBhaXJbMF07XG4gICAgICAgIGlmICgoYml0bWFzayAmIHBhaXJbMV0pICYmICFhcnJheUluY2x1ZGVzKGRldGFpbHMsIHZhbHVlKSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgd3JhcHBlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB3cmFwcGVyIFRoZSB3cmFwcGVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDbG9uZSh3cmFwcGVyKSB7XG4gICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiB3cmFwcGVyLmNsb25lKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9faW5kZXhfXyAgPSB3cmFwcGVyLl9faW5kZXhfXztcbiAgICAgIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gZ3JvdXBzIHRoZSBsZW5ndGggb2YgYHNpemVgLlxuICAgICAqIElmIGBhcnJheWAgY2FuJ3QgYmUgc3BsaXQgZXZlbmx5LCB0aGUgZmluYWwgY2h1bmsgd2lsbCBiZSB0aGUgcmVtYWluaW5nXG4gICAgICogZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MV0gVGhlIGxlbmd0aCBvZiBlYWNoIGNodW5rXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjaHVua3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2h1bmsoWydhJywgJ2InLCAnYycsICdkJ10sIDIpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbJ2MnLCAnZCddXVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMyk7XG4gICAgICogLy8gPT4gW1snYScsICdiJywgJ2MnXSwgWydkJ11dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2h1bmsoYXJyYXksIHNpemUsIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIHNpemUsIGd1YXJkKSA6IHNpemUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KHRvSW50ZWdlcihzaXplKSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGFycmF5IGNvbmNhdGVuYXRpbmcgYGFycmF5YCB3aXRoIGFueSBhZGRpdGlvbmFsIGFycmF5c1xuICAgICAqIGFuZC9vciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGNvbmNhdGVuYXRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzFdO1xuICAgICAqIHZhciBvdGhlciA9IF8uY29uY2F0KGFycmF5LCAyLCBbM10sIFtbNF1dKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmNhdCgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShsZW5ndGggLSAxKSxcbiAgICAgICAgICBhcnJheSA9IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8ud2l0aG91dCwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnB1bGxBbGxCeWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMl1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZGlmZmVyZW5jZUJ5KFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgW3sgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgb3JkZXIgYW5kXG4gICAgICogcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGNvbXBhcmF0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbFdpdGhgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlV2l0aChvYmplY3RzLCBbeyAneCc6IDEsICd5JzogMiB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBjb21wYXJhdG9yID0gbGFzdCh2YWx1ZXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGNvbXBhcmF0b3IpKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgbiA8IDAgPyAwIDogbiwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgICAgIG4gPSBsZW5ndGggLSBuO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3BSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxscyBlbGVtZW50cyBvZiBgYXJyYXlgIHdpdGggYHZhbHVlYCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3RcbiAgICAgKiBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXy5maWxsKGFycmF5LCAnYScpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYScsICdhJ11cbiAgICAgKlxuICAgICAqIF8uZmlsbChBcnJheSgzKSwgMik7XG4gICAgICogLy8gPT4gWzIsIDIsIDJdXG4gICAgICpcbiAgICAgKiBfLmZpbGwoWzQsIDYsIDgsIDEwXSwgJyonLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbNCwgJyonLCAnKicsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgJiYgdHlwZW9mIHN0YXJ0ICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzXG4gICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGZyb21JbmRleCA8IDBcbiAgICAgICAgICA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMClcbiAgICAgICAgICA6IG5hdGl2ZU1pbihpbmRleCwgbGVuZ3RoIC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgZmxhdHRlbiBgYXJyYXlgIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCBbMiwgWzMsIFs0XV0sIDVdXTtcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZXB0aChhcnJheSwgMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XSwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksIGRlcHRoKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGRlcHRoID09PSB1bmRlZmluZWQgPyAxIDogdG9JbnRlZ2VyKGRlcHRoKTtcbiAgICAgIHJldHVybiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZFxuICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0W3BhaXJbMF1dID0gcGFpclsxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGZpcnN0XG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaGVhZChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uaGVhZChbXSk7XG4gICAgICogLy8gPT4gdW5kZWZpbmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGVhZChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYHZhbHVlYCBpcyBmb3VuZCBpbiBgYXJyYXlgXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXMgdGhlXG4gICAgICogb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8uaW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVNsaWNlKGFycmF5LCAwLCAtMSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvblxuICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsyLjFdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmludGVyc2VjdGlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpLFxuICAgICAgICAgIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7XG5cbiAgICAgIGlmIChpdGVyYXRlZSA9PT0gbGFzdChtYXBwZWQpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludGVyc2VjdGlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlc1xuICAgICAqIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgY29tcGFyYXRvciA9IHR5cGVvZiBjb21wYXJhdG9yID09ICdmdW5jdGlvbicgPyBjb21wYXJhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgbWFwcGVkLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbGwgZWxlbWVudHMgaW4gYGFycmF5YCBpbnRvIGEgc3RyaW5nIHNlcGFyYXRlZCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScsJ10gVGhlIGVsZW1lbnQgc2VwYXJhdG9yLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGpvaW5lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uam9pbihbJ2EnLCAnYicsICdjJ10sICd+Jyk7XG4gICAgICogLy8gPT4gJ2F+Yn5jJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGpvaW4oYXJyYXksIHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyAnJyA6IG5hdGl2ZUpvaW4uY2FsbChhcnJheSwgc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbmRleE9mYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGFycmF5YCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIFNlYXJjaCBmcm9tIHRoZSBgZnJvbUluZGV4YC5cbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KVxuICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgYXQgaW5kZXggYG5gIG9mIGBhcnJheWAuIElmIGBuYCBpcyBuZWdhdGl2ZSwgdGhlIG50aFxuICAgICAqIGVsZW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgMSk7XG4gICAgICogLy8gPT4gJ2InXG4gICAgICpcbiAgICAgKiBfLm50aChhcnJheSwgLTIpO1xuICAgICAqIC8vID0+ICdjJztcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGgoYXJyYXksIG4pIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VOdGgoYXJyYXksIHRvSW50ZWdlcihuKSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYFxuICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYicsICdiJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsKGFycmF5LCBbJ2EnLCAnYyddKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGwoYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIGFuZCBgdmFsdWVzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VCeWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAzIH0sIHsgJ3gnOiAxIH1dO1xuICAgICAqXG4gICAgICogXy5wdWxsQWxsQnkoYXJyYXksIFt7ICd4JzogMSB9LCB7ICd4JzogMyB9XSwgJ3gnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbEJ5KGFycmF5LCB2YWx1ZXMsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gYGFycmF5YCBjb3JyZXNwb25kaW5nIHRvIGBpbmRleGVzYCBhbmQgcmV0dXJucyBhblxuICAgICAqIGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmF0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBbaW5kZXhlc10gVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnYScsICdiJywgJ2MnLCAnZCddO1xuICAgICAqIHZhciBwdWxsZWQgPSBfLnB1bGxBdChhcnJheSwgWzEsIDNdKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwdWxsZWQpO1xuICAgICAqIC8vID0+IFsnYicsICdkJ11cbiAgICAgKi9cbiAgICB2YXIgcHVsbEF0ID0gZmxhdFJlc3QoZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBiYXNlQXQoYXJyYXksIGluZGV4ZXMpO1xuXG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkge1xuICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4O1xuICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZmlsdGVyYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucHVsbGBcbiAgICAgKiB0byBwdWxsIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgMywgNF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5yZW1vdmUoYXJyYXksIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpO1xuICAgICAqIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlbW92ZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleGVzID0gW10sXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyBgYXJyYXlgIHNvIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgYmVjb21lcyB0aGUgbGFzdCwgdGhlIHNlY29uZFxuICAgICAqIGVsZW1lbnQgYmVjb21lcyB0aGUgc2Vjb25kIHRvIGxhc3QsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAgYW5kIGlzIGJhc2VkIG9uXG4gICAgICogW2BBcnJheSNyZXZlcnNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvcmV2ZXJzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLnJldmVyc2UoYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJldmVyc2UoYXJyYXkpIHtcbiAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gYXJyYXkgOiBuYXRpdmVSZXZlcnNlLmNhbGwoYXJyYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgICAqIFtgQXJyYXkjc2xpY2VgXShodHRwczovL21kbi5pby9BcnJheS9zbGljZSkgdG8gZW5zdXJlIGRlbnNlIGFycmF5cyBhcmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZW5kICYmIHR5cGVvZiBlbmQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHN0YXJ0LCBlbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoc3RhcnQpO1xuICAgICAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyBhIGJpbmFyeSBzZWFyY2ggdG8gZGV0ZXJtaW5lIHRoZSBsb3dlc3QgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4KFszMCwgNTBdLCA0MCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb3J0ZWRJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5XG4gICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaGlnaGVzdFxuICAgICAqIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0b1xuICAgICAqIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXgoWzQsIDUsIDUsIDUsIDZdLCA1KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4KGFycmF5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydGVkTGFzdEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyXG4gICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTtcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxO1xuICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcShbMSwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5KVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcUJ5YCBleGNlcHQgdGhhdCBpdCdzIGRlc2lnbmVkIGFuZCBvcHRpbWl6ZWRcbiAgICAgKiBmb3Igc29ydGVkIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkVW5pcUJ5KFsxLjEsIDEuMiwgMi4zLCAyLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4xLCAyLjNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFpbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLiBFbGVtZW50cyBhcmVcbiAgICAgKiB0YWtlbiB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgZmFsc2UsIHRydWUpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzXG4gICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pb25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnlcbiAgICAgKiB3aGljaCB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBSZXN1bHQgdmFsdWVzIGFyZSBjaG9zZW4gZnJvbSB0aGUgZmlyc3RcbiAgICAgKiBhcnJheSBpbiB3aGljaCB0aGUgdmFsdWUgb2NjdXJzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDpcbiAgICAgKiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pb25CeShbMi4xXSwgWzEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlvbkJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB1bmlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY29tcGFyYXRvcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgZWxlbWVudHMgb2YgYGFycmF5c2AuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tXG4gICAgICogdGhlIGZpcnN0IGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaW9uV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGVsZW1lbnRcbiAgICAgKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gICAgICogaW4gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcShbMiwgMSwgMl0pO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlXG4gICAgICogb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcUJ5KFsyLjEsIDEuMiwgMi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMSwgMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy51bmlxQnkoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWRcbiAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwXG4gICAgICogY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjIuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSAwO1xuICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmVcbiAgICAgKiAgcmVncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdKTtcbiAgICAgKiAvLyA9PiBbWzEsIDEwLCAxMDBdLCBbMiwgMjAsIDIwMF1dXG4gICAgICpcbiAgICAgKiBfLnVuemlwV2l0aCh6aXBwZWQsIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMywgMzAsIDMwMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcFdpdGgoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB1bnppcChhcnJheSk7XG4gICAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5TWFwKHJlc3VsdCwgZnVuY3Rpb24oZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB1bmRlZmluZWQsIGdyb3VwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqL1xuICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGVcbiAgICAgKiBbc3ltbWV0cmljIGRpZmZlcmVuY2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N5bW1ldHJpY19kaWZmZXJlbmNlKVxuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyXG4gICAgICogdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy53aXRob3V0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgeG9yID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnhvcmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWRcbiAgICAgKiBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXlzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ueG9yQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzEuMiwgMy40XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy54b3JCeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXNcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBjb21wYXJhdG9yIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICogdmFyIG90aGVycyA9IFt7ICd4JzogMSwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLnhvcldpdGgob2JqZWN0cywgb3RoZXJzLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgeG9yV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KGFycmF5cyk7XG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgICAqIGZpcnN0IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogc2Vjb25kIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqL1xuICAgIHZhciB6aXAgPSBiYXNlUmVzdCh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICAgICAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IGdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aGVcbiAgICAgKiBlbGVtZW50cyBvZiBlYWNoIGdyb3VwOiAoLi4uZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICBncm91cGVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcFdpdGgoWzEsIDJdLCBbMTAsIDIwXSwgWzEwMCwgMjAwXSwgZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIGEgKyBiICsgYztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIGl0ZXJhdGVlID0gbGVuZ3RoID4gMSA/IGFycmF5c1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bnppcFdpdGgoYXJyYXlzLCBpdGVyYXRlZSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF9cbiAgICAgKiAgIC5jaGFpbih1c2VycylcbiAgICAgKiAgIC5zb3J0QnkoJ2FnZScpXG4gICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHtcbiAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlO1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5oZWFkKClcbiAgICAgKiAgIC52YWx1ZSgpO1xuICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpO1xuICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGludm9rZXMgYGludGVyY2VwdG9yYCBhbmQgcmV0dXJucyBgdmFsdWVgLiBUaGUgaW50ZXJjZXB0b3JcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAodmFsdWUpLiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0b1xuICAgICAqIFwidGFwIGludG9cIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pXG4gICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuXG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udGFwYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInBhc3MgdGhydVwiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlXG4gICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oJyAgYWJjICAnKVxuICAgICAqICAuY2hhaW4oKVxuICAgICAqICAudHJpbSgpXG4gICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgICogIH0pXG4gICAgICogIC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnYWJjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgd3JhcHBlciB2ZXJzaW9uIG9mIGBfLmF0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8ob2JqZWN0KS5hdChbJ2FbMF0uYi5jJywgJ2FbMV0nXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgd3JhcHBlckF0ID0gZmxhdFJlc3QoZnVuY3Rpb24ocGF0aHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgc3RhcnQgPSBsZW5ndGggPyBwYXRoc1swXSA6IDAsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLFxuICAgICAgICAgIGludGVyY2VwdG9yID0gZnVuY3Rpb24ob2JqZWN0KSB7IHJldHVybiBiYXNlQXQob2JqZWN0LCBwYXRocyk7IH07XG5cbiAgICAgIGlmIChsZW5ndGggPiAxIHx8IHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoIHx8XG4gICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB8fCAhaXNJbmRleChzdGFydCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0LCArc3RhcnQgKyAobGVuZ3RoID8gMSA6IDApKTtcbiAgICAgIHZhbHVlLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICdhcmdzJzogW2ludGVyY2VwdG9yXSxcbiAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNoYWluXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aG91dCBleHBsaWNpdCBjaGFpbmluZy5cbiAgICAgKiBfKHVzZXJzKS5oZWFkKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRoIGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpXG4gICAgICogICAuY2hhaW4oKVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbW1pdFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogd3JhcHBlZC5sYXN0KCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBvbiBhIHdyYXBwZWQgb2JqZWN0IGZvbGxvd2luZyB0aGVcbiAgICAgKiBbaXRlcmF0b3IgcHJvdG9jb2xdKGh0dHBzOi8vbWRuLmlvL2l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmF0b3IpLlxuICAgICAqXG4gICAgICogQG5hbWUgbmV4dFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5leHQgaXRlcmF0b3IgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAxIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiBmYWxzZSwgJ3ZhbHVlJzogMiB9XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogdHJ1ZSwgJ3ZhbHVlJzogdW5kZWZpbmVkIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyTmV4dCgpIHtcbiAgICAgIGlmICh0aGlzLl9fdmFsdWVzX18gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB0b0FycmF5KHRoaXMudmFsdWUoKSk7XG4gICAgICB9XG4gICAgICB2YXIgZG9uZSA9IHRoaXMuX19pbmRleF9fID49IHRoaXMuX192YWx1ZXNfXy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWUgPSBkb25lID8gdW5kZWZpbmVkIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdO1xuXG4gICAgICByZXR1cm4geyAnZG9uZSc6IGRvbmUsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgd3JhcHBlciB0byBiZSBpdGVyYWJsZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIFN5bWJvbC5pdGVyYXRvclxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHdyYXBwZXIgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oWzEsIDJdKTtcbiAgICAgKlxuICAgICAqIHdyYXBwZWRbU3ltYm9sLml0ZXJhdG9yXSgpID09PSB3cmFwcGVkO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIEFycmF5LmZyb20od3JhcHBlZCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBwbGFudFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpO1xuICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTtcbiAgICAgKlxuICAgICAqIG90aGVyLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzksIDE2XVxuICAgICAqXG4gICAgICogd3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xuXG4gICAgICB3aGlsZSAocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB3cmFwcGVyQ2xvbmUocGFyZW50KTtcbiAgICAgICAgY2xvbmUuX19pbmRleF9fID0gMDtcbiAgICAgICAgY2xvbmUuX192YWx1ZXNfXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gY2xvbmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2xvbmU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzID0gY2xvbmU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX3dyYXBwZWRfXztcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHtcbiAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTtcbiAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHtcbiAgICAgICAgICAnZnVuYyc6IHRocnUsXG4gICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sXG4gICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KHJldmVyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBjaGFpbiBzZXF1ZW5jZSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIHRvSlNPTiwgdmFsdWVPZlxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVmFsdWUoKSB7XG4gICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBrZXkgd2FzIHJldHVybmVkIGJ5IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiAxLCAnNic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5jb3VudEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7XG4gICAgICogLy8gPT4geyAnMyc6IDIsICc1JzogMSB9XG4gICAgICovXG4gICAgdmFyIGNvdW50QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7XG4gICAgICAgICsrcmVzdWx0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICAgICAqIFtlbXB0eSBjb2xsZWN0aW9uc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW1wdHlfc2V0KSBiZWNhdXNlXG4gICAgICogW2V2ZXJ5dGhpbmcgaXMgdHJ1ZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVmFjdW91c190cnV0aCkgb2ZcbiAgICAgKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RXZlcnkgOiBiYXNlRXZlcnk7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQHNlZSBfLnJlamVjdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gICAgICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgICAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nXG4gICAgICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3QodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmRcbiAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gICAgICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1N0cmluZyhudWxsKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZygtMCk7XG4gICAgICogLy8gPT4gJy0wJ1xuICAgICAqXG4gICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkge1xuICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgc291cmNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ25Jbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNCB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduSW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kV2l0aFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduSW5XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGBwYXRoc2Agb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfSwgNF0gfTtcbiAgICAgKlxuICAgICAqIF8uYXQob2JqZWN0LCBbJ2FbMF0uYi5jJywgJ2FbMV0nXSk7XG4gICAgICogLy8gPT4gWzMsIDRdXG4gICAgICovXG4gICAgdmFyIGF0ID0gZmxhdFJlc3QoYmFzZUF0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGUgYHByb3RvdHlwZWAgb2JqZWN0LiBJZiBhXG4gICAgICogYHByb3BlcnRpZXNgIG9iamVjdCBpcyBnaXZlbiwgaXRzIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIGFzc2lnbmVkIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllc10gVGhlIHByb3BlcnRpZXMgdG8gYXNzaWduIHRvIHRoZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gU2hhcGUoKSB7XG4gICAgICogICB0aGlzLnggPSAwO1xuICAgICAqICAgdGhpcy55ID0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBDaXJjbGUoKSB7XG4gICAgICogICBTaGFwZS5jYWxsKHRoaXMpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIENpcmNsZS5wcm90b3R5cGUgPSBfLmNyZWF0ZShTaGFwZS5wcm90b3R5cGUsIHtcbiAgICAgKiAgICdjb25zdHJ1Y3Rvcic6IENpcmNsZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIGNpcmNsZSA9IG5ldyBDaXJjbGU7XG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgQ2lyY2xlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIFNoYXBlO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXMgPT0gbnVsbCA/IHJlc3VsdCA6IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICAgICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmRlZmF1bHRzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UpO1xuICAgICAgcmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwgdW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRLZXlgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBhIGNvbGxlY3Rpb24gaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsXG4gICAgICogIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gcmV0dXJucyAncGViYmxlcycgYXNzdW1pbmcgYF8uZmluZEtleWAgcmV0dXJucyAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZExhc3RLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd25SaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gICAgICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXRcbiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvckluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgYW5kXG4gICAgICogaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvblxuICAgICAqIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd24obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duKG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvck93bmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYicgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9yT3duYCBsb2dzICdhJyB0aGVuICdiJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBhbmQgaW5oZXJpdGVkXG4gICAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7XG4gICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpO1xuICAgICAqXG4gICAgICogXy5mdW5jdGlvbnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICAgICAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gICAgICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob3RoZXIsICdhJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqIElmIGBvYmplY3RgIGNvbnRhaW5zIGR1cGxpY2F0ZSB2YWx1ZXMsIHN1YnNlcXVlbnQgdmFsdWVzIG92ZXJ3cml0ZVxuICAgICAqIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnQgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3ZhbHVlXSA9IGtleTtcbiAgICB9LCBjb25zdGFudChpZGVudGl0eSkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkXG4gICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5c1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9XG4gICAgICovXG4gICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgfVxuICAgIH0sIGdldEl0ZXJhdGVlKTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5pbnZva2Uob2JqZWN0LCAnYVswXS5iLmMuc2xpY2UnLCAxLCAzKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICB2YXIgaW52b2tlID0gYmFzZVJlc3QoYmFzZUludm9rZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy5rZXlzKCdoaScpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5c0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5tYXBWYWx1ZXNgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAqIHNhbWUgdmFsdWVzIGFzIGBvYmplY3RgIGFuZCBrZXlzIGdlbmVyYXRlZCBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGVcbiAgICAgKiBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjguMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBWYWx1ZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwS2V5c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1lcmdlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBtZXJnaW5nIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICogbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHNpeCBhcmd1bWVudHM6XG4gICAgICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gb2JqVmFsdWUuY29uY2F0KHNyY1ZhbHVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFsxXSwgJ2InOiBbMl0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZVdpdGgob2JqZWN0LCBvdGhlciwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZVdpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGVcbiAgICAgKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBzbG93ZXIgdGhhbiBgXy5waWNrYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGlzRGVlcCA9IGZhbHNlO1xuICAgICAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgICAgaXNEZWVwIHx8IChpc0RlZXAgPSBwYXRoLmxlbmd0aCA+IDEpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH0pO1xuICAgICAgY29weU9iamVjdChvYmplY3QsIGdldEFsbEtleXNJbihvYmplY3QpLCByZXN1bHQpO1xuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICByZXN1bHQgPSBiYXNlQ2xvbmUocmVzdWx0LCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9GTEFUX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbU9taXRDbG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGJhc2VVbnNldChyZXN1bHQsIHBhdGhzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZlxuICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXRcbiAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d29cbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdiJzogJzInIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgYG9iamVjdGAgcHJvcGVydGllcyBgcHJlZGljYXRlYCByZXR1cm5zXG4gICAgICogdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLCBmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIHJldHVybiBbcHJvcF07XG4gICAgICB9KTtcbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHByb3BzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gcHJlZGljYXRlKHZhbHVlLCBwYXRoWzBdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYVxuICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmRcbiAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBsb29wIGlzIGVudGVyZWQgd2hlbiBwYXRoIGlzIGVtcHR5LlxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gMTtcbiAgICAgICAgb2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QgPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlLmNhbGwob2JqZWN0KSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHNcbiAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZVxuICAgICAqIGBwYXRoYCBjcmVhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy5zZXRXaXRoKG9iamVjdCwgJ1swXVsxXScsICdhJywgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaXRoKG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgXG4gICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzXG4gICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzXG4gICAgICogZm9yIGBvYmplY3RgIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcFxuICAgICAqIG9yIHNldCwgaXRzIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNJblxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnRvUGFpcnNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdLCBbJ2MnLCAzXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgdG9QYWlyc0luID0gY3JlYXRlVG9QYWlycyhrZXlzSW4pO1xuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd25cbiAgICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gICAgICogcHJvdmlkZWQsIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzYW1lIGBbW1Byb3RvdHlwZV1dYCB3aWxsIGJlIHVzZWQuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9LCBbXSk7XG4gICAgICogLy8gPT4gWzQsIDldXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXIob2JqZWN0KSB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7XG4gICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICAgIGlmIChpc0Fyckxpa2UpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHByb3BlcnR5IGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDcgfSB9XSB9O1xuICAgICAqIF8udW5zZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHRydWUgOiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNldGAgZXhjZXB0IHRoYXQgYWNjZXB0cyBgdXBkYXRlcmAgdG8gcHJvZHVjZSB0aGVcbiAgICAgKiB2YWx1ZSB0byBzZXQuIFVzZSBgXy51cGRhdGVXaXRoYCB0byBjdXN0b21pemUgYHBhdGhgIGNyZWF0aW9uLiBUaGUgYHVwZGF0ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICdhWzBdLmIuYycsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gKiBuOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ3hbMF0ueS56JywgZnVuY3Rpb24obikgeyByZXR1cm4gbiA/IG4gKyAxIDogMDsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlKG9iamVjdCwgcGF0aCwgdXBkYXRlcikge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXMobmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLnZhbHVlcygnaGknKTtcbiAgICAgKiAvLyA9PiBbJ2gnLCAnaSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eVxuICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiAtNVxuICAgICAqXG4gICAgICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICAgICAgdXBwZXIgPSB1cHBlciA9PT0gdXBwZXIgPyB1cHBlciA6IDA7XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTtcbiAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gICAgICogYGVuZGAgaXMgbm90IHNwZWNpZmllZCwgaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICAgICAqIElmIGBzdGFydGAgaXMgZ3JlYXRlciB0aGFuIGBlbmRgIHRoZSBwYXJhbXMgYXJlIHN3YXBwZWQgdG8gc3VwcG9ydFxuICAgICAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjMuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5yYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoLTMsIC0yLCAtNik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgIH1cbiAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICByZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZVxuICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDAsIDUpO1xuICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1KTtcbiAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTtcbiAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHtcbiAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7XG4gICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHVwcGVyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gdXBwZXI7XG4gICAgICAgICAgdXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA9PT0gdW5kZWZpbmVkICYmIHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB1cHBlciA9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7XG4gICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdXBwZXIgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBwZXIgPSB0b0Zpbml0ZSh1cHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciA+IHVwcGVyKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdXBwZXI7XG4gICAgICAgIHVwcGVyID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBsb3dlciAlIDEgfHwgdXBwZXIgJSAxKSB7XG4gICAgICAgIHZhciByYW5kID0gbmF0aXZlUmFuZG9tKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVNaW4obG93ZXIgKyAocmFuZCAqICh1cHBlciAtIGxvd2VyICsgZnJlZVBhcnNlRmxvYXQoJzFlLScgKyAoKHJhbmQgKyAnJykubGVuZ3RoIC0gMSkpKSksIHVwcGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmFuZG9tKGxvd2VyLCB1cHBlcik7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqL1xuICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlIGFuZCB0aGUgcmVtYWluaW5nXG4gICAgICogdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhcGl0YWxpemVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXBpdGFsaXplKCdGUkVEJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICAgIHJldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVidXJycyBgc3RyaW5nYCBieSBjb252ZXJ0aW5nXG4gICAgICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gICAgICogYW5kIFtMYXRpbiBFeHRlbmRlZC1BXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbl9FeHRlbmRlZC1BKVxuICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycyBhbmQgcmVtb3ZpbmdcbiAgICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVidXJyKCdkXHUwMEU5alx1MDBFMCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW5cbiAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpXG4gICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXFxzL2csICcgJylcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZm9yYmlkZGVuIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gYHZhcmlhYmxlYCwgdG8gcHJldmVudFxuICAgICAgLy8gcG90ZW50aWFsIGNvbW1hbmQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAgICBlbHNlIGlmIChyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycy50ZXN0KHZhcmlhYmxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gYmFzZVRyaW0oc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tIFwianVnZ2wtYXBpXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIEV2ZW50UmVmLCBNYXJrZG93blZpZXcsIFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEZlYXRoZXJJY29uLFxyXG4gIG9wZW5WaWV3LFxyXG4gIHdhaXQsXHJcbn0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgeyBCQ0FQSSB9IGZyb20gXCIuL0FQSVwiO1xyXG5pbXBvcnQgeyBEZWJ1Z2dlciB9IGZyb20gXCJzcmMvRGVidWdnZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwgfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0hpZXJhcmNoeU5vdGVzL0hpZXJOb3RlTW9kYWxcIjtcclxuaW1wb3J0IHsgZ2V0Q29kZWJsb2NrQ0IgfSBmcm9tIFwiLi9Db2RlYmxvY2tzXCI7XHJcbmltcG9ydCB7IGNvcHlHbG9iYWxJbmRleCwgY29weUxvY2FsSW5kZXggfSBmcm9tIFwiLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG5pbXBvcnQgeyBqdW1wVG9GaXJzdERpciB9IGZyb20gXCIuL0NvbW1hbmRzL2p1bXBUb0ZpcnN0RGlyXCI7XHJcbmltcG9ydCB7IHRocmVhZCB9IGZyb20gXCIuL0NvbW1hbmRzL3RocmVhZGluZ1wiO1xyXG5pbXBvcnQgeyB3cml0ZUJDc1RvQWxsRmlsZXMsIHdyaXRlQkNUb0ZpbGUgfSBmcm9tIFwiLi9Db21tYW5kcy9Xcml0ZUJDc1wiO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfU0VUVElOR1MsXHJcbiAgRFVDS19JQ09OLFxyXG4gIERVQ0tfSUNPTl9TVkcsXHJcbiAgRFVDS19WSUVXLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbiAgVFJBSUxfSUNPTl9TVkcsXHJcbiAgVFJFRV9WSUVXLFxyXG4gIEFQSV9OQU1FLFxyXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBGaWVsZFN1Z2dlc3RvciB9IGZyb20gXCIuL0ZpZWxkU3VnZ2VzdG9yXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ0FQSUksXHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIE15VmlldyxcclxuICBWaWV3SW5mbyxcclxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGJ1aWxkQ2xvc2VkRywgYnVpbGRNYWluRywgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IFJlbGF0aW9uU3VnZ2VzdG9yIH0gZnJvbSBcIi4vUmVsYXRpb25TdWdnZXN0b3JcIjtcclxuaW1wb3J0IHsgQkNTZXR0aW5nVGFiIH0gZnJvbSBcIi4vU2V0dGluZ3MvQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyB3YWl0Rm9yQ2FjaGUgfSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCBEdWNrc1ZpZXcgZnJvbSBcIi4vVmlld3MvRHVja3NWaWV3XCI7XHJcbmltcG9ydCBNYXRyaXhWaWV3IGZyb20gXCIuL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHsgZHJhd1RyYWlsIH0gZnJvbSBcIi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbmltcG9ydCBUcmVlVmlldyBmcm9tIFwiLi9WaWV3cy9UcmVlVmlld1wiO1xyXG5pbXBvcnQgeyBCQ1N0b3JlIH0gZnJvbSBcIi4vVmlzdWFsaXNhdGlvbnMvSnVnZ2xcIjtcclxuaW1wb3J0IHsgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXN1YWxpc2F0aW9ucy9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzO1xyXG5cclxuICB2aXNpdGVkOiBbc3RyaW5nLCBIVE1MRGl2RWxlbWVudF1bXSA9IFtdO1xyXG5cclxuICBtYWluRzogTXVsdGlHcmFwaDtcclxuICBjbG9zZWRHOiBNdWx0aUdyYXBoO1xyXG5cclxuICBhY3RpdmVMZWFmQ2hhbmdlOiBFdmVudFJlZiA9IHVuZGVmaW5lZDtcclxuICBsYXlvdXRDaGFuZ2U6IEV2ZW50UmVmID0gdW5kZWZpbmVkO1xyXG5cclxuICBkYjogRGVidWdnZXI7XHJcblxyXG4gIFZJRVdTOiBWaWV3SW5mb1tdO1xyXG5cclxuICBhcGk6IEJDQVBJSTtcclxuICBwcml2YXRlIGJjU3RvcmU6IEJDU3RvcmU7XHJcblxyXG4gIHJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCkge1xyXG4gICAgdGhpcy5hY3RpdmVMZWFmQ2hhbmdlID0gYXBwLndvcmtzcGFjZS5vbihcclxuICAgICAgXCJmaWxlLW9wZW5cIixcclxuICAgICAgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVDaGFuZ2UpIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKTtcclxuICAgICAgICAgIGlmIChhY3RpdmVWaWV3KSBhd2FpdCBhY3RpdmVWaWV3LmRyYXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hY3RpdmVMZWFmQ2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyTGF5b3V0Q2hhbmdlRXZlbnQoKSB7XHJcbiAgICB0aGlzLmxheW91dENoYW5nZSA9IGFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5sYXlvdXRDaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nIGJyZWFkY3J1bWJzIHBsdWdpblwiKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBCQ1NldHRpbmdUYWIodGhpcykpO1xyXG5cclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIodGhpcyk7XHJcblxyXG4gICAgY29uc3QgeyBzZXR0aW5ncyB9ID0gdGhpcztcclxuICAgIGNvbnN0IHtcclxuICAgICAgZmllbGRTdWdnZXN0b3IsXHJcbiAgICAgIGVuYWJsZVJlbGF0aW9uU3VnZ2VzdG9yLFxyXG4gICAgICBvcGVuTWF0cml4T25Mb2FkLFxyXG4gICAgICBvcGVuRHVja09uTG9hZCxcclxuICAgICAgb3BlbkRvd25PbkxvYWQsXHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIHVzZXJIaWVycyxcclxuICAgIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgICBpZiAoZmllbGRTdWdnZXN0b3IpIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBGaWVsZFN1Z2dlc3Rvcih0aGlzKSk7XHJcbiAgICBpZiAoZW5hYmxlUmVsYXRpb25TdWdnZXN0b3IpXHJcbiAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JTdWdnZXN0KG5ldyBSZWxhdGlvblN1Z2dlc3Rvcih0aGlzKSk7XHJcblxyXG5cclxuICAgIC8vIE92ZXJyaWRlIG9sZGVyIHZlcnNpb25zIG9mIHRoZXNlIHNldHRpbmdzXHJcbiAgICBpZiAoc2V0dGluZ3MubGltaXRUcmFpbENoZWNrYm94ZXMubGVuZ3RoID09PSAwKSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcyA9IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzLnNob3dBbGwgPT09ICdib29sZWFuJykgc2V0dGluZ3Muc2hvd0FsbCA9IHNldHRpbmdzLnNob3dBbGwgPyAnQWxsJyA6ICdTaG9ydGVzdCdcclxuXHJcbiAgICB0aGlzLlZJRVdTID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgcGxhaW46IFwiTWF0cml4XCIsXHJcbiAgICAgICAgdHlwZTogTUFUUklYX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IE1hdHJpeFZpZXcsXHJcbiAgICAgICAgb3Blbk9uTG9hZDogb3Blbk1hdHJpeE9uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkR1Y2tcIixcclxuICAgICAgICB0eXBlOiBEVUNLX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IER1Y2tzVmlldyxcclxuICAgICAgICBvcGVuT25Mb2FkOiBvcGVuRHVja09uTG9hZCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHBsYWluOiBcIkRvd25cIixcclxuICAgICAgICB0eXBlOiBUUkVFX1ZJRVcsXHJcbiAgICAgICAgY29uc3RydWN0b3I6IFRyZWVWaWV3LFxyXG4gICAgICAgIG9wZW5PbkxvYWQ6IG9wZW5Eb3duT25Mb2FkLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgY29uc3RydWN0b3IsIHR5cGUgfSBvZiB0aGlzLlZJRVdTKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KHR5cGUsIChsZWFmKSA9PiBuZXcgY29uc3RydWN0b3IobGVhZiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEljb24oRFVDS19JQ09OLCBEVUNLX0lDT05fU1ZHKTtcclxuICAgIGFkZEljb24oVFJBSUxfSUNPTiwgVFJBSUxfSUNPTl9TVkcpO1xyXG5cclxuICAgIGF3YWl0IHdhaXRGb3JDYWNoZSh0aGlzKTtcclxuICAgIHRoaXMubWFpbkcgPSBhd2FpdCBidWlsZE1haW5HKHRoaXMpO1xyXG4gICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG5cclxuICAgIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgICAgaWYgKHRoaXMubWFpbkc/Lm5vZGVzKCkubGVuZ3RoIDwgbm9GaWxlcykge1xyXG4gICAgICAgIGF3YWl0IHdhaXQoMzAwMCk7XHJcbiAgICAgICAgdGhpcy5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jbG9zZWRHID0gYnVpbGRDbG9zZWRHKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IHsgb3Blbk9uTG9hZCwgdHlwZSwgY29uc3RydWN0b3IgfSBvZiB0aGlzLlZJRVdTKVxyXG4gICAgICAgIGlmIChvcGVuT25Mb2FkKSBhd2FpdCBvcGVuVmlldyh0eXBlLCBjb25zdHJ1Y3Rvcik7XHJcblxyXG4gICAgICBpZiAoc2hvd0JDcykgYXdhaXQgZHJhd1RyYWlsKHRoaXMpO1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyQWN0aXZlTGVhZkNoYW5nZUV2ZW50KCk7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJMYXlvdXRDaGFuZ2VFdmVudCgpO1xyXG5cclxuICAgICAgLy8gU291cmNlIGZvciBzYXZlIHNldHRpbmdcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hpcHN0ZXJzbW9vdGhpZS9vYnNpZGlhbi1wbHVnaW4tcHJldHRpZXIvYmxvYi9tYWluL3NyYy9tYWluLnRzXHJcbiAgICAgIGNvbnN0IHNhdmVDb21tYW5kRGVmaW5pdGlvbiA9XHJcbiAgICAgICAgYXBwLmNvbW1hbmRzLmNvbW1hbmRzW1wiZWRpdG9yOnNhdmUtZmlsZVwiXTtcclxuICAgICAgY29uc3Qgc2F2ZSA9IHNhdmVDb21tYW5kRGVmaW5pdGlvbj8uY2FsbGJhY2s7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHNhdmUgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgIHNhdmVDb21tYW5kRGVmaW5pdGlvbi5jYWxsYmFjayA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIGF3YWl0IHNhdmUoKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJlZnJlc2hPbk5vdGVTYXZlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IHRoaXMuZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlVmlldykgYXdhaXQgYWN0aXZlVmlldy5kcmF3KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XHJcbiAgICAgICAgaWYgKGxlYWYgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpXHJcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgIGxlYWYudmlldy5wcmV2aWV3TW9kZS5yZXJlbmRlcih0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHsgdHlwZSwgcGxhaW4sIGNvbnN0cnVjdG9yIH0gb2YgdGhpcy5WSUVXUykge1xyXG4gICAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICAgIGlkOiBgc2hvdy0ke3R5cGV9LXZpZXdgLFxyXG4gICAgICAgIG5hbWU6IGBPcGVuICR7cGxhaW59IFZpZXdgLFxyXG4gICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgIGNoZWNrQ2FsbGJhY2s6IGFzeW5jIChjaGVja2luZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoZWNraW5nKSByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSkubGVuZ3RoID09PSAwO1xyXG4gICAgICAgICAgYXdhaXQgb3BlblZpZXcodHlwZSwgY29uc3RydWN0b3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIm9wZW4tdmlzLW1vZGFsXCIsXHJcbiAgICAgIG5hbWU6IFwiT3BlbiBWaXN1YWxpc2F0aW9uIE1vZGFsXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgVmlzTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwibWFuaXB1bGF0ZS1oaWVyYXJjaHktbm90ZXNcIixcclxuICAgICAgbmFtZTogXCJBZGp1c3QgSGllcmFyY2h5IE5vdGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiBuZXcgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwodGhpcykub3BlbigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6IFwiUmVmcmVzaC1CcmVhZGNydW1icy1JbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIlJlZnJlc2ggQnJlYWRjcnVtYnMgSW5kZXhcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHJlZnJlc2hJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcIlRvZ2dsZS10cmFpbC1pbi1FZGl0JkxQXCIsXHJcbiAgICAgIG5hbWU6IFwiVG9nZ2xlOiBTaG93IFRyYWlsL0dyaWQgaW4gRWRpdCAmIExQIG1vZGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QkNzSW5FZGl0TFBNb2RlID0gIXNldHRpbmdzLnNob3dCQ3NJbkVkaXRMUE1vZGU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBkcmF3VHJhaWwodGhpcyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1DdXJyZW50LUZpbGVcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byBDdXJyZW50IEZpbGVcIixcclxuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHdyaXRlQkNUb0ZpbGUodGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJXcml0ZS1CcmVhZGNydW1icy10by1BbGwtRmlsZXNcIixcclxuICAgICAgbmFtZTogXCJXcml0ZSBCcmVhZGNydW1icyB0byAqKkFMTCoqIEZpbGVzXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCB3cml0ZUJDc1RvQWxsRmlsZXModGhpcyksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogXCJsb2NhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBMb2NhbCBJbmRleCB0byB0aGUgY2xpcGJvYXJkXCIsXHJcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBjb3B5TG9jYWxJbmRleCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiBcImdsb2JhbC1pbmRleFwiLFxyXG4gICAgICBuYW1lOiBcIkNvcHkgYSBHbG9iYWwgSW5kZXggdG8gdGhlIGNsaXBib2FyZFwiLFxyXG4gICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4gYXdhaXQgY29weUdsb2JhbEluZGV4KHRoaXMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgW1widXBcIiwgXCJkb3duXCIsIFwibmV4dFwiLCBcInByZXZcIl0uZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgaWQ6IGBqdW1wLXRvLWZpcnN0LSR7ZGlyfWAsXHJcbiAgICAgICAgbmFtZTogYEp1bXAgdG8gZmlyc3QgJyR7ZGlyfSdgLFxyXG4gICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiBhd2FpdCBqdW1wVG9GaXJzdERpcih0aGlzLCBkaXIpLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmZvckVhY2goKGZpZWxkOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgICBpZDogYG5ldy1maWxlLXdpdGgtY3Vyci1hcy0ke2ZpZWxkfWAsXHJcbiAgICAgICAgbmFtZTogYENyZWF0ZSBhIG5ldyAnJHtmaWVsZH0nIGZyb20gdGhlIGN1cnJlbnQgbm90ZWAsXHJcbiAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRocmVhZCh0aGlzLCBmaWVsZCksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKFxyXG4gICAgICBhZGRGZWF0aGVySWNvbihcInR2XCIpIGFzIHN0cmluZyxcclxuICAgICAgXCJCcmVhZGNydW1icyBWaXN1YWxpc2F0aW9uXCIsXHJcbiAgICAgICgpID0+IG5ldyBWaXNNb2RhbCh0aGlzKS5vcGVuKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFxyXG4gICAgICBcImJyZWFkY3J1bWJzXCIsXHJcbiAgICAgIGdldENvZGVibG9ja0NCKHRoaXMpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGp1Z2dsUGx1Z2luID0gZ2V0UGx1Z2luKGFwcCk7XHJcbiAgICBpZiAoanVnZ2xQbHVnaW4pIHtcclxuICAgICAgdGhpcy5iY1N0b3JlID0gbmV3IEJDU3RvcmUodGhpcy5tYWluRywgYXBwLm1ldGFkYXRhQ2FjaGUpO1xyXG4gICAgICBqdWdnbFBsdWdpbi5yZWdpc3RlclN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcGkgPSBuZXcgQkNBUEkodGhpcyk7XHJcbiAgICAvLyBSZWdpc3RlciBBUEkgdG8gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXHJcbiAgICAod2luZG93W0FQSV9OQU1FXSA9IHRoaXMuYXBpKSAmJlxyXG4gICAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IGRlbGV0ZSB3aW5kb3dbQVBJX05BTUVdKTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZVRZUEVWaWV3KHR5cGU6IHN0cmluZyk6IE15VmlldyB8IG51bGwge1xyXG4gICAgY29uc3QgeyBjb25zdHJ1Y3RvciB9ID0gdGhpcy5WSUVXUy5maW5kKCh2aWV3KSA9PiB2aWV3LnR5cGUgPT09IHR5cGUpO1xyXG4gICAgY29uc3QgbGVhdmVzID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSk7XHJcbiAgICBpZiAobGVhdmVzICYmIGxlYXZlcy5sZW5ndGggPj0gMSkge1xyXG4gICAgICBjb25zdCB7IHZpZXcgfSA9IGxlYXZlc1swXTtcclxuICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcikgcmV0dXJuIHZpZXc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGxvYWRTZXR0aW5ncyA9IGFzeW5jICgpID0+XHJcbiAgKHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKFxyXG4gICAge30sXHJcbiAgICBERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpXHJcbiAgKSk7XHJcblxyXG4gIHNhdmVTZXR0aW5ncyA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblxyXG4gIG9udW5sb2FkKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJ1bmxvYWRpbmdcIik7XHJcbiAgICB0aGlzLlZJRVdTLmZvckVhY2goYXN5bmMgKHZpZXcpID0+IHtcclxuICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlldy50eXBlKS5mb3JFYWNoKChsZWFmKSA9PiB7XHJcbiAgICAgICAgbGVhZi5kZXRhY2goKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZpc2l0ZWQuZm9yRWFjaCgodmlzaXQpID0+IHZpc2l0WzFdLnJlbW92ZSgpKTtcclxuICAgIGlmICh0aGlzLmJjU3RvcmUpIHtcclxuICAgICAgY29uc3QganVnZ2xQbHVnaW4gPSBnZXRQbHVnaW4oYXBwKTtcclxuICAgICAgaWYgKGp1Z2dsUGx1Z2luKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGp1Z2dsUGx1Z2luLnJlbW92ZVN0b3JlKHRoaXMuYmNTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXJUYWdzLCBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IENBVF9EQU5HTElORyA9ICdkYW5nbGluZyc7XG5jb25zdCBDT1JFX1NUT1JFX0lEID0gJ2NvcmUnO1xuY2xhc3MgVml6SWQge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdG9yZUlkID0gc3RvcmVJZDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnN0b3JlSWR9OiR7dGhpcy5pZH1gO1xuICAgIH1cbiAgICB0b0lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUlkKGlkKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gaWQuc3BsaXQoJzonKTtcbiAgICAgICAgY29uc3Qgc3RvcmVJZCA9IHNwbGl0WzBdO1xuICAgICAgICBjb25zdCBfaWQgPSBzcGxpdC5zbGljZSgxKS5qb2luKCc6Jyk7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoX2lkLCBzdG9yZUlkKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21Ob2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZpeklkLmZyb21JZChub2RlLmlkKCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU5vZGVzKG5vZGVzKSB7XG4gICAgICAgIHJldHVybiBub2Rlcy5tYXAoKG4pID0+IFZpeklkLmZyb21Ob2RlKG4pKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21GaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaXpJZChmaWxlLm5hbWUsICdjb3JlJyk7XG4gICAgfVxuICAgIHN0YXRpYyB0b0lkKGlkLCBzdG9yZUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgVml6SWQoaWQsIHN0b3JlSWQpLnRvSWQoKTtcbiAgICB9XG59XG5jb25zdCBfcGFyc2VUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLnRhZ3NcbiAgICAgICAgLm1hcCgodGFnKSA9PiB7XG4gICAgICAgIHRhZyA9IHRhZy5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgaFNwbGl0ID0gdGFnLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGhTcGxpdCkge1xuICAgICAgICAgICAgY29uc3QgaFRhZyA9IGhTcGxpdC5zbGljZSgwLCBwYXJzZUludChpKSArIDEpLmpvaW4oJy0nKTtcbiAgICAgICAgICAgIHRhZ3MucHVzaChgdGFnLSR7aFRhZ31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFncztcbiAgICB9KSk7XG59O1xuY29uc3QgZ2V0Q2xhc3NlcyA9IGZ1bmN0aW9uIChmaWxlLCBtZXRhZGF0YUNhY2hlKSB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICAgICAgICBpZiAoWydwbmcnLCAnanBnJywgJ2pwZWcnLCAnZ2lmJywgJ2JtcCcsICdzdmcnLCAndGlmZiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpbWFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFsnbXAzJywgJ3dlYm0nLCAnd2F2JywgJ200YScsICdvZ2cnLCAnM2dwJywgJ2ZsYWMnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnYXVkaW8nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChbJ21wNCcsICd3ZWJtJywgJ29ndiddLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCd2aWRlbycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbGUuZXh0ZW5zaW9uID09PSAncGRmJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdwZGYnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIHJlcGxhY2VkIGJ5IHRoZSAncGF0aCcgZGF0YSBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGlmICghKGZpbGUucGFyZW50Lm5hbWUgPT09ICcvJyB8fCBmaWxlLnBhcmVudC5uYW1lID09PSAnJykpIHtcbiAgICAgICAgLy8gICBjbGFzc2VzLnB1c2goYGZvbGRlci0ke2ZpbGUucGFyZW50Lm5hbWVcbiAgICAgICAgLy8gICAgICAgLnJlcGxhY2UoJyAnLCAnXycpfWApO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIGNsYXNzZXMucHVzaCgncm9vdCcpO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJykge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdub3RlJyk7XG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlPy5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgIGlmICgnaW1hZ2UnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCd0YWdzJyBpbiBjYWNoZS5mcm9udG1hdHRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gcGFyc2VGcm9udE1hdHRlclRhZ3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3ModGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgnY3NzY2xhc3MnIGluIGNhY2hlLmZyb250bWF0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXp6ZXMgPSBwYXJzZUZyb250TWF0dGVyU3RyaW5nQXJyYXkoY2FjaGUuZnJvbnRtYXR0ZXIsICdjc3NjbGFzcycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenplcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLmNsYXp6ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhY2hlPy50YWdzKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKC4uLl9wYXJzZVRhZ3MoY2FjaGUudGFncy5tYXAoKHQpID0+IHQudGFnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBbQ0FUX0RBTkdMSU5HXTtcbn07XG5jb25zdCBub2RlRnJvbUZpbGUgPSBhc3luYyBmdW5jdGlvbiAoZmlsZSwgcGx1Z2luLCBzZXR0aW5ncywgaWQpIHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICAgIGlkID0gVml6SWQudG9JZChmaWxlLm5hbWUsIENPUkVfU1RPUkVfSUQpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IHBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnID8gZmlsZS5iYXNlbmFtZSA6IGZpbGUubmFtZTtcbiAgICBjb25zdCBjbGFzc2VzID0gZ2V0Q2xhc3NlcyhmaWxlLCBwbHVnaW4uYXBwLm1ldGFkYXRhQ2FjaGUpLmpvaW4oJyAnKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aDogZmlsZS5wYXRoLFxuICAgIH07XG4gICAgaWYgKFsncG5nJywgJ2pwZycsICdqcGVnJywgJ2dpZicsICdibXAnLCAnc3ZnJywgJ3RpZmYnXS5jb250YWlucyhmaWxlLmV4dGVuc2lvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRhdGFbJ3Jlc291cmNlX3VybCddID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoZmlsZS5wYXRoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHsgfVxuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucmVhZENvbnRlbnQgJiYgZmlsZS5leHRlbnNpb24gPT0gJ21kJykge1xuICAgICAgICBkYXRhWydjb250ZW50J10gPSBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgfVxuICAgIGNvbnN0IGZyb250bWF0dGVyID0gY2FjaGU/LmZyb250bWF0dGVyO1xuICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICBPYmplY3Qua2V5cyhmcm9udG1hdHRlcikuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCEoayA9PT0gJ3Bvc2l0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoayA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUZpZWxkID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB1cmwuIHRocm93cyBlcnJvciBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW1hZ2VGaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gaW1hZ2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwbHVnaW4uc2V0dGluZ3MuaW1nU2VydmVyUG9ydH0vJHtlbmNvZGVVUkkoaW1hZ2VGaWVsZCl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tdID0gZnJvbnRtYXR0ZXJba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdub2RlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5jb25zdCBub2RlRGFuZ2xpbmcgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwOiAnbm9kZXMnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpZDogVml6SWQudG9JZChwYXRoLCBDT1JFX1NUT1JFX0lEKSxcbiAgICAgICAgICAgIG5hbWU6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzZXM6ICdkYW5nbGluZycsXG4gICAgfTtcbn07XG5jb25zdCB3aWtpbGlua1JlZ2V4ID0gJ1xcXFxbXFxcXFsoW15cXFxcXVxcXFxyXFxcXG5dKz8pXFxcXF1cXFxcXSc7XG5jb25zdCBuYW1lUmVnZXggPSAnW15cXFxcV1xcXFxkXVxcXFx3Kic7XG5jb25zdCByZWdleEVzY2FwZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xufTtcbmNvbnN0IHBhcnNlVHlwZWRMaW5rID0gZnVuY3Rpb24gKGxpbmssIGxpbmUsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgc29tZXRoaW5nIHNwZWNpZmljIEkgdXNlLCBidXQgc2hvdWxkbid0IGtlZXAgYmVpbmcgaW4gdGhpcyByZXBvLlxuICAgIGNvbnN0IHJlZ2V4UHVibGlzaGVkSW4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleEVzY2FwZSh0eXBlZExpbmtQcmVmaXgpfSAocHVibGlzaGVkSW4pIChcXFxcZFxcXFxkXFxcXGRcXFxcZCkgKCR7d2lraWxpbmtSZWdleH0sPyAqKSskYCk7XG4gICAgY29uc3QgbWF0Y2hQSSA9IHJlZ2V4UHVibGlzaGVkSW4uZXhlYyhsaW5lKTtcbiAgICBpZiAoIShtYXRjaFBJID09PSBudWxsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3M6ICd0eXBlLXB1Ymxpc2hlZEluJyxcbiAgICAgICAgICAgIGlzSW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICB5ZWFyOiBtYXRjaFBJWzJdLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwdWJsaXNoZWRJbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBJbnR1aXRpb246IFN0YXJ0IHdpdGggdGhlIHR5cGVkIGxpbmsgcHJlZml4LiBUaGVuIGEgbmVvNGogbmFtZSAobmFtZVJlZ2V4KS5cbiAgICAvLyBUaGVuIG9uZSBvciBtb3JlIG9mIHRoZSB3aWtpbGluayBncm91cDogd2lraWxpbmsgcmVnZXggc2VwYXJhdGVkIGJ5IG9wdGlvbmFsIGNvbW1hIGFuZCBtdWx0aXBsZSBzcGFjZXNcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4RXNjYXBlKHR5cGVkTGlua1ByZWZpeCl9ICgke25hbWVSZWdleH0pICgke3dpa2lsaW5rUmVnZXh9LD8gKikrJGApO1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKTtcbiAgICBjb25zdCBzcGxpdExpbmsgPSBsaW5rLm9yaWdpbmFsLnNwbGl0KCd8Jyk7XG4gICAgbGV0IGFsaWFzID0gbnVsbDtcbiAgICBpZiAoc3BsaXRMaW5rLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgYWxpYXMgPSBzcGxpdExpbmsuc2xpY2UoMSkuam9pbigpLnNsaWNlKDAsIC0yKTtcbiAgICB9XG4gICAgaWYgKCEobWF0Y2ggPT09IG51bGwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbGFzczogYHR5cGUtJHttYXRjaFsxXX1gLFxuICAgICAgICAgICAgaXNJbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIGFsaWFzOiBhbGlhcyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbmNvbnN0IHBhcnNlUmVmQ2FjaGUgPSBmdW5jdGlvbiAocmVmLCBjb250ZW50LCBpZCwgc291cmNlLCB0YXJnZXQsIHR5cGVkTGlua1ByZWZpeCkge1xuICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W3JlZi5wb3NpdGlvbi5zdGFydC5saW5lXTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbnRleHQ6IGxpbmUsXG4gICAgICAgIGVkZ2VDb3VudDogMSxcbiAgICB9O1xuICAgIGNvbnN0IHNwbGl0TGluayA9IHJlZi5vcmlnaW5hbC5zcGxpdCgnfCcpO1xuICAgIGlmIChzcGxpdExpbmsubGVuZ3RoID4gMSkge1xuICAgICAgICBkYXRhWydhbGlhcyddID0gc3BsaXRMaW5rLnNsaWNlKDEpLmpvaW4oKS5zbGljZSgwLCAtMik7XG4gICAgfVxuICAgIGxldCBjbGFzc2VzID0gJyc7XG4gICAgY29uc3QgdHlwZWRMaW5rID0gcGFyc2VUeXBlZExpbmsocmVmLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xuICAgIGlmICh0eXBlZExpbmsgPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NlcyA9IGAke2NsYXNzZXN9IGlubGluZWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkYXRhID0geyAuLi50eXBlZExpbmsucHJvcGVydGllcywgLi4uZGF0YSB9O1xuICAgICAgICBjbGFzc2VzID0gYCR7Y2xhc3Nlc30gJHt0eXBlZExpbmsuY2xhc3N9YDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXA6ICdlZGdlcycsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXMsXG4gICAgfTtcbn07XG5cbmNvbnN0IGdldFBsdWdpbiA9IGZ1bmN0aW9uIChhcHApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCdqdWdnbCcgaW4gYXBwLnBsdWdpbnMucGx1Z2lucykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBhcHAucGx1Z2lucy5wbHVnaW5zWydqdWdnbCddO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCB7IFZpeklkLCBnZXRDbGFzc2VzLCBnZXRQbHVnaW4sIG5vZGVEYW5nbGluZywgbm9kZUZyb21GaWxlLCBwYXJzZVJlZkNhY2hlLCBwYXJzZVR5cGVkTGluayB9O1xuIiwgIi8qKlxyXG4gKiBUaGlzIG1vZHVsZSBjb250YWlucyB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGNvbW1vbmx5IHVzZWQgaW4gT2JzaWRpYW4gcGx1Z2lucy5cclxuICogQG1vZHVsZSBvYnNpZGlhbi1jb21tdW5pdHktbGliXHJcbiAqL1xyXG5pbXBvcnQgKiBhcyBmZWF0aGVyIGZyb20gXCJmZWF0aGVyLWljb25zXCI7XHJcbmltcG9ydCB7IGFkZEljb24sIE1hcmtkb3duUmVuZGVyZXIsIE1hcmtkb3duVmlldywgTW9kYWwsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgcmVxdWVzdCwgVEZpbGUsIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbi8qKlxyXG4gKiBZb3UgY2FuIGF3YWl0IHRoaXMgRnVuY3Rpb24gdG8gZGVsYXkgZXhlY3V0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gbXNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0KGRlbGF5KSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcclxufVxyXG4vKipcclxuICogQWRkcyBhbGwgb2ZmaWNpYWwgRmVhdGhlciBJY29ucyB0byBPYnNpZGlhbi5cclxuICogaHR0cHM6Ly9mZWF0aGVyaWNvbnMuY29tL1xyXG4gKlxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKlxyXG4gKiBAZGVwcmVjYXRlZCBBcyBvZiBPYnNpZGlhbiAwLjEzLjI3IHRoaXMgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYmVjYXVzZSBPYnNpZGlhbiBzaGlwcyB3aXRoIGBsdWNpZGVgLCBhIG1haW50YWluZWQgZm9yayBvZiBmZWF0aGVyLiAoaHR0cHM6Ly9sdWNpZGUuZGV2LylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGxGZWF0aGVySWNvbnMoYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBPYmplY3QudmFsdWVzKGZlYXRoZXIuaWNvbnMpLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgICBjb25zdCBzdmcgPSBpLnRvU3ZnKGF0dHIpO1xyXG4gICAgICAgIGFkZEljb24oYGZlYXRoZXItJHtpLm5hbWV9YCwgc3ZnKTtcclxuICAgIH0pO1xyXG59XHJcbi8qKlxyXG4gKiBBZGRzIGEgc3BlY2lmaWMgRmVhdGhlciBJY29uIHRvIE9ic2lkaWFuLlxyXG4gKlxyXG4gKiBAcGFyYW0gbmFtZSBvZmZpY2lhbCBOYW1lIG9mIHRoZSBJY29uIChodHRwczovL2ZlYXRoZXJpY29ucy5jb20vKVxyXG4gKiBAcGFyYW0gYXR0ciBTVkcgQXR0cmlidXRlcyBmb3IgdGhlIEljb24uIFRoZSBkZWZhdWx0IHNob3VsZCB3b3JrIGZvciBtb3N0IHVzZWNhc2VzLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBJY29uIG5hbWVcclxuICpcclxuICogQGRlcHJlY2F0ZWQgQXMgb2YgT2JzaWRpYW4gMC4xMy4yNyB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQsIGJlY2F1c2UgT2JzaWRpYW4gc2hpcHMgd2l0aCBgbHVjaWRlYCwgYSBtYWludGFpbmVkIGZvcmsgb2YgZmVhdGhlci4gKGh0dHBzOi8vbHVjaWRlLmRldi8pXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkRmVhdGhlckljb24obmFtZSwgYXR0ciA9IHsgdmlld0JveDogXCIwIDAgMjQgMjRcIiwgd2lkdGg6IFwiMTAwXCIsIGhlaWdodDogXCIxMDBcIiB9KSB7XHJcbiAgICBpZiAoZmVhdGhlci5pY29uc1tuYW1lXSkge1xyXG4gICAgICAgIGNvbnN0IGljb25OYW1lID0gYGZlYXRoZXItJHtuYW1lfWA7XHJcbiAgICAgICAgYWRkSWNvbihpY29uTmFtZSwgZmVhdGhlci5pY29uc1tuYW1lXS50b1N2ZyhhdHRyKSk7XHJcbiAgICAgICAgcmV0dXJuIGljb25OYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoYFRoaXMgSWNvbiAoJHtuYW1lfSkgZG9lc24ndCBleGlzdCBpbiB0aGUgRmVhdGhlciBMaWJyYXJ5LmApO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDb252ZXJ0IGEgYmFzZTY0IFN0cmluZyB0byBhbiBBcnJheUJ1ZmZlci5cclxuICogWW91IGNhbiB0aGVuIHVzZSB0aGUgQXJyYXlCdWZmZXIgdG8gc2F2ZSB0aGUgYXNzZXQgdG8gZGlzay5cclxuICpcclxuICogQHBhcmFtIGJhc2U2NCBiYXNlNjQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cclxuICogQHJldHVybnMgQXJyYXlCdWZmZXJcclxuICogQGRlcHJlY2F0ZWQgT2JzaWRpYW4gb2ZmZXJzIGl0J3Mgb3duIG1ldGhvZCBhcyBvZiAwLjE0LjVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xyXG4gICAgY29uc3QgYmluYXJ5X3N0cmluZyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlfc3RyaW5nLmxlbmd0aDtcclxuICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlfc3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCBmb3IgYW4gdW5kb2N1bWVudGVkIEFQSSBvZiBPYnNpZGlhbi5cclxuICpcclxuICogQHBhcmFtIGZpbGVOYW1lIFRoZSBGaWxlbmFtZSBmb3IgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBmb3JtYXQgVGhlIEZpbGVmb3JtYXQgb2YgeW91ciBBdHRhY2htZW50XHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlIFRoZSBTb3VyY2VmaWxlIGZyb20gd2hlcmUgdGhlIEF0dGFjaG1lbnQgZ2V0cyBhZGRlZCwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgQXR0YWNobWVudCBGb2xkZXIgbWlnaHQgYmUgZGlmZmVyZW50IGJhc2VkIG9uIHdoZXJlIGl0IGdldHMgaW5zZXJ0ZWQuXHJcbiAqIEByZXR1cm5zIFRoZSBBdHRhY2htZW50IFBhdGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoZmlsZU5hbWUsIGZvcm1hdCwgc291cmNlRmlsZSkge1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICByZXR1cm4gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgZm9ybWF0LCBzb3VyY2VGaWxlKTtcclxufVxyXG4vKipcclxuICogQ29weSBgY29udGVudGAgdG8gdGhlIHVzZXJzIGNsaXBib2FyZC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gYmUgY29waWVkIHRvIGNsaXBib2FyZC5cclxuICogQHBhcmFtIHsoKSA9PiBhbnl9IHN1Y2Nlc3MgVGhlIGNhbGxiYWNrIHRvIHJ1biB3aGVuIHRleHQgaXMgc3VjY2Vzc2Z1bGx5IGNvcGllZC4gRGVmYXVsdCB0aHJvd3MgYSBuZXcgYE5vdGljZWBcclxuICogQHBhcmFtIHsocmVhc29uPykgPT4gYW55fSBmYWlsdXJlIFRoZSBjYWxsYmFjayB0byBydW4gd2hlbiB0ZXh0IHdhcyBub3QgYWJsZSB0byBiZSBjb3BpZWQuIERlZmF1bHQgdGhyb3dzIGEgbmV3IGBOb3RpY2VgLCBhbmQgY29uc29sZSBsb2dzIHRoZSBlcnJvci5gXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weShjb250ZW50LCBzdWNjZXNzID0gKCkgPT4gbmV3IE5vdGljZShcIkNvcGllZCB0byBjbGlwYm9hcmRcIiksIGZhaWx1cmUgPSAocmVhc29uKSA9PiB7XHJcbiAgICBuZXcgTm90aWNlKFwiQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkXCIpO1xyXG4gICAgY29uc29sZS5sb2coeyByZWFzb24gfSk7XHJcbn0pIHtcclxuICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnQpLnRoZW4oc3VjY2VzcywgZmFpbHVyZSk7XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGFuIGVkaXRvciwgY2hlY2sgaWYgc29tZXRoaW5nIGlzIHNlbGVjdGVkIGFuZCByZXR1cm4gdGhhdCBzZWxlY3Rpb24sIG90aGVyd2lzZSByZXR1cm4gdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBlZGl0b3JcclxuICogQHBhcmFtICB7RWRpdG9yfSBlZGl0b3JcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3Rpb25Gcm9tRWRpdG9yKGVkaXRvcikge1xyXG4gICAgaWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpKVxyXG4gICAgICAgIHJldHVybiBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGVkaXRvci5nZXRWYWx1ZSgpO1xyXG59XHJcbi8qKlxyXG4gKiBDaGVjayBpZiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSBhbmQgcmV0dXJuIHRoYXQgc2VsZWN0aW9uLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcGFyYW0gIHtib29sZWFufSBbY2FjaGVkPXRydWVdIFVzZSBgY2FjaGVkUmVhZGAgb3IgYHJlYWRgLiBgY2FjaGVkUmVhZGAgYnkgZGVmYXVsdC5cclxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IGBudWxsYCBpZiBub3QgZm9jdXNzZWQgb24gYSBtYXJrZG93biBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uRnJvbUN1cnJGaWxlKGNhY2hlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHRleHQgPSAoX2EgPSB3aW5kb3cgPT09IG51bGwgfHwgd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpO1xyXG4gICAgaWYgKHRleHQpXHJcbiAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEFjdGl2ZUZpbGVDb250ZW50KGNhY2hlZCk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBub3RlTmFtZWAgaXMgdGhlIG5hbWUgb2YgYSBub3RlIHRoYXQgZXhpc3RzIGluIHRoZSB2YXVsdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSBub3RlTmFtZSBCYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBzZWFyY2ggZm9yLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IFtzb3VyY2VQYXRoPVwiXCJdIE9wdGlvbmFsIGZpbGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS4gRGVmYXVsdCBpcyB0aGUgY3VycmVudCBmaWxlLlxyXG4gKiBAcmV0dXJucyBib29sZWFuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJblZhdWx0ID0gKG5vdGVOYW1lLCBzb3VyY2VQYXRoID0gXCJcIikgPT4gISFhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlTmFtZSwgc291cmNlUGF0aCk7XHJcbi8qKlxyXG4gKiBXaGVuIGhvdmVyaW5nIGEgbGluayBnb2luZyB0byBgdG9gLCBzaG93IHRoZSBPYnNpZGlhbiBob3Zlci1wcmV2aWV3IG9mIHRoYXQgbm90ZS5cclxuICpcclxuICogWW91IHByb2JhYmx5IGhhdmUgdG8gaG9sZCBkb3duIGBDdHJsYCB3aGVuIGhvdmVyaW5nIHRoZSBsaW5rIGZvciB0aGUgcHJldmlldyB0byBhcHBlYXIhXHJcbiAqIEBwYXJhbSAge01vdXNlRXZlbnR9IGV2ZW50XHJcbiAqIEBwYXJhbSAge1lvdXJWaWV3fSB2aWV3IFRoZSB2aWV3IHdpdGggdGhlIGxpbmsgYmVpbmcgaG92ZXJlZFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIFRoZSBiYXNlbmFtZSBvZiB0aGUgbm90ZSB0byBwcmV2aWV3LlxyXG4gKiBAdGVtcGxhdGUgWW91clZpZXcgVGhlIFZpZXdUeXBlIG9mIHlvdXIgdmlld1xyXG4gKiBAcmV0dXJucyB2b2lkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaG92ZXJQcmV2aWV3KGV2ZW50LCB2aWV3LCB0bykge1xyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBldmVudC50YXJnZXQ7XHJcbiAgICBhcHAud29ya3NwYWNlLnRyaWdnZXIoXCJob3Zlci1saW5rXCIsIHtcclxuICAgICAgICBldmVudCxcclxuICAgICAgICBzb3VyY2U6IHZpZXcuZ2V0Vmlld1R5cGUoKSxcclxuICAgICAgICBob3ZlclBhcmVudDogdmlldyxcclxuICAgICAgICB0YXJnZXRFbCxcclxuICAgICAgICBsaW5rdGV4dDogdG8sXHJcbiAgICB9KTtcclxufVxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IG1hcmtkb3duIG5vdGUgbmFtZWQgYG5ld05hbWVgIGluIHRoZSB1c2VyJ3MgcHJlZmZlcmVkIG5ldy1ub3RlLWZvbGRlci5cclxuICogQHBhcmFtICB7c3RyaW5nfSBuZXdOYW1lIE5hbWUgb2YgbmV3IG5vdGUgKHdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtICB7c3RyaW5nfSBbY3VyckZpbGVQYXRoPVwiXCJdIEZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBub3RlLiBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBmaWxlLlxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxURmlsZT59IG5ldyBURmlsZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5ld01ETm90ZShuZXdOYW1lLCBjdXJyRmlsZVBhdGggPSBcIlwiKSB7XHJcbiAgICBjb25zdCBuZXdGaWxlRm9sZGVyID0gYXBwLmZpbGVNYW5hZ2VyLmdldE5ld0ZpbGVQYXJlbnQoY3VyckZpbGVQYXRoKS5wYXRoO1xyXG4gICAgY29uc3QgbmV3RmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGAke25ld0ZpbGVGb2xkZXJ9JHtuZXdGaWxlRm9sZGVyID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIn0ke2FkZE1EKG5ld05hbWUpfWApO1xyXG4gICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUobmV3RmlsZVBhdGgsIFwiXCIpO1xyXG59XHJcbi8qKlxyXG4gKiBBZGQgJy5tZCcgdG8gYG5vdGVOYW1lYCBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRoICcubWQnIG9uIHRoZSBlbmQuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYWRkTUQgPSAobm90ZU5hbWUpID0+IHtcclxuICAgIHJldHVybiBub3RlTmFtZS5tYXRjaCgvXFwuTUQkfFxcLm1kJC9tKSA/IG5vdGVOYW1lIDogbm90ZU5hbWUgKyBcIi5tZFwiO1xyXG59O1xyXG4vKipcclxuICogU3RyaXAgJy5tZCcgb2ZmIHRoZSBlbmQgb2YgYSBub3RlIG5hbWUgdG8gZ2V0IGl0cyBiYXNlbmFtZS5cclxuICpcclxuICogV29ya3Mgd2l0aCB0aGUgZWRnZWNhc2Ugd2hlcmUgYSBub3RlIGhhcyAnLm1kJyBpbiBpdHMgYmFzZW5hbWU6IGBPYnNpZGlhbi5tZC5tZGAsIGZvciBleGFtcGxlLlxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5vdGVOYW1lIHdpdGggb3Igd2l0aG91dCAnLm1kJyBvbiB0aGUgZW5kLlxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBub3RlTmFtZSB3aXRob3V0ICcubWQnXHJcbiAqL1xyXG5leHBvcnQgY29uc3Qgc3RyaXBNRCA9IChub3RlTmFtZSkgPT4ge1xyXG4gICAgaWYgKG5vdGVOYW1lLm1hdGNoKC9cXC5NRCR8XFwubWQkL20pKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vdGVOYW1lLnNwbGl0KC9cXC5NRCR8XFwubWQkL20pLnNsaWNlKDAsIC0xKS5qb2luKFwiLm1kXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBub3RlTmFtZTtcclxufTtcclxuLyoqXHJcbiAqIFdoZW4gY2xpY2tpbmcgYSBsaW5rLCBjaGVjayBpZiB0aGF0IG5vdGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgbGVhZiwgYW5kIHN3aXRjaCB0byB0aGF0IGxlYWYsIGlmIHNvLiBPdGhlcndpc2UsIG9wZW4gdGhlIG5vdGUgaW4gYSBuZXcgcGFuZS5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkZXN0IE5hbWUgb2Ygbm90ZSB0byBvcGVuLiBJZiB5b3Ugd2FudCB0byBvcGVuIGEgbm9uLW1kIG5vdGUsIGJlIHN1cmUgdG8gYWRkIHRoZSBmaWxlIGV4dGVuc2lvbi5cclxuICogQHBhcmFtICB7TW91c2VFdmVudH0gZXZlbnRcclxuICogQHBhcmFtICB7e2NyZWF0ZU5ld0ZpbGU6Ym9vbGVhbn19IFtvcHRpb25zPXtjcmVhdGVOZXdGaWxlOnRydWV9XSBXaGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYGRlc3RgIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4gSWYgYGZhbHNlYCwgc2ltcGx5IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbi5cclxuICogQHJldHVybnMgUHJvbWlzZVxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCwgb3B0aW9ucyA9IHsgY3JlYXRlTmV3RmlsZTogdHJ1ZSB9KSB7XHJcbiAgICBjb25zdCB7IHdvcmtzcGFjZSB9ID0gYXBwO1xyXG4gICAgbGV0IGRlc3RGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVzdCwgXCJcIik7XHJcbiAgICAvLyBJZiBkZXN0IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcclxuICAgIGlmICghZGVzdEZpbGUgJiYgb3B0aW9ucy5jcmVhdGVOZXdGaWxlKSB7XHJcbiAgICAgICAgZGVzdEZpbGUgPSBhd2FpdCBjcmVhdGVOZXdNRE5vdGUoZGVzdCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICghZGVzdEZpbGUgJiYgIW9wdGlvbnMuY3JlYXRlTmV3RmlsZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAvLyBDaGVjayBpZiBpdCdzIGFscmVhZHkgb3BlblxyXG4gICAgY29uc3QgbGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlbiA9IFtdO1xyXG4gICAgLy8gRm9yIGFsbCBvcGVuIGxlYXZlcywgaWYgdGhlIGxlYXZlJ3MgYmFzZW5hbWUgaXMgZXF1YWwgdG8gdGhlIGxpbmsgZGVzdGluYXRpb24sIHJhdGhlciBhY3RpdmF0ZSB0aGF0IGxlYWYgaW5zdGVhZCBvZiBvcGVuaW5nIGl0IGluIHR3byBwYW5lc1xyXG4gICAgd29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcclxuICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gKF9hID0gbGVhZi52aWV3KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmlsZTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgJiYgZmlsZS5iYXNlbmFtZSArIFwiLlwiICsgZmlsZS5leHRlbnNpb24gPT09IGRlc3QpIHtcclxuICAgICAgICAgICAgICAgIGxlYXZlc1dpdGhEZXN0QWxyZWFkeU9wZW4ucHVzaChsZWFmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gUmF0aGVyIHN3aXRjaCB0byBpdCBpZiBpdCBpcyBvcGVuXHJcbiAgICBpZiAobGVhdmVzV2l0aERlc3RBbHJlYWR5T3Blbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhdmVzV2l0aERlc3RBbHJlYWR5T3BlblswXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgY29uc3QgbW9kZSA9IGFwcC52YXVsdC5nZXRDb25maWcoXCJkZWZhdWx0Vmlld01vZGVcIik7XHJcbiAgICAgICAgY29uc3QgbGVhZiA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShcIk1ldGFcIilcclxuICAgICAgICAgICAgPyB3b3Jrc3BhY2Uuc3BsaXRBY3RpdmVMZWFmKClcclxuICAgICAgICAgICAgOiB3b3Jrc3BhY2UuZ2V0VW5waW5uZWRMZWFmKCk7XHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yXHJcbiAgICAgICAgYXdhaXQgbGVhZi5vcGVuRmlsZShkZXN0RmlsZSwgeyBhY3RpdmU6IHRydWUsIG1vZGUgfSk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEdpdmVuIGEgbGlzdCBvZiByZXNvbHZlZCBsaW5rcyBmcm9tIGFwcC5tZXRhZGF0YUNhY2hlLCBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gXHJcbiAqIEBwYXJhbSAge1Jlc29sdmVkTGlua3N9IHJlc29sdmVkTGlua3NcclxuICogQHBhcmFtICB7c3RyaW5nfSBmcm9tIE5vdGUgbmFtZSB3aXRoIGxpbmsgbGVhdmluZyAoV2l0aCBvciB3aXRob3V0ICcubWQnKVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHRvIE5vdGUgbmFtZSB3aXRoIGxpbmsgYXJyaXZpbmcgKFdpdGggb3Igd2l0aG91dCAnLm1kJylcclxuICogQHBhcmFtIHtib29sZWFufSBbZGlyZWN0ZWQ9dHJ1ZV0gT25seSBjaGVjayBpZiBgZnJvbWAgaGFzIGEgbGluayB0byBgdG9gLiBJZiBub3QgZGlyZWN0ZWQsIGNoZWNrIGluIGJvdGggZGlyZWN0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTGlua2VkKHJlc29sdmVkTGlua3MsIGZyb20sIHRvLCBkaXJlY3RlZCA9IHRydWUpIHtcclxuICAgIHZhciBfYSwgX2I7XHJcbiAgICBmcm9tID0gYWRkTUQoZnJvbSk7XHJcbiAgICB0byA9IGFkZE1EKHRvKTtcclxuICAgIGNvbnN0IGZyb21UbyA9IChfYSA9IHJlc29sdmVkTGlua3NbZnJvbV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYXNPd25Qcm9wZXJ0eSh0byk7XHJcbiAgICBpZiAoIWZyb21UbyAmJiAhZGlyZWN0ZWQpIHtcclxuICAgICAgICBjb25zdCB0b0Zyb20gPSAoX2IgPSByZXNvbHZlZExpbmtzW3RvXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmhhc093blByb3BlcnR5KGZyb20pO1xyXG4gICAgICAgIHJldHVybiB0b0Zyb207XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGZyb21UbztcclxufVxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIGxpbmsgYGZyb21gIFx1MjE5MiBgdG9gIGlzIHJlc29sdmVkIG9yIG5vdC5cclxuICogQHBhcmFtICB7c3RyaW5nfSB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZyb21cclxuICogQHJldHVybnMgYm9vbGVhblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb2x2ZWQodG8sIGZyb20pIHtcclxuICAgIHZhciBfYTtcclxuICAgIGNvbnN0IHsgcmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcbiAgICByZXR1cm4gKChfYSA9IHJlc29sdmVkTGlua3MgPT09IG51bGwgfHwgcmVzb2x2ZWRMaW5rcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzb2x2ZWRMaW5rc1thZGRNRChmcm9tKV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVthZGRNRCh0byldKSA+IDA7XHJcbn1cclxuLyoqXHJcbiAqIE9wZW4geW91ciB2aWV3IG9uIHRoZSBjaG9zZW4gYHNpZGVgIGlmIGl0IGlzbid0IGFscmVhZHkgb3BlblxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZpZXdUeXBlXHJcbiAqIEBwYXJhbSAge0NvbnN0cnVjdG9yPFlvdXJWaWV3Pn0gdmlld0NsYXNzIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvZiB5b3VyIHZpZXdcclxuICogQHBhcmFtICB7XCJsZWZ0XCJ8XCJyaWdodFwifSBbc2lkZT1cInJpZ2h0XCJdXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPFlvdXJWaWV3Pn0gVGhlIG9wZW5lZCB2aWV3XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblZpZXcodmlld1R5cGUsIHZpZXdDbGFzcywgc2lkZSA9IFwicmlnaHRcIikge1xyXG4gICAgbGV0IGxlYWYgPSBudWxsO1xyXG4gICAgZm9yIChsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKHZpZXdUeXBlKSkge1xyXG4gICAgICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiB2aWV3Q2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxlYWYudmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoeyB0eXBlOiBcImVtcHR5XCIgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBsZWFmID1cclxuICAgICAgICAobGVhZiAhPT0gbnVsbCAmJiBsZWFmICE9PSB2b2lkIDAgPyBsZWFmIDogc2lkZSA9PT0gXCJyaWdodFwiKVxyXG4gICAgICAgICAgICA/IGFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKVxyXG4gICAgICAgICAgICA6IGFwcC53b3Jrc3BhY2UuZ2V0TGVmdExlYWYoZmFsc2UpO1xyXG4gICAgYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xyXG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGxlYWYudmlldztcclxufVxyXG4vKipcclxuICogQ2hlY2sgd2hpY2ggc2lkZSBvZiB0aGUgd29ya3NwYWNlIHlvdXIgYHZpZXdUeXBlYCBpcyBvbiwgYW5kIHNhdmUgaXQgaW50byBgcGx1Z2luLnNldHRpbmdzW3NldHRpbmdOYW1lXWAuXHJcbiAqXHJcbiAqICoqVGlwKio6IFJ1biB0aGlzIGZ1bmN0aW9uIG9uIGBwbHVnaW4udW5sb2FkYCB0byBzYXZlIHRoZSBsYXN0IHNpZGUgeW91ciB2aWV3IHdhcyBvbiB3aGVuIGNsb3NpbmcsIHRoZW4ge0BsaW5rIG9wZW5WaWV3fSBvbiB0aGUgc2FtZSBzaWRlIGl0IHdhcyBsYXN0LlxyXG4gKiBAcGFyYW0gIHtZb3VyUGx1Z2lufSBwbHVnaW5cclxuICogQHBhcmFtICB7c3RyaW5nfSB2aWV3VHlwZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNldHRpbmdOYW1lXHJcbiAqIEByZXR1cm5zIHtcImxlZnRcIiB8IFwicmlnaHRcIn0gYHNpZGVgXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVZpZXdTaWRlKHBsdWdpbiwgdmlld1R5cGUsIHNldHRpbmdOYW1lKSB7XHJcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodmlld1R5cGUpWzBdO1xyXG4gICAgaWYgKCFsZWFmKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKGBPYnNpZGlhbi1Db21tdW5pdHktTGliOiBObyBpbnN0YW5jZSBvZiAnJHt2aWV3VHlwZX0nIG9wZW4sIGNhbm5vdCBzYXZlIHNpZGVgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGNvbnN0IHNpZGUgPSBsZWFmLmdldFJvb3QoKS5zaWRlO1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBwbHVnaW4uc2V0dGluZ3Nbc2V0dGluZ05hbWVdID0gc2lkZTtcclxuICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgcmV0dXJuIHNpZGU7XHJcbn1cclxuLyoqXHJcbiAqIEEgTW9kYWwgdXNlZCBpbiB7QGxpbmsgYWRkUmVuZGVyZWRNYXJrZG93bkJ1dHRvbn0gdG8gZGlzcGxheSByZW5kZXJlZCBtYXJrZG93biBmcm9tIGEgcmF3IHN0cmluZywgb3IgZmV0Y2hlZCBmcm9tIGEgcHJvdmlkZWQgdXJsLlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9OTXdNNTBFLnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gc291cmNlIFJhdyBtYXJrZG93biBjb250ZW50IG9yIHVybCB0byBmaW5kIHJhdyBtYXJrZG93bi5cclxuICogQHBhcmFtICB7Ym9vbGVhbn0gZmV0Y2ggVHJ1ZSBcdTIxOTIgZmV0Y2ggbWFya2Rvd24gZnJvbSBgc291cmNlYCBhcyB1cmwuIEZhbHNlIFx1MjE5MiBgc291cmNlYCBpcyBhbHJlYWR5IGEgbWFya2Rvd24gc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFJlbmRlcmVkTWFya2Rvd25Nb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbiwgc291cmNlLCBmZXRjaCkge1xyXG4gICAgICAgIHN1cGVyKGFwcCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XHJcbiAgICAgICAgdGhpcy5mZXRjaCA9IGZldGNoO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgb25PcGVuKCkge1xyXG4gICAgICAgIGxldCB7IGNvbnRlbnRFbCwgc291cmNlLCBwbHVnaW4sIGZldGNoIH0gPSB0aGlzO1xyXG4gICAgICAgIGxldCBjb250ZW50ID0gc291cmNlO1xyXG4gICAgICAgIGlmIChmZXRjaCkge1xyXG4gICAgICAgICAgICBjb250ZW50RWwuY3JlYXRlRGl2KHsgdGV4dDogYFdhaXRpbmcgZm9yIGNvbnRlbnQgZnJvbTogJyR7c291cmNlfSdgIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVxdWVzdCh7IHVybDogc291cmNlIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9nRGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJPQ0wtUmVuZGVyZWRNYXJrZG93bk1vZGFsXCIgfSk7XHJcbiAgICAgICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihjb250ZW50LCBsb2dEaXYsIFwiXCIsIHBsdWdpbik7XHJcbiAgICB9XHJcbiAgICBvbkNsb3NlKCkge1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEFkZCBhIGJ1dHRvbiB0byBhbiBIVE1MRUxlbWVudCwgd2hpY2gsIHdoZW4gY2xpY2tlZCwgcG9wcyB1cCBhIHtAbGluayBSZW5kZXJlZE1hcmtkb3duTW9kYWx9IHNob3dpbmcgcmVuZGVyZWQgbWFya2Rvd24uXHJcbiAqXHJcbiAqIFVzZSBgZmV0Y2hgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG1hcmtkb3duIHN0cmluZyBuZWVkcyB0byBiZSBmZXRjaGVkLCBvciBpZiBpdCBoYXMgYmVlbiBwcm92aWRlZCBhcyBhIHN0cmluZyBhbHJlYWR5LlxyXG4gKlxyXG4gKiAhW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9IaTRneXl2LnBuZylcclxuICogQHBhcmFtICB7WW91clBsdWdpbn0gcGx1Z2luXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBjb250YWluZXJFbCBIVE1MRWxlbWVudCB0byBhZGQgdGhlIGJ1dHRvbiB0b1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHNvdXJjZSBSYXcgbWFya2Rvd24gY29udGVudCBvciB1cmwgdG8gZmluZCByYXcgbWFya2Rvd24uXHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IGZldGNoIFRydWUgXHUyMTkyIGZldGNoIG1hcmtkb3duIGZyb20gYHNvdXJjZWAgYXMgdXJsLiBGYWxzZSBcdTIxOTIgYHNvdXJjZWAgaXMgYWxyZWFkeSBhIG1hcmtkb3duIHN0cmluZy5cclxuICogQHBhcmFtICB7c3RyaW5nfSBkaXNwbGF5VGV4dCBUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGJ1dHRvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZW5kZXJlZE1hcmtkb3duQnV0dG9uKHBsdWdpbiwgY29udGFpbmVyRWwsIHNvdXJjZSwgZmV0Y2gsIGRpc3BsYXlUZXh0KSB7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IGRpc3BsYXlUZXh0IH0sIChidXQpID0+IGJ1dC5vbkNsaWNrRXZlbnQoKCkgPT4ge1xyXG4gICAgICAgIG5ldyBSZW5kZXJlZE1hcmtkb3duTW9kYWwocGx1Z2luLCBzb3VyY2UsIGZldGNoKS5vcGVuKCk7XHJcbiAgICB9KSk7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGBhcHAubWV0YWRhdGFDYWNoZS5SZXNvbHZlZExpbmtzYCBoYXZlIGZ1bGx5IGluaXRhbGlzZWQuXHJcbiAqXHJcbiAqIFVzZWQgd2l0aCB7QGxpbmsgd2FpdEZvclJlc29sdmVkTGlua3N9LlxyXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG5vRmlsZXMgTnVtYmVyIG9mIGZpbGVzIGluIHlvdXIgdmF1bHQuXHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVkTGlua3NDb21wbGV0ZShub0ZpbGVzKSB7XHJcbiAgICBjb25zdCB7IHJlc29sdmVkTGlua3MgfSA9IGFwcC5tZXRhZGF0YUNhY2hlO1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc29sdmVkTGlua3MpLmxlbmd0aCA9PT0gbm9GaWxlcztcclxufVxyXG4vKipcclxuICogV2FpdCBmb3IgYGFwcC5tZXRhZGF0YUNhY2hlLlJlc29sdmVkTGlua3NgIHRvIGhhdmUgZnVsbHkgaW5pdGlhbGlzZWQuXHJcbiAqIEBwYXJhbSAge251bWJlcn0gW2RlbGF5PTEwMDBdIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggY2hlY2suXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTUwXSBNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIGNoZWNrIGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvciBhbmQgYnJlYWtpbmcgb3V0IG9mIHRoZSBsb29wLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JSZXNvbHZlZExpbmtzKGRlbGF5ID0gMTAwMCwgbWF4ID0gNTApIHtcclxuICAgIGNvbnN0IG5vRmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLmxlbmd0aDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIHdoaWxlICghcmVzb2x2ZWRMaW5rc0NvbXBsZXRlKG5vRmlsZXMpICYmIGkgPCBtYXgpIHtcclxuICAgICAgICBhd2FpdCB3YWl0KGRlbGF5KTtcclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBpZiAoaSA9PT0gbWF4KSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJPYnNpZGlhbi1Db21tdW5pdHktTGliOiBSZXNvbHZlZExpbmtzIGRpZCBub3QgZmluaXNoIGluaXRpYWxpc2luZy4gYG1heGAgaXRlcmF0aW9ucyB3YXMgcmVhY2hlZCBmaXJzdC5cIik7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSBjb250ZW50IG9mIGEgbm90ZSBoYXMgWUFNTC4gSWYgc28sIHJldHVybiBhbiBhcnJheSBvZiB0aGUgWUFNTCBhbmQgdGhlIHJlc3Qgb2YgdGhlIG5vdGUuIElmIG5vdCwgcmV0dXJuIGBbJycsIGNvbnRlbnRdYFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvbnRlbnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50KSB7XHJcbiAgICBpZiAoIS9eLS0tXFxuLy50ZXN0KGNvbnRlbnQpKVxyXG4gICAgICAgIHJldHVybiBbXCJcIiwgY29udGVudF07XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBzcGxpdHMgPSBjb250ZW50LnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHNwbGl0cy5zbGljZSgwLCAyKS5qb2luKFwiLS0tXCIpICsgXCItLS1cIixcclxuICAgICAgICAgICAgc3BsaXRzLnNsaWNlKDIpLmpvaW4oXCItLS1cIiksXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICpcclxuICogQHBhcmFtIHtib29sZWFufSBjYWNoZWQgUmV0dXJuIGNhY2hlZCBmaWxlIGNvbnRlbnQgKipvcioqIHJldHVybiB3aGF0J3Mgb24gZGlzay5cclxuICogQHJldHVybnNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVGaWxlQ29udGVudChjYWNoZWQgPSB0cnVlKSB7XHJcbiAgICBjb25zdCBjdXJyRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG4gICAgaWYgKCEoY3VyckZpbGUgaW5zdGFuY2VvZiBURmlsZSkpXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAoY2FjaGVkKVxyXG4gICAgICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChjdXJyRmlsZSk7XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5yZWFkKGN1cnJGaWxlKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUge1xyXG4gIEJDU2V0dGluZ3MsXHJcbiAgRGlyZWN0aW9ucyxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IElKdWdnbFNldHRpbmdzIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1BVFJJWF9WSUVXID0gXCJCQy1tYXRyaXhcIjtcclxuLy8gZXhwb3J0IGNvbnN0IFNUQVRTX1ZJRVcgPSBcIkJDLXN0YXRzXCI7XHJcbmV4cG9ydCBjb25zdCBEVUNLX1ZJRVcgPSBcIkJDLWR1Y2tzXCI7XHJcbmV4cG9ydCBjb25zdCBUUkVFX1ZJRVcgPSBcIkJDLXRyZWVcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OID0gXCJCQy10cmFpbC1pY29uXCI7XHJcbmV4cG9ydCBjb25zdCBUUkFJTF9JQ09OX1NWRyA9XHJcbiAgJzxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ4LjgsNGMtNiwwLTEzLjUsMC41LTE5LjcsMy4zUzE3LjksMTUuOSwxNy45LDI1YzAsNSwyLjYsOS43LDYuMSwxMy45czguMSw4LjMsMTIuNiwxMi4zczksNy44LDEyLjIsMTEuNSBjMy4yLDMuNyw1LjEsNy4xLDUuMSwxMC4yYzAsMTQuNC0xMy40LDE5LjMtMTMuNCwxOS4zYy0wLjcsMC4yLTEuMiwwLjgtMS4zLDEuNXMwLjEsMS40LDAuNywxLjljMC42LDAuNSwxLjMsMC42LDIsMC4zIGMwLDAsMTYuMS02LjEsMTYuMS0yM2MwLTQuNi0yLjYtOC44LTYuMS0xMi44Yy0zLjUtNC04LjEtNy45LTEyLjYtMTEuOGMtNC41LTMuOS04LjktNy45LTEyLjItMTEuOGMtMy4yLTMuOS01LjItNy43LTUuMi0xMS40IGMwLTcuOCwzLjYtMTEuNiw4LjgtMTRTNDMsOCw0OC44LDhjNC42LDAsOS4zLDAsMTEsMGMwLjcsMCwxLjQtMC40LDEuNy0xYzAuMy0wLjYsMC4zLTEuNCwwLTJzLTEtMS0xLjctMUM1OC4zLDQsNTMuNCw0LDQ4LjgsNCBMNDguOCw0eiBNNzguMSw0Yy0wLjYsMC0xLjIsMC4yLTEuNiwwLjdsLTguOSw5LjljLTAuNSwwLjYtMC43LDEuNC0wLjMsMi4yYzAuMywwLjcsMSwxLjIsMS44LDEuMmgwLjFsLTIuOCwyLjYgYy0wLjYsMC42LTAuOCwxLjQtMC41LDIuMmMwLjMsMC44LDEsMS4zLDEuOSwxLjNoMS4zbC00LjUsNC42Yy0wLjYsMC42LTAuNywxLjQtMC40LDIuMmMwLjMsMC43LDEsMS4yLDEuOCwxLjJoMTB2NCBjMCwwLjcsMC40LDEuNCwxLDEuOGMwLjYsMC40LDEuNCwwLjQsMiwwYzAuNi0wLjQsMS0xLDEtMS44di00aDEwYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMS0xLjYtMC40LTIuMkw4Ni45LDI0aDEuMyBjMC44LDAsMS42LTAuNSwxLjktMS4zYzAuMy0wLjgsMC4xLTEuNi0wLjUtMi4ybC0yLjgtMi42aDAuMWMwLjgsMCwxLjUtMC41LDEuOC0xLjJjMC4zLTAuNywwLjItMS42LTAuMy0yLjJsLTguOS05LjkgQzc5LjEsNC4zLDc4LjYsNCw3OC4xLDRMNzguMSw0eiBNNzgsOWw0LjQsNC45aC0wLjdjLTAuOCwwLTEuNiwwLjUtMS45LDEuM2MtMC4zLDAuOC0wLjEsMS42LDAuNSwyLjJsMi44LDIuNmgtMS4xIGMtMC44LDAtMS41LDAuNS0xLjgsMS4yYy0wLjMsMC43LTAuMSwxLjYsMC40LDIuMmw0LjUsNC42SDcwLjhsNC41LTQuNmMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0xLjEgbDIuOC0yLjZjMC42LTAuNiwwLjgtMS40LDAuNS0yLjJjLTAuMy0wLjgtMS0xLjMtMS45LTEuM2gtMC43TDc4LDl6IE01Mi40LDEyYy00LjEsMC03LjEsMC41LTkuNCwxLjVjLTIuMywxLTMuOCwyLjUtNC41LDQuMyBjLTAuNywxLjgtMC41LDMuNiwwLjEsNS4yYzAuNiwxLjUsMS41LDIuOSwyLjUsMy45YzUuNCw1LjQsMTguMSwxMi42LDI5LjYsMjFjNS44LDQuMiwxMS4yLDguNiwxNS4xLDEzYzMuOSw0LjQsNi4yLDguNyw2LjIsMTIuNCBjMCwxNC41LTEyLjksMTguNy0xMi45LDE4LjdjLTAuNywwLjItMS4yLDAuOC0xLjQsMS41czAuMSwxLjUsMC43LDEuOWMwLjYsMC41LDEuMywwLjYsMiwwLjNjMCwwLDE1LjYtNS42LDE1LjYtMjIuNSBjMC01LjMtMi45LTEwLjMtNy4yLTE1LjFDODQuNiw1My42LDc5LDQ5LDczLjEsNDQuN2MtMTEuOC04LjYtMjQuOC0xNi4zLTI5LjItMjAuNmMtMC42LTAuNi0xLjItMS41LTEuNi0yLjQgYy0wLjMtMC45LTAuNC0xLjctMC4xLTIuNGMwLjMtMC43LDAuOC0xLjQsMi4zLTJjMS41LTAuNyw0LjEtMS4yLDcuOC0xLjJjNC45LDAsOS40LDAuMSw5LjQsMC4xYzAuNywwLDEuNC0wLjMsMS44LTEgYzAuNC0wLjYsMC40LTEuNCwwLTIuMWMtMC40LTAuNi0xLjEtMS0xLjgtMUM2MS45LDEyLjEsNTcuMywxMiw1Mi40LDEyTDUyLjQsMTJ6IE0yNCw0NmMtMC41LDAtMS4xLDAuMi0xLjQsMC42TDkuMiw2MC41IGMtMC42LDAuNi0wLjcsMS40LTAuNCwyLjJjMC4zLDAuNywxLDEuMiwxLjgsMS4yaDNsLTYuNSw2LjhjLTAuNiwwLjYtMC43LDEuNC0wLjQsMi4yczEsMS4yLDEuOCwxLjJIMTNsLTguNSw4LjYgQzQsODMuMiwzLjgsODQsNC4yLDg0LjhDNC41LDg1LjUsNS4yLDg2LDYsODZoMTZ2NS40YzAsMC43LDAuNCwxLjQsMSwxLjhjMC42LDAuNCwxLjQsMC40LDIsMGMwLjYtMC40LDEtMSwxLTEuOFY4NmgxNiBjMC44LDAsMS41LTAuNSwxLjgtMS4yYzAuMy0wLjcsMC4xLTEuNi0wLjQtMi4yTDM1LDc0aDQuNGMwLjgsMCwxLjUtMC41LDEuOC0xLjJzMC4yLTEuNi0wLjQtMi4ybC02LjUtNi44aDMgYzAuOCwwLDEuNS0wLjUsMS44LTEuMmMwLjMtMC43LDAuMi0xLjYtMC40LTIuMkwyNS40LDQ2LjZDMjUuMSw0Ni4yLDI0LjUsNDYsMjQsNDZMMjQsNDZ6IE0yNCw1MC45bDguNyw5aC0zIGMtMC44LDAtMS41LDAuNS0xLjgsMS4ycy0wLjIsMS42LDAuNCwyLjJsNi41LDYuOGgtNC41Yy0wLjgsMC0xLjUsMC41LTEuOCwxLjJjLTAuMywwLjctMC4xLDEuNiwwLjQsMi4ybDguNSw4LjZIMTAuOGw4LjUtOC42IGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC00LjVsNi41LTYuOGMwLjYtMC42LDAuNy0xLjQsMC40LTIuMmMtMC4zLTAuNy0xLTEuMi0xLjgtMS4yaC0zTDI0LDUwLjl6XCIvPic7XHJcblxyXG5leHBvcnQgY29uc3QgRFVDS19JQ09OID0gXCJCQy1kdWNrLWljb25cIjtcclxuZXhwb3J0IGNvbnN0IERVQ0tfSUNPTl9TVkcgPVxyXG4gICc8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgZD1cIk03MiwzMWMwLTEuNS0xLjItMi44LTIuOC0yLjhjLTEuNSwwLTIuOCwxLjItMi44LDIuOHMxLjIsMi44LDIuOCwyLjhDNzAuOCwzMy44LDcyLDMyLjYsNzIsMzF6IE04MC40LDQ3LjdjMTAuNywwLDE5LjQtOC43LDE5LjQtMTkuNEg4OC40Yy0wLjEtMC42LTAuMS0xLjEtMC4yLTEuN2MtMS42LTcuMS03LjMtMTIuOC0xNC4zLTE0NGMtMS42LTAuNC0zLjEtMC41LTQuNi0wLjVjLTEwLjcsMC0xOS40LDguNy0xOS40LDE5LjR2MTMuOWgtOS40Yy02LjgsMC0xMy42LTIuNC0xOC4yLTcuM2MtMC43LTAuNy0xLjYtMS4xLTIuNC0xMWMtMS43LDAtMy4zLDEuMy0zLjMsMy4zYzAsMTYuNCwxMi41LDMxLDI4LjYsMzIuNmMxLjYsMC4yLDMuMS0xLjEsMy4xLTIuOHYtMi44YzAtMS40LTEtMi42LTIuNC0yLjdjLTcuOS0wOS0xNC44LTYuMi0xOC40LTEzLjVjNC4xLDEuNiw4LjUsMi41LDEzLjEsMi41bDE3LjcsMC4xVjMxYzAtNi4xLDUtMTEuMSwxMS4xLTExLjFjMC45LDAsMS44LDAuMSwyLjcsMC4zYzMuOSwwLjksNy4yLDQuMiw4LjEsOC4xQzgxNCwzNC40LDc4LDM5LjEsNzQsNDFsLTQuNywyLjN2MTIuNGwyLjEsMi40YzEuNSwxLjgsMy40LDQuNywzLjUsOC44YzAuMSwzLjQtMS4zLDYuNy0zLjksOS40Yy0zLDMtNyw0LjgtMTEuMiw0LjhINDMuOWMtMSwwLTIuMS0wMS0zLjItMC4yQzI1LjIsNzkuNSwxMi4zLDY4LjEsOC43LDUzLjJoNS4xYy0xLjItMi43LTItNS41LTIuNS04LjNINS40Yy0zLjMsMC02LDMtNS41LDYuM2MyLjksMjAuMywxOS40LDM2LjEsNDAsMzhjMS4zLDAuMSwyLjYsMDIsNCwwLjJoMTUuOGMxMi41LDAsMjMuNy0xMC4yLDIzLjQtMjIuN2MtMC4xLTUuNC0yLjItMTAuMy01LjYtMTQuMXYtNC45SDgwLjRMODAuNCw0Ny43elwiLz4nO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0TGlua3NSZWdleCA9IG5ldyBSZWdFeHAoL1xcW1xcWyguKz8pXFxdXFxdL2cpO1xyXG5leHBvcnQgY29uc3QgZHJvcEhlYWRlck9yQWxpYXMgPSBuZXcgUmVnRXhwKC9cXFtcXFsoW14jfF0rKVxcXVxcXS8pO1xyXG5cclxuLyoqIEEgbWV0YS1yZWdleCB0aGF0IHRha2VzIGluIGEgc3RyaW5nIG9mIHRoZSBmb3JtIGAvcmVnZXgvZmxhZ3NgLCBhbmQgcmV0dXJucyAyIGdyb3VwcywgdGhlIGlubmVyIGByZWdleGAsIGFuZCB0aGUgYGZsYWdzYC4gKi9cclxuZXhwb3J0IGNvbnN0IHJlZ05GbGFncyA9IG5ldyBSZWdFeHAoL14uKC4qPylcXFcoXFx3KikkLyk7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUlMX0xFTkdUSFMgPSBbXHJcbiAgJ1Nob3J0ZXN0JyxcclxuICAnTG9uZ2VzdCcsXHJcbiAgJ0FsbCdcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IFZJU1RZUEVTID0gW1xyXG4gIFwiRm9yY2UgRGlyZWN0ZWQgR3JhcGhcIixcclxuICBcIlRpZHkgVHJlZVwiLFxyXG4gIFwiQ2lyY2xlIFBhY2tpbmdcIixcclxuICBcIkVkZ2UgQnVuZGxpbmdcIixcclxuICBcIkFyYyBEaWFncmFtXCIsXHJcbiAgXCJTdW5idXJzdFwiLFxyXG4gIFwiVHJlZSBNYXBcIixcclxuICBcIkljaWNsZVwiLFxyXG4gIFwiUmFkaWFsIFRyZWVcIixcclxuXSBhcyBjb25zdDtcclxuXHJcbi8qIEFsbCA1IHBvc3NpYmxlIGRpcmVjdGlvbnMuICovXHJcbmV4cG9ydCBjb25zdCBESVJFQ1RJT05TID0gW1widXBcIiwgXCJzYW1lXCIsIFwiZG93blwiLCBcIm5leHRcIiwgXCJwcmV2XCJdIGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIEFuIGFycm93IGZvciBlYWNoIHtAbGluayBESVJFQ1RJT05TfSB2YWx1ZS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBBUlJPV19ESVJFQ1RJT05TOiB7IFtkaXIgaW4gRGlyZWN0aW9uc106IHN0cmluZyB9ID0ge1xyXG4gIHVwOiBcIlx1MjE5MVwiLFxyXG4gIHNhbWU6IFwiXHUyMTk0XCIsXHJcbiAgZG93bjogXCJcdTIxOTNcIixcclxuICBuZXh0OiBcIlx1MjE5MlwiLFxyXG4gIHByZXY6IFwiXHUyMTkwXCIsXHJcbn07XHJcbmV4cG9ydCBjb25zdCBSRUxBVElPTlMgPSBbXCJQYXJlbnRcIiwgXCJTaWJsaW5nXCIsIFwiQ2hpbGRcIl0gYXMgY29uc3Q7XHJcbmV4cG9ydCBjb25zdCBSRUFsQ0xPU0VEID0gW1wiUmVhbFwiLCBcIkNsb3NlZFwiXTtcclxuZXhwb3J0IGNvbnN0IEFMTFVOTElOS0VEID0gW1wiQWxsXCIsIFwiTm8gVW5saW5rZWRcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfVFlQRVMgPSBbXCJ0cmVlXCIsIFwianVnZ2xcIl07XHJcbmV4cG9ydCBjb25zdCBDT0RFQkxPQ0tfRklFTERTID0gW1xyXG4gIFwidHlwZVwiLFxyXG4gIFwiZGlyXCIsXHJcbiAgXCJmaWVsZHNcIixcclxuICBcImRlcHRoXCIsXHJcbiAgXCJ0aXRsZVwiLFxyXG4gIFwiZmxhdFwiLFxyXG4gIFwiY29udGVudFwiLFxyXG4gIFwiZnJvbVwiLFxyXG4gIFwiaW1wbGllZFwiLFxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX0NCX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IHtcclxuICAvLyBAdHMtaWdub3JlXHJcbiAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICBhdXRvQWRkTm9kZXM6IGZhbHNlLFxyXG4gIGF1dG9FeHBhbmQ6IGZhbHNlLFxyXG4gIGF1dG9ab29tOiBmYWxzZSxcclxuICBjb3JlU3RvcmU6IFwiY29yZVwiLFxyXG4gIGV4cGFuZEluaXRpYWw6IGZhbHNlLFxyXG4gIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICBmaWx0ZXI6IFwiXCIsXHJcbiAgaGVpZ2h0OiBcIjc1MHB4XCIsXHJcbiAgaG92ZXJFZGdlczogZmFsc2UsXHJcbiAgbGF5b3V0OiBcImZvcmNlLWRpcmVjdGVkXCIsXHJcbiAgbGltaXQ6IDI1MCxcclxuICBtZXJnZUVkZ2VzOiB0cnVlLFxyXG4gIG1ldGFLZXlIb3ZlcjogdHJ1ZSxcclxuICBtb2RlOiBcIndvcmtzcGFjZVwiLFxyXG4gIG5hdmlnYXRvcjogdHJ1ZSxcclxuICBvcGVuV2l0aFNoaWZ0OiBmYWxzZSxcclxuICByZWFkQ29udGVudDogdHJ1ZSxcclxuICBzdHlsZUdyb3VwczogW10sXHJcbiAgdG9vbGJhcjogdHJ1ZSxcclxuICB3aWR0aDogXCIxMDAlXCIsXHJcbiAgem9vbVNwZWVkOiAxLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IEpVR0dMX1RSQUlMX0RFRkFVTFRTOiBJSnVnZ2xTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcbiAgSlVHR0xfQ0JfREVGQVVMVFMsXHJcbiAge1xyXG4gICAgYW5pbWF0ZUxheW91dDogdHJ1ZSxcclxuICAgIGF1dG9ab29tOiBmYWxzZSxcclxuICAgIGZkZ2RMYXlvdXQ6IFwiZDMtZm9yY2VcIixcclxuICAgIGhlaWdodDogXCIzMDBweFwiLFxyXG4gICAgcmVhZENvbnRlbnQ6IGZhbHNlLFxyXG4gICAgdG9vbGJhcjogZmFsc2UsXHJcbiAgICBuYXZpZ2F0b3I6IGZhbHNlLFxyXG4gIH1cclxuKTtcclxuQ09ERUJMT0NLX0ZJRUxEUy5wdXNoKC4uLk9iamVjdC5rZXlzKEpVR0dMX0NCX0RFRkFVTFRTKSk7XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtVc2VySGllciA9ICgpOiBVc2VySGllciA9PiB7XHJcbiAgcmV0dXJuIHsgdXA6IFtdLCBzYW1lOiBbXSwgZG93bjogW10sIG5leHQ6IFtdLCBwcmV2OiBbXSB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgYmxhbmtEaXJPYmpzID0gKCk6IHsgW2RpciBpbiBEaXJlY3Rpb25zXToge30gfSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHVwOiB7fSxcclxuICAgIHNhbWU6IHt9LFxyXG4gICAgZG93bjoge30sXHJcbiAgICBuZXh0OiB7fSxcclxuICAgIHByZXY6IHt9LFxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYmxhbmtSZWFsTkltcGxpZWQgPSAoKTogUmVhbE5JbXBsaWVkID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgdXA6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIGRvd246IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHNhbWU6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIG5leHQ6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICAgIHByZXY6IHsgcmVhbHM6IFtdLCBpbXBsaWVkczogW10gfSxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IFtcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfSV9SRUZMRVhJVkUsXHJcbiAgQkNfSV9QQVJFTlQsXHJcbl0gPSBbXHJcbiAgICBcIkJDLUF1bnRcIixcclxuICAgIFwiQkMtQ291c2luXCIsXHJcbiAgICBcIkJDLVNpYmxpbmctMVwiLFxyXG4gICAgXCJCQy1TaWJsaW5nLTJcIixcclxuICAgIFwiQkMtUmVmbGV4aXZlXCIsXHJcbiAgICBcIkJDLVBhcmVudFwiLFxyXG4gIF07XHJcblxyXG5leHBvcnQgY29uc3QgW1xyXG4gIEJDX0ZPTERFUl9OT1RFLFxyXG4gIEJDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlMsXHJcbiAgQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFLFxyXG4gIEJDX1RBR19OT1RFLFxyXG4gIEJDX1RBR19OT1RFX0ZJRUxELFxyXG4gIEJDX1RBR19OT1RFX0VYQUNULFxyXG4gIEJDX0xJTktfTk9URSxcclxuICBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICBCQ19EVl9OT1RFLFxyXG4gIEJDX0RWX05PVEVfRklFTEQsXHJcbiAgQkNfSUdOT1JFLFxyXG4gIEJDX0lHTk9SRV9ERU5EUk9OLFxyXG4gIEJDX0hJREVfVFJBSUwsXHJcbiAgQkNfT1JERVIsXHJcbl0gPSBbXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlXCIsXHJcbiAgICBcIkJDLWZvbGRlci1ub3RlLXN1YmZvbGRlcnNcIixcclxuICAgIFwiQkMtZm9sZGVyLW5vdGUtcmVjdXJzaXZlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWZpZWxkXCIsXHJcbiAgICBcIkJDLXRhZy1ub3RlLWV4YWN0XCIsXHJcbiAgICBcIkJDLWxpbmstbm90ZVwiLFxyXG4gICAgXCJCQy10cmF2ZXJzZS1ub3RlXCIsXHJcbiAgICBcIkJDLXJlZ2V4LW5vdGVcIixcclxuICAgIFwiQkMtcmVnZXgtbm90ZS1maWVsZFwiLFxyXG4gICAgXCJCQy1kYXRhdmlldy1ub3RlXCIsXHJcbiAgICBcIkJDLWRhdGF2aWV3LW5vdGUtZmllbGRcIixcclxuICAgIFwiQkMtaWdub3JlXCIsXHJcbiAgICBcIkJDLWlnbm9yZS1kZW5kcm9uXCIsXHJcbiAgICBcIkJDLWhpZGUtdHJhaWxcIixcclxuICAgIFwiQkMtb3JkZXJcIixcclxuICBdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJDX0ZJRUxEU19JTkZPID0gW1xyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIGZvbGRlci1ub3RlLiBBbGwgb3RoZXIgbm90ZXMgaW4gdGhpcyBmb2xkZXIgd2lsbCBiZSBhZGRlZCB0byB0aGUgZ3JhcGggd2l0aCB0aGUgZmllbGQgbmFtZSBzcGVjaWZpZWQgaW4gdGhpcyBrZXkncyB2YWx1ZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9TVUJGT0xERVJTLFxyXG4gICAgZGVzYzogXCJMaW5rIHRvIG5vdGVzIGluIHN1YmZvbGRlcnMgd2l0aCB0aGUgZ2l2ZW4gZmllbGQuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiBcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IFwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgICBkZXNjOiBcIlJlY3Vyc2l2ZWx5IGFkZCBub3RlcyBpbiBzdWJmb2xkZXJzIHRvIHRoZSBmb2xkZXJub3RlIG9mIF90aGF0XyBzdWJmb2xkZXIuXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdGFnLW5vdGUuIEFsbCBvdGhlciBub3RlcyB3aXRoIHRoaXMgdGFnIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBUYWcgTm90ZXMgPiBEZWZhdWx0IEZpZWxkYCwgb3IgdXNpbmcgdGhlIGZpZWxkTmFtZSB5b3Ugc3BlY2lmeSB3aXRoIGBCQy10YWctbm90ZS1maWVsZDogZmllbGROYW1lYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJyNcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6ICNcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UQUdfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyB0YWctbm90ZSB0byB1c2VcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX1RBR19OT1RFX0VYQUNULFxyXG4gICAgZGVzYzogXCJPbmx5IGxvb2sgZm9yIG5vdGVzIHdpdGggdGhlIGV4YWN0IHRhZy4gaS5lLiBgI0FgIHdvbid0IG1hdGNoIGAjQS9CYFwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19MSU5LX05PVEUsXHJcbiAgICBkZXNjOiBcIlNldCB0aGlzIG5vdGUgYXMgYSBCcmVhZGNydW1icyBsaW5rLW5vdGUuIEFsbCBsaW5rcyBsZWF2aW5nIHRoaXMgbm90ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBncmFwaCB3aXRoIHRoZSBmaWVsZCBuYW1lIHNwZWNpZmllZCBpbiB0aGlzIGtleSdzIHZhbHVlLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogdHJ1ZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19UUkFWRVJTRV9OT1RFLFxyXG4gICAgZGVzYzogXCJTZXQgdGhpcyBub3RlIGFzIGEgQnJlYWRjcnVtYnMgdHJhdmVyc2Utbm90ZS4gU3RhcnRpbmcgZnJvbSB0aGlzIG5vdGUsIHRoZSBPYnNpZGlhbiBncmFwaCB3aWxsIGJlIHRyYXZlcnNlZCBpbiBkZXB0aC1maXJzdCBvcmRlciwgYW5kIGFsbCBub3RlcyBhbG9uZyB0aGUgd2F5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnlcIixcclxuICAgIGFmdGVyWWFtbDogXCI6IFwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIHJlZ2V4LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgcmVndWxhciBleHByZXNzaW9uIChvZiB0aGUgZm9ybSAnL3JlZ2V4L2ZsYWdzJykuIEFsbCBub3RlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHJlZ2V4IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEJDIGdyYXBoIHVzaW5nIHRoZSBkZWZhdWx0IGZpZWxkTmFtZSBzcGVjaWZpZWQgaW4gYFNldHRpbmdzID4gQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXMgPiBSZWdleCBOb3RlcyA+IERlZmF1bHQgRmllbGRgLCBvciB1c2luZyB0aGUgZmllbGROYW1lIHlvdSBzcGVjaWZ5IGluICdCQy1yZWdleC1ub3RlLWZpZWxkJy5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6ICcvXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiAvXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfUkVHRVhfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyByZWdleC1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URSxcclxuICAgIGRlc2M6IFwiU2V0IHRoaXMgbm90ZSBhcyBhIEJyZWFkY3J1bWJzIERhdGF2aWV3LW5vdGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIGEgRGF0YXZpZXcgYGZyb21gIHF1ZXJ5LiBBbGwgbm90ZXMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgd2lsbCBiZSBhZGRlZCB0byB0aGUgQkMgZ3JhcGggdXNpbmcgdGhlIGRlZmF1bHQgZmllbGROYW1lIHNwZWNpZmllZCBpbiBgU2V0dGluZ3MgPiBBbHRlcm5hdGl2ZSBIaWVyYXJjaGllcyA+IERhdGF2aWV3IE5vdGVzID4gRGVmYXVsdCBGaWVsZGAsIG9yIHVzaW5nIHRoZSBmaWVsZE5hbWUgeW91IHNwZWNpZnkgaW4gJ0JDLWRhdGF2aWV3LW5vdGUtZmllbGQnLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogJ1wiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogXCIsXHJcbiAgICBhbHQ6IHRydWUsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfRFZfTk9URV9GSUVMRCxcclxuICAgIGRlc2M6IFwiTWFudWFsbHkgY2hvb3NlIHRoZSBmaWVsZCBmb3IgdGhpcyBEYXRhdmlldy1ub3RlIHRvIHVzZVwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSUdOT1JFLFxyXG4gICAgZGVzYzogXCJUZWxscyBCcmVhZGNydW1icyB0byBpZ25vcmUgYSBub3RlIGZyb20gaXRzIGluZGV4IGVudGlyZWx5LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB1c2UgQnJlYWRjcnVtYnMgdG8gaW5kZXggbm90ZXMsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBzaG93IHRoZW0gaW4gdGhlIGdyYXBoLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogdHJ1ZVwiLFxyXG4gICAgYWZ0ZXJJbmxpbmU6IFwiOjogdHJ1ZVwiLFxyXG4gICAgYWx0OiBmYWxzZSxcclxuICB9LFxyXG4gIHtcclxuICAgIGZpZWxkOiBCQ19JR05PUkVfREVORFJPTixcclxuICAgIGRlc2M6IFwiVGVsbHMgQnJlYWRjcnVtYnMgdG8gbm90IHRyZWF0IHRoaXMgbm90ZSBhcyBhIGRlbmRyb24gbm90ZSAob25seSB1c2VmdWwgaWYgdGhlIG5vdGUgbmFtZSBoYXMgeW91IGRlbmRyb24gc3BsaXR0ZXIgaW4gaXQsIHVzdWFsbHkgYSBwZXJpb2QgYC5gKS5cIixcclxuICAgIGFmdGVyWWFtbDogXCI6IHRydWVcIixcclxuICAgIGFmdGVySW5saW5lOiBcIjo6IHRydWVcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuICB7XHJcbiAgICBmaWVsZDogQkNfSElERV9UUkFJTCxcclxuICAgIGRlc2M6IFwiRG9uJ3Qgc2hvdyB0aGUgdHJhaWwgaW4gdGhpcyBub3RlXCIsXHJcbiAgICBhZnRlcllhbWw6IFwiOiB0cnVlXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiB0cnVlXCIsXHJcbiAgICBhbHQ6IGZhbHNlLFxyXG4gIH0sXHJcbiAge1xyXG4gICAgZmllbGQ6IEJDX09SREVSLFxyXG4gICAgZGVzYzogXCJTZXQgdGhlIG9yZGVyIG9mIHRoaXMgbm90ZSBpbiB0aGUgTWF0cml4IHZpZXcuIEEgbG93ZXIgdmFsdWUgcGxhY2VzIHRoaXMgbm90ZSBoaWdoZXIgaW4gdGhlIG9yZGVyLlwiLFxyXG4gICAgYWZ0ZXJZYW1sOiBcIjogXCIsXHJcbiAgICBhZnRlcklubGluZTogXCI6OiBcIixcclxuICAgIGFsdDogZmFsc2UsXHJcbiAgfSxcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBCQ19BTFRTID0gQkNfRklFTERTX0lORk8uZmlsdGVyKChmKSA9PiBmLmFsdCkubWFwKChmKSA9PiBmLmZpZWxkKTtcclxuXHJcbmV4cG9ydCBjb25zdCBJTExFR0FMX0ZJTEVOQU1FX0NIQVJTID0gW1xyXG4gIFwiXFxcXFwiLFxyXG4gIFwiL1wiLFxyXG4gIFwiOlwiLFxyXG4gIFwiKlwiLFxyXG4gIFwiP1wiLFxyXG4gICdcIicsXHJcbiAgXCI8XCIsXHJcbiAgXCI+XCIsXHJcbiAgXCJ8XCIsXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgREFUQVZJRVdfTUlTU0lORyA9XHJcbiAgXCJUaGUgRGF0YXZpZXcgcGx1Z2luIG11c3QgYmUgaW5zdGFsbGVkIGZvciB0aGlzIHRvIHdvcmtcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBBUElfTkFNRSA9IFwiQkNBUElcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBCQ1NldHRpbmdzID0ge1xyXG4gIGFkZERlbmRyb25Ob3RlczogZmFsc2UsXHJcbiAgYWRkRGF0ZU5vdGVzOiBmYWxzZSxcclxuICBhbGlhc2VzSW5JbmRleDogZmFsc2UsXHJcbiAgYWxwaGFTb3J0QXNjOiB0cnVlLFxyXG4gIGFsdExpbmtGaWVsZHM6IFtdLFxyXG4gIENTVlBhdGhzOiBcIlwiLFxyXG4gIGNyZWF0ZUluZGV4SW5kZW50OiAnICAnLFxyXG4gIGRhdGVGb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxyXG4gIGRhdGVOb3RlRm9ybWF0OiBcInl5eXktTU0tZGRcIixcclxuICBkYXRlTm90ZUZpZWxkOiBcIm5leHRcIixcclxuICBkYXRhdmlld05vdGVGaWVsZDogXCJ1cFwiLFxyXG4gIGRhdGVOb3RlQWRkTW9udGg6IFwiXCIsXHJcbiAgZGF0ZU5vdGVBZGRZZWFyOiBcIlwiLFxyXG4gIGRlYnVnTW9kZTogXCJXQVJOXCIsXHJcbiAgZGVuZHJvbk5vdGVEZWxpbWl0ZXI6IFwiLlwiLFxyXG4gIGRlbmRyb25Ob3RlRmllbGQ6IFwidXBcIixcclxuICBkdldhaXRUaW1lOiA1MDAwLFxyXG4gIGVuYWJsZUFscGhhU29ydDogdHJ1ZSxcclxuICBlbmFibGVSZWxhdGlvblN1Z2dlc3RvcjogZmFsc2UsXHJcbiAgZmllbGRTdWdnZXN0b3I6IHRydWUsXHJcbiAgZmlsdGVySW1wbGllZFNpYmxpbmdzT2ZEaWZmZXJlbnRUeXBlczogZmFsc2UsXHJcbiAganVnZ2xMYXlvdXQ6IFwiaGllcmFyY2h5XCIsXHJcbiAgbGltaXRXcml0ZUJDQ2hlY2tib3hlczogW10sXHJcbiAgQ0hFQ0tCT1hfU1RBVEVTX09WRVJXUklUVEVOOiBmYWxzZSxcclxuICBncmlkRGVmYXVsdERlcHRoOiAyNSxcclxuICBoaWVyYXJjaHlOb3RlczogW1wiXCJdLFxyXG4gIGhpZXJhcmNoeU5vdGVJc1BhcmVudDogZmFsc2UsXHJcbiAgSE5VcEZpZWxkOiBcIlwiLFxyXG4gIGluZGV4Tm90ZXM6IFtcIlwiXSxcclxuICBuYW1pbmdTeXN0ZW1GaWVsZDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1SZWdleDogXCJcIixcclxuICBuYW1pbmdTeXN0ZW1TcGxpdDogXCIuXCIsXHJcbiAgbmFtaW5nU3lzdGVtRW5kc1dpdGhEZWxpbWl0ZXI6IGZhbHNlLFxyXG4gIHJlZnJlc2hPbk5vdGVDaGFuZ2U6IGZhbHNlLFxyXG4gIHVzZUFsbE1ldGFkYXRhOiB0cnVlLFxyXG4gIG9wZW5NYXRyaXhPbkxvYWQ6IHRydWUsXHJcbiAgb3BlbkR1Y2tPbkxvYWQ6IGZhbHNlLFxyXG4gIG9wZW5Eb3duT25Mb2FkOiB0cnVlLFxyXG4gIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbDogZmFsc2UsXHJcbiAgc2hvd05hbWVPclR5cGU6IHRydWUsXHJcbiAgc2hvd1JlbGF0aW9uVHlwZTogdHJ1ZSxcclxuICByZWdleE5vdGVGaWVsZDogXCJcIixcclxuICByZWxTdWdnZXN0b3JUcmlnZ2VyOiBcIlxcXFxcIixcclxuICBybExlYWY6IHRydWUsXHJcbiAgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGU6IGZhbHNlLFxyXG4gIHNob3dBbGxBbGlhc2VzOiB0cnVlLFxyXG4gIHNob3dCQ3M6IHRydWUsXHJcbiAgc2hvd0JDc0luRWRpdExQTW9kZTogZmFsc2UsXHJcbiAgc2hvd1JlZnJlc2hOb3RpY2U6IHRydWUsXHJcbiAgc2hvd0ltcGxpZWRSZWxhdGlvbnM6IHRydWUsXHJcbiAgc2hvd1RyYWlsOiB0cnVlLFxyXG4gIHNob3dHcmlkOiB0cnVlLFxyXG4gIHNob3dKdWdnbDogZmFsc2UsXHJcbiAgc2hvd1ByZXZOZXh0OiB0cnVlLFxyXG4gIHNvcnRCeU5hbWVTaG93QWxpYXM6IGZhbHNlLFxyXG4gIHNxdWFyZURpcmVjdGlvbnNPcmRlcjogWzAsIDEsIDIsIDMsIDRdLFxyXG4gIGxpbWl0VHJhaWxDaGVja2JveGVzOiBbXSxcclxuICBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzOiBbXSxcclxuICBzaG93QWxsOiAnQWxsJyxcclxuICBub1BhdGhNZXNzYWdlOiBgVGhpcyBub3RlIGhhcyBubyByZWFsIG9yIGltcGxpZWQgcGFyZW50c2AsXHJcbiAgdGFnTm90ZUZpZWxkOiBcIlwiLFxyXG4gIHRocmVhZEludG9OZXdQYW5lOiBmYWxzZSxcclxuICB0aHJlYWRpbmdUZW1wbGF0ZTogXCJ7e2ZpZWxkfX0gb2Yge3tjdXJyZW50fX1cIixcclxuICB0aHJlYWRpbmdEaXJUZW1wbGF0ZXM6IHsgdXA6IFwiXCIsIHNhbWU6IFwiXCIsIGRvd246IFwiXCIsIG5leHQ6IFwiXCIsIHByZXY6IFwiXCIgfSxcclxuICB0aHJlYWRVbmRlckN1cnNvcjogZmFsc2UsXHJcbiAgdHJhaWxTZXBlcmF0b3I6IFwiXHUyMTkyXCIsXHJcbiAgdHJlYXRDdXJyTm9kZUFzSW1wbGllZFNpYmxpbmc6IGZhbHNlLFxyXG4gIHRyaW1EZW5kcm9uTm90ZXM6IGZhbHNlLFxyXG4gIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGg6IHRydWUsXHJcbiAgdXNlckhpZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHVwOiBbXCJ1cFwiXSxcclxuICAgICAgc2FtZTogW1wic2FtZVwiXSxcclxuICAgICAgZG93bjogW1wiZG93blwiXSxcclxuICAgICAgbmV4dDogW1wibmV4dFwiXSxcclxuICAgICAgcHJldjogW1wicHJldlwiXSxcclxuICAgIH0sXHJcbiAgXSxcclxuICB3cml0ZUJDc0lubGluZTogZmFsc2UsXHJcbiAgc2hvd1dyaXRlQWxsQkNzQ21kOiBmYWxzZSxcclxuICB2aXNHcmFwaDogXCJGb3JjZSBEaXJlY3RlZCBHcmFwaFwiLFxyXG4gIHZpc1JlbGF0aW9uOiBcIlBhcmVudFwiLFxyXG4gIHZpc0Nsb3NlZDogXCJSZWFsXCIsXHJcbiAgdmlzQWxsOiBcIkFsbFwiLFxyXG4gIHdpa2lsaW5rSW5kZXg6IHRydWUsXHJcbiAgaW1wbGllZFJlbGF0aW9uczoge1xyXG4gICAgc2libGluZ0lkZW50aXR5OiBmYWxzZSxcclxuICAgIHNhbWVQYXJlbnRJc1NpYmxpbmc6IHRydWUsXHJcbiAgICBzaWJsaW5nc1NpYmxpbmdJc1NpYmxpbmc6IGZhbHNlLFxyXG4gICAgc2libGluZ3NQYXJlbnRJc1BhcmVudDogZmFsc2UsXHJcbiAgICBwYXJlbnRzU2libGluZ3NJc1BhcmVudHM6IGZhbHNlLFxyXG4gICAgcGFyZW50c1BhcmVudHNJc1BhcmVudDogZmFsc2UsXHJcbiAgICBjb3VzaW5zSXNTaWJsaW5nOiBmYWxzZSxcclxuICB9LFxyXG4gIHJlZnJlc2hPbk5vdGVTYXZlOiBmYWxzZSxcclxuICBzaG93VXBJbkp1Z2dsOiBmYWxzZVxyXG59O1xyXG4iLCAiaW1wb3J0IHsgZXJyb3IsIGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgSXRlbVZpZXcsIFRGaWxlLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IERlYnVnZ2VyIH0gZnJvbSBcInNyYy9EZWJ1Z2dlclwiO1xyXG5pbXBvcnQgTWF0cml4IGZyb20gXCIuLi9Db21wb25lbnRzL01hdHJpeC5zdmVsdGVcIjtcclxuaW1wb3J0IHtcclxuICBBUlJPV19ESVJFQ1RJT05TLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIE1BVFJJWF9WSUVXLFxyXG4gIFRSQUlMX0lDT04sXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRGlyZWN0aW9ucyxcclxuICBFZGdlQXR0cixcclxuICBpbnRlcm5hbExpbmtPYmosXHJcbiAgU3F1YXJlSXRlbSxcclxuICBTcXVhcmVQcm9wcyxcclxuICBVc2VySGllcixcclxufSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldE9wcERpciwgZ2V0T3BwRmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0Q3VyckZpbGUsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBjbG9zZWRHLCBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBuZWlnaGJvdXJzID0gYmxhbmtSZWFsTkltcGxpZWQoKTtcclxuICBpZiAoIWNsb3NlZEcpIHJldHVybiBuZWlnaGJvdXJzO1xyXG5cclxuICBjbG9zZWRHLmZvckVhY2hFZGdlKGN1cnJOb2RlLCAoaywgYSwgcywgdCkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWVsZCwgZGlyLCBpbXBsaWVkIH0gPSBhIGFzIEVkZ2VBdHRyO1xyXG5cclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZWlnaGJvdXJzW2Rpcl0ucmVhbHMucHVzaCh7IHRvOiB0LCBmaWVsZCwgaW1wbGllZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5laWdoYm91cnNbZ2V0T3BwRGlyKGRpcildLmltcGxpZWRzLnB1c2goe1xyXG4gICAgICAgIHRvOiBzLFxyXG4gICAgICAgIGZpZWxkOiBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXSxcclxuICAgICAgICBpbXBsaWVkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIG5laWdoYm91cnM7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0cml4VmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogTWF0cml4O1xyXG4gIGRiOiBEZWJ1Z2dlcjtcclxuXHJcbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIobGVhZik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMuZGIgPSBuZXcgRGVidWdnZXIocGx1Z2luKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLm9ubG9hZCgpO1xyXG4gICAgY29uc3QgeyBwbHVnaW4gfSA9IHRoaXM7XHJcblxyXG4gICAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dChcclxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyYXcoKSxcclxuICAgICAgICBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3XHJcbiAgICAgICAgICA/IGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcuYXBpXHJcbiAgICAgICAgICAgID8gMVxyXG4gICAgICAgICAgICA6IHBsdWdpbi5zZXR0aW5ncy5kdldhaXRUaW1lXHJcbiAgICAgICAgICA6IDMwMDBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gTUFUUklYX1ZJRVc7XHJcbiAgfVxyXG4gIGdldERpc3BsYXlUZXh0KCkge1xyXG4gICAgcmV0dXJuIFwiQnJlYWRjcnVtYnMgTWF0cml4XCI7XHJcbiAgfVxyXG4gIGljb24gPSBUUkFJTF9JQ09OO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7IH1cclxuXHJcbiAgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudmlldz8uJGRlc3Ryb3koKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIGdldEFsdChub2RlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHsgcGx1Z2luIH0gPSB0aGlzO1xyXG4gICAgY29uc3QgeyBhbHRMaW5rRmllbGRzLCBzaG93QWxsQWxpYXNlcyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gICAgaWYgKCFhbHRMaW5rRmllbGRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gZHYgRmlyc3RcclxuICAgIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICAgIGlmIChkdikge1xyXG4gICAgICBjb25zdCBwYWdlID0gZHYucGFnZShub2RlKTtcclxuICAgICAgaWYgKCFwYWdlKSByZXR1cm4gbnVsbDtcclxuICAgICAgZm9yIChjb25zdCBhbHQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGFnZVthbHRdIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm9kZSwgXCJcIik7XHJcbiAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgeyBmcm9udG1hdHRlciB9ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgYWx0RmllbGQgb2YgYWx0TGlua0ZpZWxkcykge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgICBjb25zdCBhcnI6IHN0cmluZ1tdID1cclxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gc3BsaXRBbmRUcmltKHZhbHVlKSA6IHZhbHVlO1xyXG4gICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9JbnRlcm5hbExpbmtPYmogPSAoXHJcbiAgICB0bzogc3RyaW5nLFxyXG4gICAgcmVhbFEgPSB0cnVlLFxyXG4gICAgcGFyZW50OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgaW1wbGllZD86IHN0cmluZ1xyXG4gICk6IGludGVybmFsTGlua09iaiA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0byxcclxuICAgICAgY2xzOiBsaW5rQ2xhc3ModG8sIHJlYWxRKSxcclxuICAgICAgYWx0OiB0aGlzLmdldEFsdCh0byksXHJcbiAgICAgIG9yZGVyOiB0aGlzLmdldE9yZGVyKHRvKSxcclxuICAgICAgcGFyZW50LFxyXG4gICAgICBpbXBsaWVkLFxyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICAvLyBBTkNIT1IgUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkIGxpbmtzXHJcblxyXG4gIHJlbW92ZUR1cGxpY2F0ZUltcGxpZWQoXHJcbiAgICByZWFsczogaW50ZXJuYWxMaW5rT2JqW10sXHJcbiAgICBpbXBsaWVkczogaW50ZXJuYWxMaW5rT2JqW11cclxuICApOiBpbnRlcm5hbExpbmtPYmpbXSB7XHJcbiAgICBjb25zdCByZWFsVG9zID0gcmVhbHMubWFwKChyZWFsKSA9PiByZWFsLnRvKTtcclxuICAgIHJldHVybiBpbXBsaWVkcy5maWx0ZXIoKGltcGxpZWQpID0+ICFyZWFsVG9zLmluY2x1ZGVzKGltcGxpZWQudG8pKTtcclxuICB9XHJcblxyXG4gIGdldE9yZGVyID0gKG5vZGU6IHN0cmluZykgPT5cclxuICAgIE51bWJlci5wYXJzZUludCh0aGlzLnBsdWdpbi5tYWluRy5nZXROb2RlQXR0cmlidXRlKG5vZGUsIFwib3JkZXJcIikpO1xyXG5cclxuICBzb3J0SXRlbXNBbHBoYSA9IChhOiBpbnRlcm5hbExpbmtPYmosIGI6IGludGVybmFsTGlua09iaikgPT4ge1xyXG4gICAgY29uc3QgeyBzb3J0QnlOYW1lU2hvd0FsaWFzLCBhbHBoYVNvcnRBc2MgfSA9IHRoaXMucGx1Z2luLnNldHRpbmdzO1xyXG4gICAgY29uc3QgYVRvU29ydCA9IChzb3J0QnlOYW1lU2hvd0FsaWFzID8gYS50byA6IGEuYWx0ID8/IGEudG8pLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBiVG9Tb3J0ID0gKHNvcnRCeU5hbWVTaG93QWxpYXMgPyBiLnRvIDogYi5hbHQgPz8gYi50bykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBsZXNzID0gYWxwaGFTb3J0QXNjID8gLTEgOiAxO1xyXG4gICAgY29uc3QgbW9yZSA9IGFscGhhU29ydEFzYyA/IDEgOiAtMTtcclxuXHJcbiAgICByZXR1cm4gYVRvU29ydCA8IGJUb1NvcnQgPyBsZXNzIDogbW9yZTtcclxuICB9O1xyXG5cclxuICBnZXRIaWVyU3F1YXJlcyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGN1cnJGaWxlOiBURmlsZSk6IFNxdWFyZVByb3BzW11bXSB7XHJcbiAgICBjb25zdCB7IHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgbWFpbkcsIHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IGVuYWJsZUFscGhhU29ydCwgc3F1YXJlRGlyZWN0aW9uc09yZGVyIH0gPSBzZXR0aW5ncztcclxuICAgIGlmICghbWFpbkcpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBjdXJyRmlsZTtcclxuICAgIGlmICghbWFpbkcuaGFzTm9kZShiYXNlbmFtZSkpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IHJlYWxzbkltcGxpZWRzID0gZ2V0TWF0cml4TmVpZ2hib3VycyhwbHVnaW4sIGJhc2VuYW1lKTtcclxuXHJcbiAgICByZXR1cm4gdXNlckhpZXJzLm1hcCgoaGllcikgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFJlYWxOSW1wbGllZCA9IGJsYW5rUmVhbE5JbXBsaWVkKCkgYXMgdW5rbm93biBhcyB7XHJcbiAgICAgICAgW2RpciBpbiBEaXJlY3Rpb25zXToge1xyXG4gICAgICAgICAgcmVhbHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgICAgaW1wbGllZHM6IGludGVybmFsTGlua09ialtdO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXN1bHRzRmlsdGVyID0gKFxyXG4gICAgICAgIGl0ZW06IFNxdWFyZUl0ZW0sXHJcbiAgICAgICAgZGlyOiBEaXJlY3Rpb25zLFxyXG4gICAgICAgIG9wcERpcjogRGlyZWN0aW9ucyxcclxuICAgICAgICBhcnJvdzogc3RyaW5nXHJcbiAgICAgICkgPT5cclxuICAgICAgICBoaWVyW2Rpcl0uaW5jbHVkZXMoaXRlbS5maWVsZCkgfHxcclxuICAgICAgICAoaXRlbS5maWVsZC5pbmNsdWRlcyhgPCR7YXJyb3d9PmApICYmXHJcbiAgICAgICAgICBoaWVyW29wcERpcl0uaW5jbHVkZXMoaXRlbS5maWVsZC5zcGxpdChcIiA8XCIpWzBdKSk7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGRpciBpbiByZWFsc25JbXBsaWVkcykge1xyXG4gICAgICAgIGNvbnN0IG9wcERpciA9IGdldE9wcERpcihkaXIgYXMgRGlyZWN0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgYXJyb3cgPSBBUlJPV19ESVJFQ1RJT05TW2Rpcl07XHJcbiAgICAgICAgY29uc3QgeyByZWFscywgaW1wbGllZHMgfSA9IHJlYWxzbkltcGxpZWRzW2Rpcl07XHJcblxyXG4gICAgICAgIGZpbHRlcmVkUmVhbE5JbXBsaWVkW2Rpcl0ucmVhbHMgPSByZWFsc1xyXG4gICAgICAgICAgLmZpbHRlcigocmVhbCkgPT5cclxuICAgICAgICAgICAgcmVzdWx0c0ZpbHRlcihyZWFsLCBkaXIgYXMgRGlyZWN0aW9ucywgb3BwRGlyLCBhcnJvdylcclxuICAgICAgICAgIClcclxuICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XHJcbiAgICAgICAgICAgIHRoaXMudG9JbnRlcm5hbExpbmtPYmooaXRlbS50bywgdHJ1ZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZmlsdGVyZWRSZWFsTkltcGxpZWRbZGlyXS5pbXBsaWVkcyA9IGltcGxpZWRzXHJcbiAgICAgICAgICAuZmlsdGVyKChpbXBsaWVkKSA9PlxyXG4gICAgICAgICAgICByZXN1bHRzRmlsdGVyKGltcGxpZWQsIGRpciBhcyBEaXJlY3Rpb25zLCBvcHBEaXIsIGFycm93KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT5cclxuICAgICAgICAgICAgdGhpcy50b0ludGVybmFsTGlua09iaihpdGVtLnRvLCBmYWxzZSwgbnVsbCwgaXRlbS5pbXBsaWVkKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHtcclxuICAgICAgICB1cDogeyByZWFsczogcnUsIGltcGxpZWRzOiBpdSB9LFxyXG4gICAgICAgIHNhbWU6IHsgcmVhbHM6IHJzLCBpbXBsaWVkczogaXMgfSxcclxuICAgICAgICBkb3duOiB7IHJlYWxzOiByZCwgaW1wbGllZHM6IGlkIH0sXHJcbiAgICAgICAgbmV4dDogeyByZWFsczogcm4sIGltcGxpZWRzOiBpTiB9LFxyXG4gICAgICAgIHByZXY6IHsgcmVhbHM6IHJwLCBpbXBsaWVkczogaXAgfSxcclxuICAgICAgfSA9IGZpbHRlcmVkUmVhbE5JbXBsaWVkO1xyXG5cclxuICAgICAgLy8gIVNFQ1RJT05cclxuXHJcbiAgICAgIFtpdSwgaXMsIGlkLCBpTiwgaXBdID0gW1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChydSwgaXUpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycywgaXMpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChyZCwgaWQpLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChybiwgaU4pLFxyXG4gICAgICAgIHRoaXMucmVtb3ZlRHVwbGljYXRlSW1wbGllZChycCwgaXApLFxyXG4gICAgICBdO1xyXG5cclxuICAgICAgY29uc3QgaVNhbWVOb0R1cDogaW50ZXJuYWxMaW5rT2JqW10gPSBbXTtcclxuICAgICAgaXMuZm9yRWFjaCgoaW1wU2liKSA9PiB7XHJcbiAgICAgICAgaWYgKGlTYW1lTm9EdXAuZXZlcnkoKG5vRHVwKSA9PiBub0R1cC50byAhPT0gaW1wU2liLnRvKSkge1xyXG4gICAgICAgICAgaVNhbWVOb0R1cC5wdXNoKGltcFNpYik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaXMgPSBpU2FtZU5vRHVwO1xyXG5cclxuICAgICAgY29uc3QgZ2V0RmllbGRJbkhpZXIgPSAoZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gICAgICAgIGhpZXJbZGlyXVswXVxyXG4gICAgICAgICAgPyBoaWVyW2Rpcl0uam9pbihcIiwgXCIpXHJcbiAgICAgICAgICA6IGAke2hpZXJbZ2V0T3BwRGlyKGRpcildLmpvaW4oXCIsXCIpfSR7QVJST1dfRElSRUNUSU9OU1tkaXJdfWA7XHJcblxyXG4gICAgICBjb25zdCBzcXVhcmVzID0gW3J1LCBycywgcmQsIHJuLCBycCwgaXUsIGlzLCBpZCwgaU4sIGlwXTtcclxuXHJcbiAgICAgIGlmIChlbmFibGVBbHBoYVNvcnQpXHJcbiAgICAgICAgc3F1YXJlcy5mb3JFYWNoKChzcSkgPT4gc3Euc29ydCh0aGlzLnNvcnRJdGVtc0FscGhhKSk7XHJcblxyXG4gICAgICBzcXVhcmVzLmZvckVhY2goKHNxKSA9PiBzcS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikpO1xyXG5cclxuICAgICAgaW5mbyhbXHJcbiAgICAgICAgeyBydSB9LFxyXG4gICAgICAgIHsgcnMgfSxcclxuICAgICAgICB7IHJkIH0sXHJcbiAgICAgICAgeyBybiB9LFxyXG4gICAgICAgIHsgcnAgfSxcclxuICAgICAgICB7IGl1IH0sXHJcbiAgICAgICAgeyBpcyB9LFxyXG4gICAgICAgIHsgaWQgfSxcclxuICAgICAgICB7IGlOIH0sXHJcbiAgICAgICAgeyBpcCB9LFxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGNvbnN0IHNxdWFyZSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJ1LFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpdSxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInVwXCIpLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJlYWxJdGVtczogcnMsXHJcbiAgICAgICAgICBpbXBsaWVkSXRlbXM6IGlzLFxyXG4gICAgICAgICAgZmllbGQ6IGdldEZpZWxkSW5IaWVyKFwic2FtZVwiKSxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJkLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpZCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcImRvd25cIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJuLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpTixcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcIm5leHRcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWFsSXRlbXM6IHJwLFxyXG4gICAgICAgICAgaW1wbGllZEl0ZW1zOiBpcCxcclxuICAgICAgICAgIGZpZWxkOiBnZXRGaWVsZEluSGllcihcInByZXZcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgXTtcclxuXHJcbiAgICAgIHJldHVybiBzcXVhcmVEaXJlY3Rpb25zT3JkZXIubWFwKChvcmRlcikgPT4gc3F1YXJlW29yZGVyXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRyYXcoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB7IGNvbnRlbnRFbCwgZGIsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgICAgZGIuc3RhcnQyRyhcIkRyYXcgTWF0cml4IFZpZXdcIik7XHJcbiAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgICAgY29uc3QgeyB1c2VySGllcnMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICAgICAgaWYgKCFjdXJyRmlsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgaGllclNxdWFyZXMgPSB0aGlzLmdldEhpZXJTcXVhcmVzKHVzZXJIaWVycywgY3VyckZpbGUpLmZpbHRlcihcclxuICAgICAgICAoc3F1YXJlQXJyKSA9PlxyXG4gICAgICAgICAgc3F1YXJlQXJyLnNvbWUoXHJcbiAgICAgICAgICAgIChzcSkgPT4gc3EucmVhbEl0ZW1zLmxlbmd0aCArIHNxLmltcGxpZWRJdGVtcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBuZXcgTWF0cml4KHtcclxuICAgICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgICBwcm9wczogeyBoaWVyU3F1YXJlcywgbWF0cml4VmlldzogdGhpcywgY3VyckZpbGUgfSxcclxuICAgICAgfSlcclxuXHJcblxyXG4gICAgICBkYi5lbmQyRygpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGVycm9yKGVycik7XHJcbiAgICAgIHRoaXMuZGIuZW5kMkcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IGRlYnVnLCBpbmZvLCBsZXZlbHMgfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRGVidWdnZXIge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBkZWJ1Z0xlc3NUaGFuID0gKGxldmVsOiBudW1iZXIpID0+XHJcbiAgICBsZXZlbHNbdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlXSA8IGxldmVsO1xyXG5cclxuICBzdGFydDJHKGdyb3VwOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMykpIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoZ3JvdXApO1xyXG4gIH1cclxuICBlbmQyRyguLi5tc2dzOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuZGVidWdMZXNzVGhhbigzKSkge1xyXG4gICAgICBpZiAobXNncy5sZW5ndGgpIGluZm8oLi4ubXNncyk7XHJcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhcnQxRyhncm91cDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Z0xlc3NUaGFuKDIpKSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGdyb3VwKTtcclxuICB9XHJcbiAgZW5kMUcoLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmICh0aGlzLmRlYnVnTGVzc1RoYW4oMikpIHtcclxuICAgICAgaWYgKG1zZ3MubGVuZ3RoKSBkZWJ1ZyguLi5tc2dzKTtcclxuICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRHcyguLi5ncm91cHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnN0YXJ0MkcoZ3JvdXBzWzBdKTtcclxuICAgIGlmIChncm91cHNbMV0pIHRoaXMuc3RhcnQxRyhncm91cHNbMV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5kIGEgZGVidWcgYW5kIGluZm8gZ3JvdXAsIGxvZ2dpbmcgYG1zZ3NgIGluIGBlbmREZWJ1Z0dyb3VwYFxyXG4gICAqIEBwYXJhbSAgezF8Mn0gY291bnQgVGhlIG51bWJlciBvZiBncm91cHMgdG8gZW5kLiBgMWAgZW5kcyBUcmFjZSwgMiBlbmRzIGJvdGhcclxuICAgKiBAcGFyYW0gIHthbnlbXX0gLi4ubXNnc1xyXG4gICAqL1xyXG4gIGVuZEdzKGNvdW50OiAxIHwgMiwgLi4ubXNnczogYW55W10pIHtcclxuICAgIGlmIChjb3VudCA9PT0gMSkgdGhpcy5lbmQyRyguLi5tc2dzKTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZDFHKCk7XHJcbiAgICAgIHRoaXMuZW5kMkcoLi4ubXNncyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJmdW5jdGlvbiBub29wKCkgeyB9XG5jb25zdCBpZGVudGl0eSA9IHggPT4geDtcbmZ1bmN0aW9uIGFzc2lnbih0YXIsIHNyYykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGsgaW4gc3JjKVxuICAgICAgICB0YXJba10gPSBzcmNba107XG4gICAgcmV0dXJuIHRhcjtcbn1cbmZ1bmN0aW9uIGlzX3Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGFkZF9sb2NhdGlvbihlbGVtZW50LCBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIpIHtcbiAgICBlbGVtZW50Ll9fc3ZlbHRlX21ldGEgPSB7XG4gICAgICAgIGxvYzogeyBmaWxlLCBsaW5lLCBjb2x1bW4sIGNoYXIgfVxuICAgIH07XG59XG5mdW5jdGlvbiBydW4oZm4pIHtcbiAgICByZXR1cm4gZm4oKTtcbn1cbmZ1bmN0aW9uIGJsYW5rX29iamVjdCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cbmZ1bmN0aW9uIHJ1bl9hbGwoZm5zKSB7XG4gICAgZm5zLmZvckVhY2gocnVuKTtcbn1cbmZ1bmN0aW9uIGlzX2Z1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIHNhZmVfbm90X2VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gYSAhPSBhID8gYiA9PSBiIDogYSAhPT0gYiB8fCAoKGEgJiYgdHlwZW9mIGEgPT09ICdvYmplY3QnKSB8fCB0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5sZXQgc3JjX3VybF9lcXVhbF9hbmNob3I7XG5mdW5jdGlvbiBzcmNfdXJsX2VxdWFsKGVsZW1lbnRfc3JjLCB1cmwpIHtcbiAgICBpZiAoIXNyY191cmxfZXF1YWxfYW5jaG9yKSB7XG4gICAgICAgIHNyY191cmxfZXF1YWxfYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIH1cbiAgICBzcmNfdXJsX2VxdWFsX2FuY2hvci5ocmVmID0gdXJsO1xuICAgIHJldHVybiBlbGVtZW50X3NyYyA9PT0gc3JjX3VybF9lcXVhbF9hbmNob3IuaHJlZjtcbn1cbmZ1bmN0aW9uIG5vdF9lcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGEgIT0gYSA/IGIgPT0gYiA6IGEgIT09IGI7XG59XG5mdW5jdGlvbiBpc19lbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9zdG9yZShzdG9yZSwgbmFtZSkge1xuICAgIGlmIChzdG9yZSAhPSBudWxsICYmIHR5cGVvZiBzdG9yZS5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgaXMgbm90IGEgc3RvcmUgd2l0aCBhICdzdWJzY3JpYmUnIG1ldGhvZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN1YnNjcmliZShzdG9yZSwgLi4uY2FsbGJhY2tzKSB7XG4gICAgaWYgKHN0b3JlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuICAgIGNvbnN0IHVuc3ViID0gc3RvcmUuc3Vic2NyaWJlKC4uLmNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIHVuc3ViLnVuc3Vic2NyaWJlID8gKCkgPT4gdW5zdWIudW5zdWJzY3JpYmUoKSA6IHVuc3ViO1xufVxuZnVuY3Rpb24gZ2V0X3N0b3JlX3ZhbHVlKHN0b3JlKSB7XG4gICAgbGV0IHZhbHVlO1xuICAgIHN1YnNjcmliZShzdG9yZSwgXyA9PiB2YWx1ZSA9IF8pKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY29tcG9uZW50X3N1YnNjcmliZShjb21wb25lbnQsIHN0b3JlLCBjYWxsYmFjaykge1xuICAgIGNvbXBvbmVudC4kJC5vbl9kZXN0cm95LnB1c2goc3Vic2NyaWJlKHN0b3JlLCBjYWxsYmFjaykpO1xufVxuZnVuY3Rpb24gY3JlYXRlX3Nsb3QoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNsb3RfY3R4ID0gZ2V0X3Nsb3RfY29udGV4dChkZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGZuKTtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25bMF0oc2xvdF9jdHgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldF9zbG90X2NvbnRleHQoZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBmbikge1xuICAgIHJldHVybiBkZWZpbml0aW9uWzFdICYmIGZuXG4gICAgICAgID8gYXNzaWduKCQkc2NvcGUuY3R4LnNsaWNlKCksIGRlZmluaXRpb25bMV0oZm4oY3R4KSkpXG4gICAgICAgIDogJCRzY29wZS5jdHg7XG59XG5mdW5jdGlvbiBnZXRfc2xvdF9jaGFuZ2VzKGRlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBmbikge1xuICAgIGlmIChkZWZpbml0aW9uWzJdICYmIGZuKSB7XG4gICAgICAgIGNvbnN0IGxldHMgPSBkZWZpbml0aW9uWzJdKGZuKGRpcnR5KSk7XG4gICAgICAgIGlmICgkJHNjb3BlLmRpcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGV0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gTWF0aC5tYXgoJCRzY29wZS5kaXJ0eS5sZW5ndGgsIGxldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRbaV0gPSAkJHNjb3BlLmRpcnR5W2ldIHwgbGV0c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICQkc2NvcGUuZGlydHkgfCBsZXRzO1xuICAgIH1cbiAgICByZXR1cm4gJCRzY29wZS5kaXJ0eTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9zbG90X2Jhc2Uoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIHNsb3RfY2hhbmdlcywgZ2V0X3Nsb3RfY29udGV4dF9mbikge1xuICAgIGlmIChzbG90X2NoYW5nZXMpIHtcbiAgICAgICAgY29uc3Qgc2xvdF9jb250ZXh0ID0gZ2V0X3Nsb3RfY29udGV4dChzbG90X2RlZmluaXRpb24sIGN0eCwgJCRzY29wZSwgZ2V0X3Nsb3RfY29udGV4dF9mbik7XG4gICAgICAgIHNsb3QucChzbG90X2NvbnRleHQsIHNsb3RfY2hhbmdlcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX3Nsb3Qoc2xvdCwgc2xvdF9kZWZpbml0aW9uLCBjdHgsICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuLCBnZXRfc2xvdF9jb250ZXh0X2ZuKSB7XG4gICAgY29uc3Qgc2xvdF9jaGFuZ2VzID0gZ2V0X3Nsb3RfY2hhbmdlcyhzbG90X2RlZmluaXRpb24sICQkc2NvcGUsIGRpcnR5LCBnZXRfc2xvdF9jaGFuZ2VzX2ZuKTtcbiAgICB1cGRhdGVfc2xvdF9iYXNlKHNsb3QsIHNsb3RfZGVmaW5pdGlvbiwgY3R4LCAkJHNjb3BlLCBzbG90X2NoYW5nZXMsIGdldF9zbG90X2NvbnRleHRfZm4pO1xufVxuZnVuY3Rpb24gZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlKCQkc2NvcGUpIHtcbiAgICBpZiAoJCRzY29wZS5jdHgubGVuZ3RoID4gMzIpIHtcbiAgICAgICAgY29uc3QgZGlydHkgPSBbXTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gJCRzY29wZS5jdHgubGVuZ3RoIC8gMzI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRpcnR5W2ldID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBleGNsdWRlX2ludGVybmFsX3Byb3BzKHByb3BzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrIGluIHByb3BzKVxuICAgICAgICBpZiAoa1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gcHJvcHNba107XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVfcmVzdF9wcm9wcyhwcm9wcywga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSB7fTtcbiAgICBrZXlzID0gbmV3IFNldChrZXlzKTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gcHJvcHMpXG4gICAgICAgIGlmICgha2V5cy5oYXMoaykgJiYga1swXSAhPT0gJyQnKVxuICAgICAgICAgICAgcmVzdFtrXSA9IHByb3BzW2tdO1xuICAgIHJldHVybiByZXN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZV9zbG90cyhzbG90cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgICBsZXQgcmFuID0gZmFsc2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChyYW4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJhbiA9IHRydWU7XG4gICAgICAgIGZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG51bGxfdG9fZW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG59XG5mdW5jdGlvbiBzZXRfc3RvcmVfdmFsdWUoc3RvcmUsIHJldCwgdmFsdWUpIHtcbiAgICBzdG9yZS5zZXQodmFsdWUpO1xuICAgIHJldHVybiByZXQ7XG59XG5jb25zdCBoYXNfcHJvcCA9IChvYmosIHByb3ApID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuZnVuY3Rpb24gYWN0aW9uX2Rlc3Ryb3llcihhY3Rpb25fcmVzdWx0KSB7XG4gICAgcmV0dXJuIGFjdGlvbl9yZXN1bHQgJiYgaXNfZnVuY3Rpb24oYWN0aW9uX3Jlc3VsdC5kZXN0cm95KSA/IGFjdGlvbl9yZXN1bHQuZGVzdHJveSA6IG5vb3A7XG59XG5cbmNvbnN0IGlzX2NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xubGV0IG5vdyA9IGlzX2NsaWVudFxuICAgID8gKCkgPT4gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgOiAoKSA9PiBEYXRlLm5vdygpO1xubGV0IHJhZiA9IGlzX2NsaWVudCA/IGNiID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZShjYikgOiBub29wO1xuLy8gdXNlZCBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nXG5mdW5jdGlvbiBzZXRfbm93KGZuKSB7XG4gICAgbm93ID0gZm47XG59XG5mdW5jdGlvbiBzZXRfcmFmKGZuKSB7XG4gICAgcmFmID0gZm47XG59XG5cbmNvbnN0IHRhc2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gcnVuX3Rhc2tzKG5vdykge1xuICAgIHRhc2tzLmZvckVhY2godGFzayA9PiB7XG4gICAgICAgIGlmICghdGFzay5jKG5vdykpIHtcbiAgICAgICAgICAgIHRhc2tzLmRlbGV0ZSh0YXNrKTtcbiAgICAgICAgICAgIHRhc2suZigpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRhc2tzLnNpemUgIT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xufVxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5IVxuICovXG5mdW5jdGlvbiBjbGVhcl9sb29wcygpIHtcbiAgICB0YXNrcy5jbGVhcigpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRhc2sgdGhhdCBydW5zIG9uIGVhY2ggcmFmIGZyYW1lXG4gKiB1bnRpbCBpdCByZXR1cm5zIGEgZmFsc3kgdmFsdWUgb3IgaXMgYWJvcnRlZFxuICovXG5mdW5jdGlvbiBsb29wKGNhbGxiYWNrKSB7XG4gICAgbGV0IHRhc2s7XG4gICAgaWYgKHRhc2tzLnNpemUgPT09IDApXG4gICAgICAgIHJhZihydW5fdGFza3MpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bGZpbGwgPT4ge1xuICAgICAgICAgICAgdGFza3MuYWRkKHRhc2sgPSB7IGM6IGNhbGxiYWNrLCBmOiBmdWxmaWxsIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgYWJvcnQoKSB7XG4gICAgICAgICAgICB0YXNrcy5kZWxldGUodGFzayk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUcmFjayB3aGljaCBub2RlcyBhcmUgY2xhaW1lZCBkdXJpbmcgaHlkcmF0aW9uLiBVbmNsYWltZWQgbm9kZXMgY2FuIHRoZW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBET01cbi8vIGF0IHRoZSBlbmQgb2YgaHlkcmF0aW9uIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHJlbWFpbmluZyBub2Rlcy5cbmxldCBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHN0YXJ0X2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gZW5kX2h5ZHJhdGluZygpIHtcbiAgICBpc19oeWRyYXRpbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwcGVyX2JvdW5kKGxvdywgaGlnaCwga2V5LCB2YWx1ZSkge1xuICAgIC8vIFJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZSBsYXJnZXIgdGhhbiBpbnB1dCB2YWx1ZSBpbiB0aGUgcmFuZ2UgW2xvdywgaGlnaClcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpID4+IDEpO1xuICAgICAgICBpZiAoa2V5KG1pZCkgPD0gdmFsdWUpIHtcbiAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG59XG5mdW5jdGlvbiBpbml0X2h5ZHJhdGUodGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5oeWRyYXRlX2luaXQpXG4gICAgICAgIHJldHVybjtcbiAgICB0YXJnZXQuaHlkcmF0ZV9pbml0ID0gdHJ1ZTtcbiAgICAvLyBXZSBrbm93IHRoYXQgYWxsIGNoaWxkcmVuIGhhdmUgY2xhaW1fb3JkZXIgdmFsdWVzIHNpbmNlIHRoZSB1bmNsYWltZWQgaGF2ZSBiZWVuIGRldGFjaGVkIGlmIHRhcmdldCBpcyBub3QgPGhlYWQ+XG4gICAgbGV0IGNoaWxkcmVuID0gdGFyZ2V0LmNoaWxkTm9kZXM7XG4gICAgLy8gSWYgdGFyZ2V0IGlzIDxoZWFkPiwgdGhlcmUgbWF5IGJlIGNoaWxkcmVuIHdpdGhvdXQgY2xhaW1fb3JkZXJcbiAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lID09PSAnSEVBRCcpIHtcbiAgICAgICAgY29uc3QgbXlDaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobm9kZS5jbGFpbV9vcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbXlDaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuID0gbXlDaGlsZHJlbjtcbiAgICB9XG4gICAgLypcbiAgICAqIFJlb3JkZXIgY2xhaW1lZCBjaGlsZHJlbiBvcHRpbWFsbHkuXG4gICAgKiBXZSBjYW4gcmVvcmRlciBjbGFpbWVkIGNoaWxkcmVuIG9wdGltYWxseSBieSBmaW5kaW5nIHRoZSBsb25nZXN0IHN1YnNlcXVlbmNlIG9mXG4gICAgKiBub2RlcyB0aGF0IGFyZSBhbHJlYWR5IGNsYWltZWQgaW4gb3JkZXIgYW5kIG9ubHkgbW92aW5nIHRoZSByZXN0LiBUaGUgbG9uZ2VzdFxuICAgICogc3Vic2VxdWVuY2Ugc3Vic2VxdWVuY2Ugb2Ygbm9kZXMgdGhhdCBhcmUgY2xhaW1lZCBpbiBvcmRlciBjYW4gYmUgZm91bmQgYnlcbiAgICAqIGNvbXB1dGluZyB0aGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9mIC5jbGFpbV9vcmRlciB2YWx1ZXMuXG4gICAgKlxuICAgICogVGhpcyBhbGdvcml0aG0gaXMgb3B0aW1hbCBpbiBnZW5lcmF0aW5nIHRoZSBsZWFzdCBhbW91bnQgb2YgcmVvcmRlciBvcGVyYXRpb25zXG4gICAgKiBwb3NzaWJsZS5cbiAgICAqXG4gICAgKiBQcm9vZjpcbiAgICAqIFdlIGtub3cgdGhhdCwgZ2l2ZW4gYSBzZXQgb2YgcmVvcmRlcmluZyBvcGVyYXRpb25zLCB0aGUgbm9kZXMgdGhhdCBkbyBub3QgbW92ZVxuICAgICogYWx3YXlzIGZvcm0gYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSwgc2luY2UgdGhleSBkbyBub3QgbW92ZSBhbW9uZyBlYWNoIG90aGVyXG4gICAgKiBtZWFuaW5nIHRoYXQgdGhleSBtdXN0IGJlIGFscmVhZHkgb3JkZXJlZCBhbW9uZyBlYWNoIG90aGVyLiBUaHVzLCB0aGUgbWF4aW1hbFxuICAgICogc2V0IG9mIG5vZGVzIHRoYXQgZG8gbm90IG1vdmUgZm9ybSBhIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZS5cbiAgICAqL1xuICAgIC8vIENvbXB1dGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlXG4gICAgLy8gbTogc3Vic2VxdWVuY2UgbGVuZ3RoIGogPT4gaW5kZXggayBvZiBzbWFsbGVzdCB2YWx1ZSB0aGF0IGVuZHMgYW4gaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggalxuICAgIGNvbnN0IG0gPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGggKyAxKTtcbiAgICAvLyBQcmVkZWNlc3NvciBpbmRpY2VzICsgMVxuICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShjaGlsZHJlbi5sZW5ndGgpO1xuICAgIG1bMF0gPSAtMTtcbiAgICBsZXQgbG9uZ2VzdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gY2hpbGRyZW5baV0uY2xhaW1fb3JkZXI7XG4gICAgICAgIC8vIEZpbmQgdGhlIGxhcmdlc3Qgc3Vic2VxdWVuY2UgbGVuZ3RoIHN1Y2ggdGhhdCBpdCBlbmRzIGluIGEgdmFsdWUgbGVzcyB0aGFuIG91ciBjdXJyZW50IHZhbHVlXG4gICAgICAgIC8vIHVwcGVyX2JvdW5kIHJldHVybnMgZmlyc3QgZ3JlYXRlciB2YWx1ZSwgc28gd2Ugc3VidHJhY3Qgb25lXG4gICAgICAgIC8vIHdpdGggZmFzdCBwYXRoIGZvciB3aGVuIHdlIGFyZSBvbiB0aGUgY3VycmVudCBsb25nZXN0IHN1YnNlcXVlbmNlXG4gICAgICAgIGNvbnN0IHNlcUxlbiA9ICgobG9uZ2VzdCA+IDAgJiYgY2hpbGRyZW5bbVtsb25nZXN0XV0uY2xhaW1fb3JkZXIgPD0gY3VycmVudCkgPyBsb25nZXN0ICsgMSA6IHVwcGVyX2JvdW5kKDEsIGxvbmdlc3QsIGlkeCA9PiBjaGlsZHJlblttW2lkeF1dLmNsYWltX29yZGVyLCBjdXJyZW50KSkgLSAxO1xuICAgICAgICBwW2ldID0gbVtzZXFMZW5dICsgMTtcbiAgICAgICAgY29uc3QgbmV3TGVuID0gc2VxTGVuICsgMTtcbiAgICAgICAgLy8gV2UgY2FuIGd1YXJhbnRlZSB0aGF0IGN1cnJlbnQgaXMgdGhlIHNtYWxsZXN0IHZhbHVlLiBPdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgZ2VuZXJhdGVkIGEgbG9uZ2VyIHNlcXVlbmNlLlxuICAgICAgICBtW25ld0xlbl0gPSBpO1xuICAgICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmV3TGVuLCBsb25nZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZSBvZiBub2RlcyAoaW5pdGlhbGx5IHJldmVyc2VkKVxuICAgIGNvbnN0IGxpcyA9IFtdO1xuICAgIC8vIFRoZSByZXN0IG9mIHRoZSBub2Rlcywgbm9kZXMgdGhhdCB3aWxsIGJlIG1vdmVkXG4gICAgY29uc3QgdG9Nb3ZlID0gW107XG4gICAgbGV0IGxhc3QgPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IGN1ciA9IG1bbG9uZ2VzdF0gKyAxOyBjdXIgIT0gMDsgY3VyID0gcFtjdXIgLSAxXSkge1xuICAgICAgICBsaXMucHVzaChjaGlsZHJlbltjdXIgLSAxXSk7XG4gICAgICAgIGZvciAoOyBsYXN0ID49IGN1cjsgbGFzdC0tKSB7XG4gICAgICAgICAgICB0b01vdmUucHVzaChjaGlsZHJlbltsYXN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdC0tO1xuICAgIH1cbiAgICBmb3IgKDsgbGFzdCA+PSAwOyBsYXN0LS0pIHtcbiAgICAgICAgdG9Nb3ZlLnB1c2goY2hpbGRyZW5bbGFzdF0pO1xuICAgIH1cbiAgICBsaXMucmV2ZXJzZSgpO1xuICAgIC8vIFdlIHNvcnQgdGhlIG5vZGVzIGJlaW5nIG1vdmVkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZWlyIGluc2VydGlvbiBvcmRlciBtYXRjaGVzIHRoZSBjbGFpbSBvcmRlclxuICAgIHRvTW92ZS5zb3J0KChhLCBiKSA9PiBhLmNsYWltX29yZGVyIC0gYi5jbGFpbV9vcmRlcik7XG4gICAgLy8gRmluYWxseSwgd2UgbW92ZSB0aGUgbm9kZXNcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0b01vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgd2hpbGUgKGogPCBsaXMubGVuZ3RoICYmIHRvTW92ZVtpXS5jbGFpbV9vcmRlciA+PSBsaXNbal0uY2xhaW1fb3JkZXIpIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbmNob3IgPSBqIDwgbGlzLmxlbmd0aCA/IGxpc1tqXSA6IG51bGw7XG4gICAgICAgIHRhcmdldC5pbnNlcnRCZWZvcmUodG9Nb3ZlW2ldLCBhbmNob3IpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGVuZCh0YXJnZXQsIG5vZGUpIHtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQobm9kZSk7XG59XG5mdW5jdGlvbiBhcHBlbmRfc3R5bGVzKHRhcmdldCwgc3R5bGVfc2hlZXRfaWQsIHN0eWxlcykge1xuICAgIGNvbnN0IGFwcGVuZF9zdHlsZXNfdG8gPSBnZXRfcm9vdF9mb3Jfc3R5bGUodGFyZ2V0KTtcbiAgICBpZiAoIWFwcGVuZF9zdHlsZXNfdG8uZ2V0RWxlbWVudEJ5SWQoc3R5bGVfc2hlZXRfaWQpKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaWQgPSBzdHlsZV9zaGVldF9pZDtcbiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgICAgIGFwcGVuZF9zdHlsZXNoZWV0KGFwcGVuZF9zdHlsZXNfdG8sIHN0eWxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSkge1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIGNvbnN0IHJvb3QgPSBub2RlLmdldFJvb3ROb2RlID8gbm9kZS5nZXRSb290Tm9kZSgpIDogbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmIChyb290ICYmIHJvb3QuaG9zdCkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpIHtcbiAgICBjb25zdCBzdHlsZV9lbGVtZW50ID0gZWxlbWVudCgnc3R5bGUnKTtcbiAgICBhcHBlbmRfc3R5bGVzaGVldChnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSksIHN0eWxlX2VsZW1lbnQpO1xuICAgIHJldHVybiBzdHlsZV9lbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kX3N0eWxlc2hlZXQobm9kZSwgc3R5bGUpIHtcbiAgICBhcHBlbmQobm9kZS5oZWFkIHx8IG5vZGUsIHN0eWxlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZF9oeWRyYXRpb24odGFyZ2V0LCBub2RlKSB7XG4gICAgaWYgKGlzX2h5ZHJhdGluZykge1xuICAgICAgICBpbml0X2h5ZHJhdGUodGFyZ2V0KTtcbiAgICAgICAgaWYgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9PT0gdW5kZWZpbmVkKSB8fCAoKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkICE9PSBudWxsKSAmJiAodGFyZ2V0LmFjdHVhbF9lbmRfY2hpbGQucGFyZW50RWxlbWVudCAhPT0gdGFyZ2V0KSkpIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2tpcCBub2RlcyBvZiB1bmRlZmluZWQgb3JkZXJpbmdcbiAgICAgICAgd2hpbGUgKCh0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCAhPT0gbnVsbCkgJiYgKHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLmNsYWltX29yZGVyID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCA9IHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlICE9PSB0YXJnZXQuYWN0dWFsX2VuZF9jaGlsZCkge1xuICAgICAgICAgICAgLy8gV2Ugb25seSBpbnNlcnQgaWYgdGhlIG9yZGVyaW5nIG9mIHRoaXMgbm9kZSBzaG91bGQgYmUgbW9kaWZpZWQgb3IgdGhlIHBhcmVudCBub2RlIGlzIG5vdCB0YXJnZXRcbiAgICAgICAgICAgIGlmIChub2RlLmNsYWltX29yZGVyICE9PSB1bmRlZmluZWQgfHwgbm9kZS5wYXJlbnROb2RlICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5hY3R1YWxfZW5kX2NoaWxkID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnQodGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbn1cbmZ1bmN0aW9uIGluc2VydF9oeWRyYXRpb24odGFyZ2V0LCBub2RlLCBhbmNob3IpIHtcbiAgICBpZiAoaXNfaHlkcmF0aW5nICYmICFhbmNob3IpIHtcbiAgICAgICAgYXBwZW5kX2h5ZHJhdGlvbih0YXJnZXQsIG5vZGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgIT09IHRhcmdldCB8fCBub2RlLm5leHRTaWJsaW5nICE9IGFuY2hvcikge1xuICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKG5vZGUsIGFuY2hvciB8fCBudWxsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2gobm9kZSkge1xuICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3lfZWFjaChpdGVyYXRpb25zLCBkZXRhY2hpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnNbaV0pXG4gICAgICAgICAgICBpdGVyYXRpb25zW2ldLmQoZGV0YWNoaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRfaXMobmFtZSwgaXMpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lLCB7IGlzIH0pO1xufVxuZnVuY3Rpb24gb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcyhvYmosIGV4Y2x1ZGUpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmIChoYXNfcHJvcChvYmosIGspXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAmJiBleGNsdWRlLmluZGV4T2YoaykgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0YXJnZXRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHN2Z19lbGVtZW50KG5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5hbWUpO1xufVxuZnVuY3Rpb24gdGV4dChkYXRhKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpO1xufVxuZnVuY3Rpb24gc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRleHQoJyAnKTtcbn1cbmZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiB0ZXh0KCcnKTtcbn1cbmZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBwcmV2ZW50X2RlZmF1bHQoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzdG9wX3Byb3BhZ2F0aW9uKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNlbGYoZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcylcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG59XG5mdW5jdGlvbiB0cnVzdGVkKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChldmVudC5pc1RydXN0ZWQpXG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gc2V0X2F0dHJpYnV0ZXMobm9kZSwgYXR0cmlidXRlcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5vZGUuX19wcm90b19fKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdzdHlsZScpIHtcbiAgICAgICAgICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXkgPT09ICdfX3ZhbHVlJykge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGVba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXNjcmlwdG9yc1trZXldICYmIGRlc2NyaXB0b3JzW2tleV0uc2V0KSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdmdfYXR0cmlidXRlcyhub2RlLCBhdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBhdHRyKG5vZGUsIGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YShub2RlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGlmIChwcm9wIGluIG5vZGUpIHtcbiAgICAgICAgbm9kZVtwcm9wXSA9IHR5cGVvZiBub2RlW3Byb3BdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICcnID8gdHJ1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXR0cihub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geGxpbmtfYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGF0dHJpYnV0ZSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gZ2V0X2JpbmRpbmdfZ3JvdXBfdmFsdWUoZ3JvdXAsIF9fdmFsdWUsIGNoZWNrZWQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChncm91cFtpXS5jaGVja2VkKVxuICAgICAgICAgICAgdmFsdWUuYWRkKGdyb3VwW2ldLl9fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrZWQpIHtcbiAgICAgICAgdmFsdWUuZGVsZXRlKF9fdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b19udW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICcnID8gbnVsbCA6ICt2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRpbWVfcmFuZ2VzX3RvX2FycmF5KHJhbmdlcykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyYXkucHVzaCh7IHN0YXJ0OiByYW5nZXMuc3RhcnQoaSksIGVuZDogcmFuZ2VzLmVuZChpKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gY2hpbGRyZW4oZWxlbWVudCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG59XG5mdW5jdGlvbiBpbml0X2NsYWltX2luZm8obm9kZXMpIHtcbiAgICBpZiAobm9kZXMuY2xhaW1faW5mbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGVzLmNsYWltX2luZm8gPSB7IGxhc3RfaW5kZXg6IDAsIHRvdGFsX2NsYWltZWQ6IDAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGFpbV9ub2RlKG5vZGVzLCBwcmVkaWNhdGUsIHByb2Nlc3NOb2RlLCBjcmVhdGVOb2RlLCBkb250VXBkYXRlTGFzdEluZGV4ID0gZmFsc2UpIHtcbiAgICAvLyBUcnkgdG8gZmluZCBub2RlcyBpbiBhbiBvcmRlciBzdWNoIHRoYXQgd2UgbGVuZ3RoZW4gdGhlIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgcmVzdWx0Tm9kZSA9ICgoKSA9PiB7XG4gICAgICAgIC8vIFdlIGZpcnN0IHRyeSB0byBmaW5kIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZVxuICAgICAgICBmb3IgKGxldCBpID0gbm9kZXMuY2xhaW1faW5mby5sYXN0X2luZGV4OyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHByb2Nlc3NOb2RlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzW2ldID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZG9udFVwZGF0ZUxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHRyeSB0byBmaW5kIG9uZSBiZWZvcmVcbiAgICAgICAgLy8gV2UgaXRlcmF0ZSBpbiByZXZlcnNlIHNvIHRoYXQgd2UgZG9uJ3QgZ28gdG9vIGZhciBiYWNrXG4gICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5jbGFpbV9pbmZvLmxhc3RfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gcHJvY2Vzc05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbaV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkb250VXBkYXRlTGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2Ugc3BsaWNlZCBiZWZvcmUgdGhlIGxhc3RfaW5kZXgsIHdlIGRlY3JlYXNlIGl0XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmNsYWltX2luZm8ubGFzdF9pbmRleC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGFueSBtYXRjaGluZyBub2RlLCB3ZSBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgIHJldHVybiBjcmVhdGVOb2RlKCk7XG4gICAgfSkoKTtcbiAgICByZXN1bHROb2RlLmNsYWltX29yZGVyID0gbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkO1xuICAgIG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZCArPSAxO1xuICAgIHJldHVybiByZXN1bHROb2RlO1xufVxuZnVuY3Rpb24gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBjcmVhdGVfZWxlbWVudCkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlTmFtZSA9PT0gbmFtZSwgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub2RlLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlLnB1c2goYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZS5mb3JFYWNoKHYgPT4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUodikpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sICgpID0+IGNyZWF0ZV9lbGVtZW50KG5hbWUpKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2VsZW1lbnQobm9kZXMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICByZXR1cm4gY2xhaW1fZWxlbWVudF9iYXNlKG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzLCBlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGNsYWltX3N2Z19lbGVtZW50KG5vZGVzLCBuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX2VsZW1lbnRfYmFzZShub2RlcywgbmFtZSwgYXR0cmlidXRlcywgc3ZnX2VsZW1lbnQpO1xufVxuZnVuY3Rpb24gY2xhaW1fdGV4dChub2RlcywgZGF0YSkge1xuICAgIHJldHVybiBjbGFpbV9ub2RlKG5vZGVzLCAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMywgKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YVN0ciA9ICcnICsgZGF0YTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YS5zdGFydHNXaXRoKGRhdGFTdHIpKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhLmxlbmd0aCAhPT0gZGF0YVN0ci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zcGxpdFRleHQoZGF0YVN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gZGF0YVN0cjtcbiAgICAgICAgfVxuICAgIH0sICgpID0+IHRleHQoZGF0YSksIHRydWUgLy8gVGV4dCBub2RlcyBzaG91bGQgbm90IHVwZGF0ZSBsYXN0IGluZGV4IHNpbmNlIGl0IGlzIGxpa2VseSBub3Qgd29ydGggaXQgdG8gZWxpbWluYXRlIGFuIGluY3JlYXNpbmcgc3Vic2VxdWVuY2Ugb2YgYWN0dWFsIGVsZW1lbnRzXG4gICAgKTtcbn1cbmZ1bmN0aW9uIGNsYWltX3NwYWNlKG5vZGVzKSB7XG4gICAgcmV0dXJuIGNsYWltX3RleHQobm9kZXMsICcgJyk7XG59XG5mdW5jdGlvbiBmaW5kX2NvbW1lbnQobm9kZXMsIHRleHQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBjb21tZW50IG5vZGUgKi8gJiYgbm9kZS50ZXh0Q29udGVudC50cmltKCkgPT09IHRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBjbGFpbV9odG1sX3RhZyhub2Rlcykge1xuICAgIC8vIGZpbmQgaHRtbCBvcGVuaW5nIHRhZ1xuICAgIGNvbnN0IHN0YXJ0X2luZGV4ID0gZmluZF9jb21tZW50KG5vZGVzLCAnSFRNTF9UQUdfU1RBUlQnLCAwKTtcbiAgICBjb25zdCBlbmRfaW5kZXggPSBmaW5kX2NvbW1lbnQobm9kZXMsICdIVE1MX1RBR19FTkQnLCBzdGFydF9pbmRleCk7XG4gICAgaWYgKHN0YXJ0X2luZGV4ID09PSBlbmRfaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdG1sVGFnSHlkcmF0aW9uKCk7XG4gICAgfVxuICAgIGluaXRfY2xhaW1faW5mbyhub2Rlcyk7XG4gICAgY29uc3QgaHRtbF90YWdfbm9kZXMgPSBub2Rlcy5zcGxpY2Uoc3RhcnRfaW5kZXgsIGVuZF9pbmRleCArIDEpO1xuICAgIGRldGFjaChodG1sX3RhZ19ub2Rlc1swXSk7XG4gICAgZGV0YWNoKGh0bWxfdGFnX25vZGVzW2h0bWxfdGFnX25vZGVzLmxlbmd0aCAtIDFdKTtcbiAgICBjb25zdCBjbGFpbWVkX25vZGVzID0gaHRtbF90YWdfbm9kZXMuc2xpY2UoMSwgaHRtbF90YWdfbm9kZXMubGVuZ3RoIC0gMSk7XG4gICAgZm9yIChjb25zdCBuIG9mIGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgbi5jbGFpbV9vcmRlciA9IG5vZGVzLmNsYWltX2luZm8udG90YWxfY2xhaW1lZDtcbiAgICAgICAgbm9kZXMuY2xhaW1faW5mby50b3RhbF9jbGFpbWVkICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHRtbFRhZ0h5ZHJhdGlvbihjbGFpbWVkX25vZGVzKTtcbn1cbmZ1bmN0aW9uIHNldF9kYXRhKHRleHQsIGRhdGEpIHtcbiAgICBkYXRhID0gJycgKyBkYXRhO1xuICAgIGlmICh0ZXh0Lndob2xlVGV4dCAhPT0gZGF0YSlcbiAgICAgICAgdGV4dC5kYXRhID0gZGF0YTtcbn1cbmZ1bmN0aW9uIHNldF9pbnB1dF92YWx1ZShpbnB1dCwgdmFsdWUpIHtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc2V0X2lucHV0X3R5cGUoaW5wdXQsIHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgICBpbnB1dC50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldF9zdHlsZShub2RlLCBrZXksIHZhbHVlLCBpbXBvcnRhbnQpIHtcbiAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xufVxuZnVuY3Rpb24gc2VsZWN0X29wdGlvbihzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKG9wdGlvbi5fX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IC0xOyAvLyBubyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkXG59XG5mdW5jdGlvbiBzZWxlY3Rfb3B0aW9ucyhzZWxlY3QsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3Qub3B0aW9uc1tpXTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gfnZhbHVlLmluZGV4T2Yob3B0aW9uLl9fdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNlbGVjdF92YWx1ZShzZWxlY3QpIHtcbiAgICBjb25zdCBzZWxlY3RlZF9vcHRpb24gPSBzZWxlY3QucXVlcnlTZWxlY3RvcignOmNoZWNrZWQnKSB8fCBzZWxlY3Qub3B0aW9uc1swXTtcbiAgICByZXR1cm4gc2VsZWN0ZWRfb3B0aW9uICYmIHNlbGVjdGVkX29wdGlvbi5fX3ZhbHVlO1xufVxuZnVuY3Rpb24gc2VsZWN0X211bHRpcGxlX3ZhbHVlKHNlbGVjdCkge1xuICAgIHJldHVybiBbXS5tYXAuY2FsbChzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnOmNoZWNrZWQnKSwgb3B0aW9uID0+IG9wdGlvbi5fX3ZhbHVlKTtcbn1cbi8vIHVuZm9ydHVuYXRlbHkgdGhpcyBjYW4ndCBiZSBhIGNvbnN0YW50IGFzIHRoYXQgd291bGRuJ3QgYmUgdHJlZS1zaGFrZWFibGVcbi8vIHNvIHdlIGNhY2hlIHRoZSByZXN1bHQgaW5zdGVhZFxubGV0IGNyb3Nzb3JpZ2luO1xuZnVuY3Rpb24gaXNfY3Jvc3NvcmlnaW4oKSB7XG4gICAgaWYgKGNyb3Nzb3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3Jvc3NvcmlnaW4gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdm9pZCB3aW5kb3cucGFyZW50LmRvY3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY3Jvc3NvcmlnaW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcm9zc29yaWdpbjtcbn1cbmZ1bmN0aW9uIGFkZF9yZXNpemVfbGlzdGVuZXIobm9kZSwgZm4pIHtcbiAgICBjb25zdCBjb21wdXRlZF9zdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKGNvbXB1dGVkX3N0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgY29uc3QgaWZyYW1lID0gZWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyAnICtcbiAgICAgICAgJ292ZXJmbG93OiBoaWRkZW47IGJvcmRlcjogMDsgb3BhY2l0eTogMDsgcG9pbnRlci1ldmVudHM6IG5vbmU7IHotaW5kZXg6IC0xOycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBpZnJhbWUudGFiSW5kZXggPSAtMTtcbiAgICBjb25zdCBjcm9zc29yaWdpbiA9IGlzX2Nyb3Nzb3JpZ2luKCk7XG4gICAgbGV0IHVuc3Vic2NyaWJlO1xuICAgIGlmIChjcm9zc29yaWdpbikge1xuICAgICAgICBpZnJhbWUuc3JjID0gXCJkYXRhOnRleHQvaHRtbCw8c2NyaXB0Pm9ucmVzaXplPWZ1bmN0aW9uKCl7cGFyZW50LnBvc3RNZXNzYWdlKDAsJyonKX08L3NjcmlwdD5cIjtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSBsaXN0ZW4od2luZG93LCAnbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gaWZyYW1lLmNvbnRlbnRXaW5kb3cpXG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJztcbiAgICAgICAgaWZyYW1lLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gbGlzdGVuKGlmcmFtZS5jb250ZW50V2luZG93LCAncmVzaXplJywgZm4pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcHBlbmQobm9kZSwgaWZyYW1lKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoY3Jvc3NvcmlnaW4pIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5zdWJzY3JpYmUgJiYgaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGV0YWNoKGlmcmFtZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZV9jbGFzcyhlbGVtZW50LCBuYW1lLCB0b2dnbGUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdFt0b2dnbGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbn1cbmZ1bmN0aW9uIGN1c3RvbV9ldmVudCh0eXBlLCBkZXRhaWwsIGJ1YmJsZXMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBidWJibGVzLCBmYWxzZSwgZGV0YWlsKTtcbiAgICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5X3NlbGVjdG9yX2FsbChzZWxlY3RvciwgcGFyZW50ID0gZG9jdW1lbnQuYm9keSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG59XG5jbGFzcyBIdG1sVGFnIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICB9XG4gICAgbShodG1sLCB0YXJnZXQsIGFuY2hvciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmUpIHtcbiAgICAgICAgICAgIHRoaXMuZSA9IGVsZW1lbnQodGFyZ2V0Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMudCA9IHRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuYyhodG1sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmkoYW5jaG9yKTtcbiAgICB9XG4gICAgaChodG1sKSB7XG4gICAgICAgIHRoaXMuZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB0aGlzLm4gPSBBcnJheS5mcm9tKHRoaXMuZS5jaGlsZE5vZGVzKTtcbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydCh0aGlzLnQsIHRoaXMubltpXSwgYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwKGh0bWwpIHtcbiAgICAgICAgdGhpcy5kKCk7XG4gICAgICAgIHRoaXMuaChodG1sKTtcbiAgICAgICAgdGhpcy5pKHRoaXMuYSk7XG4gICAgfVxuICAgIGQoKSB7XG4gICAgICAgIHRoaXMubi5mb3JFYWNoKGRldGFjaCk7XG4gICAgfVxufVxuY2xhc3MgSHRtbFRhZ0h5ZHJhdGlvbiBleHRlbmRzIEh0bWxUYWcge1xuICAgIGNvbnN0cnVjdG9yKGNsYWltZWRfbm9kZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lID0gdGhpcy5uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sID0gY2xhaW1lZF9ub2RlcztcbiAgICB9XG4gICAgYyhodG1sKSB7XG4gICAgICAgIGlmICh0aGlzLmwpIHtcbiAgICAgICAgICAgIHRoaXMubiA9IHRoaXMubDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLmMoaHRtbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaShhbmNob3IpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGluc2VydF9oeWRyYXRpb24odGhpcy50LCB0aGlzLm5baV0sIGFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyaWJ1dGVfdG9fb2JqZWN0KGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJlc3VsdFthdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzKGVsZW1lbnQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHRbbm9kZS5zbG90IHx8ICdkZWZhdWx0J10gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFjdGl2ZV9kb2NzID0gbmV3IFNldCgpO1xubGV0IGFjdGl2ZSA9IDA7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGFya3NreWFwcC9zdHJpbmctaGFzaC9ibG9iL21hc3Rlci9pbmRleC5qc1xuZnVuY3Rpb24gaGFzaChzdHIpIHtcbiAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgbGV0IGkgPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSBeIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBoYXNoID4+PiAwO1xufVxuZnVuY3Rpb24gY3JlYXRlX3J1bGUobm9kZSwgYSwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNlLCBmbiwgdWlkID0gMCkge1xuICAgIGNvbnN0IHN0ZXAgPSAxNi42NjYgLyBkdXJhdGlvbjtcbiAgICBsZXQga2V5ZnJhbWVzID0gJ3tcXG4nO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDw9IDE7IHAgKz0gc3RlcCkge1xuICAgICAgICBjb25zdCB0ID0gYSArIChiIC0gYSkgKiBlYXNlKHApO1xuICAgICAgICBrZXlmcmFtZXMgKz0gcCAqIDEwMCArIGAleyR7Zm4odCwgMSAtIHQpfX1cXG5gO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0ga2V5ZnJhbWVzICsgYDEwMCUgeyR7Zm4oYiwgMSAtIGIpfX1cXG59YDtcbiAgICBjb25zdCBuYW1lID0gYF9fc3ZlbHRlXyR7aGFzaChydWxlKX1fJHt1aWR9YDtcbiAgICBjb25zdCBkb2MgPSBnZXRfcm9vdF9mb3Jfc3R5bGUobm9kZSk7XG4gICAgYWN0aXZlX2RvY3MuYWRkKGRvYyk7XG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IGRvYy5fX3N2ZWx0ZV9zdHlsZXNoZWV0IHx8IChkb2MuX19zdmVsdGVfc3R5bGVzaGVldCA9IGFwcGVuZF9lbXB0eV9zdHlsZXNoZWV0KG5vZGUpLnNoZWV0KTtcbiAgICBjb25zdCBjdXJyZW50X3J1bGVzID0gZG9jLl9fc3ZlbHRlX3J1bGVzIHx8IChkb2MuX19zdmVsdGVfcnVsZXMgPSB7fSk7XG4gICAgaWYgKCFjdXJyZW50X3J1bGVzW25hbWVdKSB7XG4gICAgICAgIGN1cnJlbnRfcnVsZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICBzdHlsZXNoZWV0Lmluc2VydFJ1bGUoYEBrZXlmcmFtZXMgJHtuYW1lfSAke3J1bGV9YCwgc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJztcbiAgICBub2RlLnN0eWxlLmFuaW1hdGlvbiA9IGAke2FuaW1hdGlvbiA/IGAke2FuaW1hdGlvbn0sIGAgOiAnJ30ke25hbWV9ICR7ZHVyYXRpb259bXMgbGluZWFyICR7ZGVsYXl9bXMgMSBib3RoYDtcbiAgICBhY3RpdmUgKz0gMTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZV9ydWxlKG5vZGUsIG5hbWUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IChub2RlLnN0eWxlLmFuaW1hdGlvbiB8fCAnJykuc3BsaXQoJywgJyk7XG4gICAgY29uc3QgbmV4dCA9IHByZXZpb3VzLmZpbHRlcihuYW1lXG4gICAgICAgID8gYW5pbSA9PiBhbmltLmluZGV4T2YobmFtZSkgPCAwIC8vIHJlbW92ZSBzcGVjaWZpYyBhbmltYXRpb25cbiAgICAgICAgOiBhbmltID0+IGFuaW0uaW5kZXhPZignX19zdmVsdGUnKSA9PT0gLTEgLy8gcmVtb3ZlIGFsbCBTdmVsdGUgYW5pbWF0aW9uc1xuICAgICk7XG4gICAgY29uc3QgZGVsZXRlZCA9IHByZXZpb3VzLmxlbmd0aCAtIG5leHQubGVuZ3RoO1xuICAgIGlmIChkZWxldGVkKSB7XG4gICAgICAgIG5vZGUuc3R5bGUuYW5pbWF0aW9uID0gbmV4dC5qb2luKCcsICcpO1xuICAgICAgICBhY3RpdmUgLT0gZGVsZXRlZDtcbiAgICAgICAgaWYgKCFhY3RpdmUpXG4gICAgICAgICAgICBjbGVhcl9ydWxlcygpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsZWFyX3J1bGVzKCkge1xuICAgIHJhZigoKSA9PiB7XG4gICAgICAgIGlmIChhY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGl2ZV9kb2NzLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlc2hlZXQgPSBkb2MuX19zdmVsdGVfc3R5bGVzaGVldDtcbiAgICAgICAgICAgIGxldCBpID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKVxuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpKTtcbiAgICAgICAgICAgIGRvYy5fX3N2ZWx0ZV9ydWxlcyA9IHt9O1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlX2RvY3MuY2xlYXIoKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2FuaW1hdGlvbihub2RlLCBmcm9tLCBmbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFmcm9tKVxuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICBjb25zdCB0byA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKGZyb20ubGVmdCA9PT0gdG8ubGVmdCAmJiBmcm9tLnJpZ2h0ID09PSB0by5yaWdodCAmJiBmcm9tLnRvcCA9PT0gdG8udG9wICYmIGZyb20uYm90dG9tID09PSB0by5ib3R0b20pXG4gICAgICAgIHJldHVybiBub29wO1xuICAgIGNvbnN0IHsgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDMwMCwgZWFzaW5nID0gaWRlbnRpdHksIFxuICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogc2hvdWxkIHRoaXMgYmUgc2VwYXJhdGVkIGZyb20gZGVzdHJ1Y3R1cmluZz8gT3Igc3RhcnQvZW5kIGFkZGVkIHRvIHB1YmxpYyBhcGkgYW5kIGRvY3VtZW50YXRpb24/XG4gICAgc3RhcnQ6IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5LCBcbiAgICAvLyBAdHMtaWdub3JlIHRvZG86XG4gICAgZW5kID0gc3RhcnRfdGltZSArIGR1cmF0aW9uLCB0aWNrID0gbm9vcCwgY3NzIH0gPSBmbihub2RlLCB7IGZyb20sIHRvIH0sIHBhcmFtcyk7XG4gICAgbGV0IHJ1bm5pbmcgPSB0cnVlO1xuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IG5hbWU7XG4gICAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgIG5hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5KSB7XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgbmFtZSk7XG4gICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgbG9vcChub3cgPT4ge1xuICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgbm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydGVkICYmIG5vdyA+PSBlbmQpIHtcbiAgICAgICAgICAgIHRpY2soMSwgMCk7XG4gICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBub3cgLSBzdGFydF90aW1lO1xuICAgICAgICAgICAgY29uc3QgdCA9IDAgKyAxICogZWFzaW5nKHAgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBzdGFydCgpO1xuICAgIHRpY2soMCwgMSk7XG4gICAgcmV0dXJuIHN0b3A7XG59XG5mdW5jdGlvbiBmaXhfcG9zaXRpb24obm9kZSkge1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBpZiAoc3R5bGUucG9zaXRpb24gIT09ICdhYnNvbHV0ZScgJiYgc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZTtcbiAgICAgICAgY29uc3QgYSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBhZGRfdHJhbnNmb3JtKG5vZGUsIGEpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZF90cmFuc2Zvcm0obm9kZSwgYSkge1xuICAgIGNvbnN0IGIgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChhLmxlZnQgIT09IGIubGVmdCB8fCBhLnRvcCAhPT0gYi50b3ApIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogc3R5bGUudHJhbnNmb3JtO1xuICAgICAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RyYW5zZm9ybX0gdHJhbnNsYXRlKCR7YS5sZWZ0IC0gYi5sZWZ0fXB4LCAke2EudG9wIC0gYi50b3B9cHgpYDtcbiAgICB9XG59XG5cbmxldCBjdXJyZW50X2NvbXBvbmVudDtcbmZ1bmN0aW9uIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICBjdXJyZW50X2NvbXBvbmVudCA9IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGdldF9jdXJyZW50X2NvbXBvbmVudCgpIHtcbiAgICBpZiAoIWN1cnJlbnRfY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNhbGxlZCBvdXRzaWRlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbicpO1xuICAgIHJldHVybiBjdXJyZW50X2NvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGJlZm9yZVVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmJlZm9yZV91cGRhdGUucHVzaChmbik7XG59XG5mdW5jdGlvbiBvbk1vdW50KGZuKSB7XG4gICAgZ2V0X2N1cnJlbnRfY29tcG9uZW50KCkuJCQub25fbW91bnQucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZnRlclVwZGF0ZShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmFmdGVyX3VwZGF0ZS5wdXNoKGZuKTtcbn1cbmZ1bmN0aW9uIG9uRGVzdHJveShmbikge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLm9uX2Rlc3Ryb3kucHVzaChmbik7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudERpc3BhdGNoZXIoKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gZ2V0X2N1cnJlbnRfY29tcG9uZW50KCk7XG4gICAgcmV0dXJuICh0eXBlLCBkZXRhaWwpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1t0eXBlXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgICAgLy8gVE9ETyBhcmUgdGhlcmUgc2l0dWF0aW9ucyB3aGVyZSBldmVudHMgY291bGQgYmUgZGlzcGF0Y2hlZFxuICAgICAgICAgICAgLy8gaW4gYSBzZXJ2ZXIgKG5vbi1ET00pIGVudmlyb25tZW50P1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBjdXN0b21fZXZlbnQodHlwZSwgZGV0YWlsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5zbGljZSgpLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoY29tcG9uZW50LCBldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBzZXRDb250ZXh0KGtleSwgY29udGV4dCkge1xuICAgIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQuc2V0KGtleSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmdldChrZXkpO1xufVxuZnVuY3Rpb24gZ2V0QWxsQ29udGV4dHMoKSB7XG4gICAgcmV0dXJuIGdldF9jdXJyZW50X2NvbXBvbmVudCgpLiQkLmNvbnRleHQ7XG59XG5mdW5jdGlvbiBoYXNDb250ZXh0KGtleSkge1xuICAgIHJldHVybiBnZXRfY3VycmVudF9jb21wb25lbnQoKS4kJC5jb250ZXh0LmhhcyhrZXkpO1xufVxuLy8gVE9ETyBmaWd1cmUgb3V0IGlmIHdlIHN0aWxsIHdhbnQgdG8gc3VwcG9ydFxuLy8gc2hvcnRoYW5kIGV2ZW50cywgb3IgaWYgd2Ugd2FudCB0byBpbXBsZW1lbnRcbi8vIGEgcmVhbCBidWJibGluZyBtZWNoYW5pc21cbmZ1bmN0aW9uIGJ1YmJsZShjb21wb25lbnQsIGV2ZW50KSB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gY29tcG9uZW50LiQkLmNhbGxiYWNrc1tldmVudC50eXBlXTtcbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2FsbGJhY2tzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbi5jYWxsKHRoaXMsIGV2ZW50KSk7XG4gICAgfVxufVxuXG5jb25zdCBkaXJ0eV9jb21wb25lbnRzID0gW107XG5jb25zdCBpbnRyb3MgPSB7IGVuYWJsZWQ6IGZhbHNlIH07XG5jb25zdCBiaW5kaW5nX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgcmVuZGVyX2NhbGxiYWNrcyA9IFtdO1xuY29uc3QgZmx1c2hfY2FsbGJhY2tzID0gW107XG5jb25zdCByZXNvbHZlZF9wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gc2NoZWR1bGVfdXBkYXRlKCkge1xuICAgIGlmICghdXBkYXRlX3NjaGVkdWxlZCkge1xuICAgICAgICB1cGRhdGVfc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzb2x2ZWRfcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrKCkge1xuICAgIHNjaGVkdWxlX3VwZGF0ZSgpO1xuICAgIHJldHVybiByZXNvbHZlZF9wcm9taXNlO1xufVxuZnVuY3Rpb24gYWRkX3JlbmRlcl9jYWxsYmFjayhmbikge1xuICAgIHJlbmRlcl9jYWxsYmFja3MucHVzaChmbik7XG59XG5mdW5jdGlvbiBhZGRfZmx1c2hfY2FsbGJhY2soZm4pIHtcbiAgICBmbHVzaF9jYWxsYmFja3MucHVzaChmbik7XG59XG5sZXQgZmx1c2hpbmcgPSBmYWxzZTtcbmNvbnN0IHNlZW5fY2FsbGJhY2tzID0gbmV3IFNldCgpO1xuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgaWYgKGZsdXNoaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gZmlyc3QsIGNhbGwgYmVmb3JlVXBkYXRlIGZ1bmN0aW9uc1xuICAgICAgICAvLyBhbmQgdXBkYXRlIGNvbXBvbmVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJ0eV9jb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBkaXJ0eV9jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoY29tcG9uZW50LiQkKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKGJpbmRpbmdfY2FsbGJhY2tzLmxlbmd0aClcbiAgICAgICAgICAgIGJpbmRpbmdfY2FsbGJhY2tzLnBvcCgpKCk7XG4gICAgICAgIC8vIHRoZW4sIG9uY2UgY29tcG9uZW50cyBhcmUgdXBkYXRlZCwgY2FsbFxuICAgICAgICAvLyBhZnRlclVwZGF0ZSBmdW5jdGlvbnMuIFRoaXMgbWF5IGNhdXNlXG4gICAgICAgIC8vIHN1YnNlcXVlbnQgdXBkYXRlcy4uLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcl9jYWxsYmFja3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVuZGVyX2NhbGxiYWNrc1tpXTtcbiAgICAgICAgICAgIGlmICghc2Vlbl9jYWxsYmFja3MuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIC8vIC4uLnNvIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgbG9vcHNcbiAgICAgICAgICAgICAgICBzZWVuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgIH0gd2hpbGUgKGRpcnR5X2NvbXBvbmVudHMubGVuZ3RoKTtcbiAgICB3aGlsZSAoZmx1c2hfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBmbHVzaF9jYWxsYmFja3MucG9wKCkoKTtcbiAgICB9XG4gICAgdXBkYXRlX3NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgc2Vlbl9jYWxsYmFja3MuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZSgkJCkge1xuICAgIGlmICgkJC5mcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAkJC51cGRhdGUoKTtcbiAgICAgICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAgICAgY29uc3QgZGlydHkgPSAkJC5kaXJ0eTtcbiAgICAgICAgJCQuZGlydHkgPSBbLTFdO1xuICAgICAgICAkJC5mcmFnbWVudCAmJiAkJC5mcmFnbWVudC5wKCQkLmN0eCwgZGlydHkpO1xuICAgICAgICAkJC5hZnRlcl91cGRhdGUuZm9yRWFjaChhZGRfcmVuZGVyX2NhbGxiYWNrKTtcbiAgICB9XG59XG5cbmxldCBwcm9taXNlO1xuZnVuY3Rpb24gd2FpdCgpIHtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKG5vZGUsIGRpcmVjdGlvbiwga2luZCkge1xuICAgIG5vZGUuZGlzcGF0Y2hFdmVudChjdXN0b21fZXZlbnQoYCR7ZGlyZWN0aW9uID8gJ2ludHJvJyA6ICdvdXRybyd9JHtraW5kfWApKTtcbn1cbmNvbnN0IG91dHJvaW5nID0gbmV3IFNldCgpO1xubGV0IG91dHJvcztcbmZ1bmN0aW9uIGdyb3VwX291dHJvcygpIHtcbiAgICBvdXRyb3MgPSB7XG4gICAgICAgIHI6IDAsXG4gICAgICAgIGM6IFtdLFxuICAgICAgICBwOiBvdXRyb3MgLy8gcGFyZW50IGdyb3VwXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrX291dHJvcygpIHtcbiAgICBpZiAoIW91dHJvcy5yKSB7XG4gICAgICAgIHJ1bl9hbGwob3V0cm9zLmMpO1xuICAgIH1cbiAgICBvdXRyb3MgPSBvdXRyb3MucDtcbn1cbmZ1bmN0aW9uIHRyYW5zaXRpb25faW4oYmxvY2ssIGxvY2FsKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLmkpIHtcbiAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgYmxvY2suaShsb2NhbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJhbnNpdGlvbl9vdXQoYmxvY2ssIGxvY2FsLCBkZXRhY2gsIGNhbGxiYWNrKSB7XG4gICAgaWYgKGJsb2NrICYmIGJsb2NrLm8pIHtcbiAgICAgICAgaWYgKG91dHJvaW5nLmhhcyhibG9jaykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIG91dHJvaW5nLmFkZChibG9jayk7XG4gICAgICAgIG91dHJvcy5jLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgb3V0cm9pbmcuZGVsZXRlKGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmQoMSk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrLm8obG9jYWwpO1xuICAgIH1cbn1cbmNvbnN0IG51bGxfdHJhbnNpdGlvbiA9IHsgZHVyYXRpb246IDAgfTtcbmZ1bmN0aW9uIGNyZWF0ZV9pbl90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IGZhbHNlO1xuICAgIGxldCBhbmltYXRpb25fbmFtZTtcbiAgICBsZXQgdGFzaztcbiAgICBsZXQgdWlkID0gMDtcbiAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKCkge1xuICAgICAgICBjb25zdCB7IGRlbGF5ID0gMCwgZHVyYXRpb24gPSAzMDAsIGVhc2luZyA9IGlkZW50aXR5LCB0aWNrID0gbm9vcCwgY3NzIH0gPSBjb25maWcgfHwgbnVsbF90cmFuc2l0aW9uO1xuICAgICAgICBpZiAoY3NzKVxuICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCAwLCAxLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgY3NzLCB1aWQrKyk7XG4gICAgICAgIHRpY2soMCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHRhc2spXG4gICAgICAgICAgICB0YXNrLmFib3J0KCk7XG4gICAgICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIHRydWUsICdzdGFydCcpKTtcbiAgICAgICAgdGFzayA9IGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgIGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBlbmRfdGltZSkge1xuICAgICAgICAgICAgICAgICAgICB0aWNrKDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCB0cnVlLCAnZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBzdGFydF90aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBlYXNpbmcoKG5vdyAtIHN0YXJ0X3RpbWUpIC8gZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVubmluZztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlbGV0ZV9ydWxlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWcoKTtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbihnbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkYXRlKCkge1xuICAgICAgICAgICAgc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlbmQoKSB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlX291dF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMpIHtcbiAgICBsZXQgY29uZmlnID0gZm4obm9kZSwgcGFyYW1zKTtcbiAgICBsZXQgcnVubmluZyA9IHRydWU7XG4gICAgbGV0IGFuaW1hdGlvbl9uYW1lO1xuICAgIGNvbnN0IGdyb3VwID0gb3V0cm9zO1xuICAgIGdyb3VwLnIgKz0gMTtcbiAgICBmdW5jdGlvbiBnbygpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgaWYgKGNzcylcbiAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgMSwgMCwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0X3RpbWUgPSBub3coKSArIGRlbGF5O1xuICAgICAgICBjb25zdCBlbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBkdXJhdGlvbjtcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiBkaXNwYXRjaChub2RlLCBmYWxzZSwgJ3N0YXJ0JykpO1xuICAgICAgICBsb29wKG5vdyA9PiB7XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChub3cgPj0gZW5kX3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGljaygwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgZmFsc2UsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEtLWdyb3VwLnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXN1bHQgaW4gYGVuZCgpYCBiZWluZyBjYWxsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNsZWFuIHVwIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hbGwoZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm93ID49IHN0YXJ0X3RpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVhc2luZygobm93IC0gc3RhcnRfdGltZSkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRpY2soMSAtIHQsIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydW5uaW5nO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgd2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICBnbygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdvKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVuZChyZXNldCkge1xuICAgICAgICAgICAgaWYgKHJlc2V0ICYmIGNvbmZpZy50aWNrKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnRpY2soMSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25fbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlX3J1bGUobm9kZSwgYW5pbWF0aW9uX25hbWUpO1xuICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVfYmlkaXJlY3Rpb25hbF90cmFuc2l0aW9uKG5vZGUsIGZuLCBwYXJhbXMsIGludHJvKSB7XG4gICAgbGV0IGNvbmZpZyA9IGZuKG5vZGUsIHBhcmFtcyk7XG4gICAgbGV0IHQgPSBpbnRybyA/IDAgOiAxO1xuICAgIGxldCBydW5uaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgIGxldCBhbmltYXRpb25fbmFtZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY2xlYXJfYW5pbWF0aW9uKCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uX25hbWUpXG4gICAgICAgICAgICBkZWxldGVfcnVsZShub2RlLCBhbmltYXRpb25fbmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXQocHJvZ3JhbSwgZHVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZCA9IChwcm9ncmFtLmIgLSB0KTtcbiAgICAgICAgZHVyYXRpb24gKj0gTWF0aC5hYnMoZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhOiB0LFxuICAgICAgICAgICAgYjogcHJvZ3JhbS5iLFxuICAgICAgICAgICAgZCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IHByb2dyYW0uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHByb2dyYW0uc3RhcnQgKyBkdXJhdGlvbixcbiAgICAgICAgICAgIGdyb3VwOiBwcm9ncmFtLmdyb3VwXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdvKGIpIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IDAsIGR1cmF0aW9uID0gMzAwLCBlYXNpbmcgPSBpZGVudGl0eSwgdGljayA9IG5vb3AsIGNzcyB9ID0gY29uZmlnIHx8IG51bGxfdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBub3coKSArIGRlbGF5LFxuICAgICAgICAgICAgYlxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWIpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICBwcm9ncmFtLmdyb3VwID0gb3V0cm9zO1xuICAgICAgICAgICAgb3V0cm9zLnIgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSkge1xuICAgICAgICAgICAgcGVuZGluZ19wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW50cm8sIGFuZCB0aGVyZSdzIGEgZGVsYXksIHdlIG5lZWQgdG8gZG9cbiAgICAgICAgICAgIC8vIGFuIGluaXRpYWwgdGljayBhbmQvb3IgYXBwbHkgQ1NTIGFuaW1hdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgaWYgKGNzcykge1xuICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbl9uYW1lID0gY3JlYXRlX3J1bGUobm9kZSwgdCwgYiwgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgICAgICB0aWNrKDAsIDEpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gaW5pdChwcm9ncmFtLCBkdXJhdGlvbik7XG4gICAgICAgICAgICBhZGRfcmVuZGVyX2NhbGxiYWNrKCgpID0+IGRpc3BhdGNoKG5vZGUsIGIsICdzdGFydCcpKTtcbiAgICAgICAgICAgIGxvb3Aobm93ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ19wcm9ncmFtICYmIG5vdyA+IHBlbmRpbmdfcHJvZ3JhbS5zdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBydW5uaW5nX3Byb2dyYW0gPSBpbml0KHBlbmRpbmdfcHJvZ3JhbSwgZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChub2RlLCBydW5uaW5nX3Byb2dyYW0uYiwgJ3N0YXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uX25hbWUgPSBjcmVhdGVfcnVsZShub2RlLCB0LCBydW5uaW5nX3Byb2dyYW0uYiwgcnVubmluZ19wcm9ncmFtLmR1cmF0aW9uLCAwLCBlYXNpbmcsIGNvbmZpZy5jc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyA+PSBydW5uaW5nX3Byb2dyYW0uZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQgPSBydW5uaW5nX3Byb2dyYW0uYiwgMSAtIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gobm9kZSwgcnVubmluZ19wcm9ncmFtLmIsICdlbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZ19wcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nX3Byb2dyYW0uYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRybyBcdTIwMTQgd2UgY2FuIHRpZHkgdXAgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW5pbWF0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRybyBcdTIwMTQgbmVlZHMgdG8gYmUgY29vcmRpbmF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEtLXJ1bm5pbmdfcHJvZ3JhbS5ncm91cC5yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FsbChydW5uaW5nX3Byb2dyYW0uZ3JvdXAuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3cgPj0gcnVubmluZ19wcm9ncmFtLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gbm93IC0gcnVubmluZ19wcm9ncmFtLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHJ1bm5pbmdfcHJvZ3JhbS5hICsgcnVubmluZ19wcm9ncmFtLmQgKiBlYXNpbmcocCAvIHJ1bm5pbmdfcHJvZ3JhbS5kdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrKHQsIDEgLSB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gISEocnVubmluZ19wcm9ncmFtIHx8IHBlbmRpbmdfcHJvZ3JhbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBydW4oYikge1xuICAgICAgICAgICAgaWYgKGlzX2Z1bmN0aW9uKGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB3YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gY29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICAgIGdvKGIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZ28oYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFyX2FuaW1hdGlvbigpO1xuICAgICAgICAgICAgcnVubmluZ19wcm9ncmFtID0gcGVuZGluZ19wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZV9wcm9taXNlKHByb21pc2UsIGluZm8pIHtcbiAgICBjb25zdCB0b2tlbiA9IGluZm8udG9rZW4gPSB7fTtcbiAgICBmdW5jdGlvbiB1cGRhdGUodHlwZSwgaW5kZXgsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGluZm8udG9rZW4gIT09IHRva2VuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbmZvLnJlc29sdmVkID0gdmFsdWU7XG4gICAgICAgIGxldCBjaGlsZF9jdHggPSBpbmZvLmN0eDtcbiAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjaGlsZF9jdHggPSBjaGlsZF9jdHguc2xpY2UoKTtcbiAgICAgICAgICAgIGNoaWxkX2N0eFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvY2sgPSB0eXBlICYmIChpbmZvLmN1cnJlbnQgPSB0eXBlKShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgbmVlZHNfZmx1c2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKGluZm8uYmxvY2spIHtcbiAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2tzLmZvckVhY2goKGJsb2NrLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSBpbmRleCAmJiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX291dChibG9jaywgMSwgMSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmJsb2Nrc1tpXSA9PT0gYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5ibG9ja3NbaV0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3V0cm9zKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8uYmxvY2suZCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLmMoKTtcbiAgICAgICAgICAgIHRyYW5zaXRpb25faW4oYmxvY2ssIDEpO1xuICAgICAgICAgICAgYmxvY2subShpbmZvLm1vdW50KCksIGluZm8uYW5jaG9yKTtcbiAgICAgICAgICAgIG5lZWRzX2ZsdXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmZvLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIGlmIChpbmZvLmJsb2NrcylcbiAgICAgICAgICAgIGluZm8uYmxvY2tzW2luZGV4XSA9IGJsb2NrO1xuICAgICAgICBpZiAobmVlZHNfZmx1c2gpIHtcbiAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzX3Byb21pc2UocHJvbWlzZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudF9jb21wb25lbnQgPSBnZXRfY3VycmVudF9jb21wb25lbnQoKTtcbiAgICAgICAgcHJvbWlzZS50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby50aGVuLCAxLCBpbmZvLnZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICBzZXRfY3VycmVudF9jb21wb25lbnQobnVsbCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjdXJyZW50X2NvbXBvbmVudCk7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5jYXRjaCwgMiwgaW5mby5lcnJvciwgZXJyb3IpO1xuICAgICAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KG51bGwpO1xuICAgICAgICAgICAgaWYgKCFpbmZvLmhhc0NhdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiB3ZSBwcmV2aW91c2x5IGhhZCBhIHRoZW4vY2F0Y2ggYmxvY2ssIGRlc3Ryb3kgaXRcbiAgICAgICAgaWYgKGluZm8uY3VycmVudCAhPT0gaW5mby5wZW5kaW5nKSB7XG4gICAgICAgICAgICB1cGRhdGUoaW5mby5wZW5kaW5nLCAwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaW5mby5jdXJyZW50ICE9PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZShpbmZvLnRoZW4sIDEsIGluZm8udmFsdWUsIHByb21pc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5yZXNvbHZlZCA9IHByb21pc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gdXBkYXRlX2F3YWl0X2Jsb2NrX2JyYW5jaChpbmZvLCBjdHgsIGRpcnR5KSB7XG4gICAgY29uc3QgY2hpbGRfY3R4ID0gY3R4LnNsaWNlKCk7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gaW5mbztcbiAgICBpZiAoaW5mby5jdXJyZW50ID09PSBpbmZvLnRoZW4pIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8udmFsdWVdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGlmIChpbmZvLmN1cnJlbnQgPT09IGluZm8uY2F0Y2gpIHtcbiAgICAgICAgY2hpbGRfY3R4W2luZm8uZXJyb3JdID0gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIGluZm8uYmxvY2sucChjaGlsZF9jdHgsIGRpcnR5KTtcbn1cblxuY29uc3QgZ2xvYmFscyA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gd2luZG93XG4gICAgOiB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBnbG9iYWxUaGlzXG4gICAgICAgIDogZ2xvYmFsKTtcblxuZnVuY3Rpb24gZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgYmxvY2suZCgxKTtcbiAgICBsb29rdXAuZGVsZXRlKGJsb2NrLmtleSk7XG59XG5mdW5jdGlvbiBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKSB7XG4gICAgdHJhbnNpdGlvbl9vdXQoYmxvY2ssIDEsIDEsICgpID0+IHtcbiAgICAgICAgbG9va3VwLmRlbGV0ZShibG9jay5rZXkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZml4X2FuZF9kZXN0cm95X2Jsb2NrKGJsb2NrLCBsb29rdXApIHtcbiAgICBibG9jay5mKCk7XG4gICAgZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIGZpeF9hbmRfb3V0cm9fYW5kX2Rlc3Ryb3lfYmxvY2soYmxvY2ssIGxvb2t1cCkge1xuICAgIGJsb2NrLmYoKTtcbiAgICBvdXRyb19hbmRfZGVzdHJveV9ibG9jayhibG9jaywgbG9va3VwKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZV9rZXllZF9lYWNoKG9sZF9ibG9ja3MsIGRpcnR5LCBnZXRfa2V5LCBkeW5hbWljLCBjdHgsIGxpc3QsIGxvb2t1cCwgbm9kZSwgZGVzdHJveSwgY3JlYXRlX2VhY2hfYmxvY2ssIG5leHQsIGdldF9jb250ZXh0KSB7XG4gICAgbGV0IG8gPSBvbGRfYmxvY2tzLmxlbmd0aDtcbiAgICBsZXQgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpID0gbztcbiAgICBjb25zdCBvbGRfaW5kZXhlcyA9IHt9O1xuICAgIHdoaWxlIChpLS0pXG4gICAgICAgIG9sZF9pbmRleGVzW29sZF9ibG9ja3NbaV0ua2V5XSA9IGk7XG4gICAgY29uc3QgbmV3X2Jsb2NrcyA9IFtdO1xuICAgIGNvbnN0IG5ld19sb29rdXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVsdGFzID0gbmV3IE1hcCgpO1xuICAgIGkgPSBuO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgY29uc3QgY2hpbGRfY3R4ID0gZ2V0X2NvbnRleHQoY3R4LCBsaXN0LCBpKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShjaGlsZF9jdHgpO1xuICAgICAgICBsZXQgYmxvY2sgPSBsb29rdXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gY3JlYXRlX2VhY2hfYmxvY2soa2V5LCBjaGlsZF9jdHgpO1xuICAgICAgICAgICAgYmxvY2suYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIGJsb2NrLnAoY2hpbGRfY3R4LCBkaXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3X2xvb2t1cC5zZXQoa2V5LCBuZXdfYmxvY2tzW2ldID0gYmxvY2spO1xuICAgICAgICBpZiAoa2V5IGluIG9sZF9pbmRleGVzKVxuICAgICAgICAgICAgZGVsdGFzLnNldChrZXksIE1hdGguYWJzKGkgLSBvbGRfaW5kZXhlc1trZXldKSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBkaWRfbW92ZSA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBpbnNlcnQoYmxvY2spIHtcbiAgICAgICAgdHJhbnNpdGlvbl9pbihibG9jaywgMSk7XG4gICAgICAgIGJsb2NrLm0obm9kZSwgbmV4dCk7XG4gICAgICAgIGxvb2t1cC5zZXQoYmxvY2sua2V5LCBibG9jayk7XG4gICAgICAgIG5leHQgPSBibG9jay5maXJzdDtcbiAgICAgICAgbi0tO1xuICAgIH1cbiAgICB3aGlsZSAobyAmJiBuKSB7XG4gICAgICAgIGNvbnN0IG5ld19ibG9jayA9IG5ld19ibG9ja3NbbiAtIDFdO1xuICAgICAgICBjb25zdCBvbGRfYmxvY2sgPSBvbGRfYmxvY2tzW28gLSAxXTtcbiAgICAgICAgY29uc3QgbmV3X2tleSA9IG5ld19ibG9jay5rZXk7XG4gICAgICAgIGNvbnN0IG9sZF9rZXkgPSBvbGRfYmxvY2sua2V5O1xuICAgICAgICBpZiAobmV3X2Jsb2NrID09PSBvbGRfYmxvY2spIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgIG5leHQgPSBuZXdfYmxvY2suZmlyc3Q7XG4gICAgICAgICAgICBvLS07XG4gICAgICAgICAgICBuLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIW5ld19sb29rdXAuaGFzKG9sZF9rZXkpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgb2xkIGJsb2NrXG4gICAgICAgICAgICBkZXN0cm95KG9sZF9ibG9jaywgbG9va3VwKTtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbG9va3VwLmhhcyhuZXdfa2V5KSB8fCB3aWxsX21vdmUuaGFzKG5ld19rZXkpKSB7XG4gICAgICAgICAgICBpbnNlcnQobmV3X2Jsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaWRfbW92ZS5oYXMob2xkX2tleSkpIHtcbiAgICAgICAgICAgIG8tLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWx0YXMuZ2V0KG5ld19rZXkpID4gZGVsdGFzLmdldChvbGRfa2V5KSkge1xuICAgICAgICAgICAgZGlkX21vdmUuYWRkKG5ld19rZXkpO1xuICAgICAgICAgICAgaW5zZXJ0KG5ld19ibG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWxsX21vdmUuYWRkKG9sZF9rZXkpO1xuICAgICAgICAgICAgby0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChvLS0pIHtcbiAgICAgICAgY29uc3Qgb2xkX2Jsb2NrID0gb2xkX2Jsb2Nrc1tvXTtcbiAgICAgICAgaWYgKCFuZXdfbG9va3VwLmhhcyhvbGRfYmxvY2sua2V5KSlcbiAgICAgICAgICAgIGRlc3Ryb3kob2xkX2Jsb2NrLCBsb29rdXApO1xuICAgIH1cbiAgICB3aGlsZSAobilcbiAgICAgICAgaW5zZXJ0KG5ld19ibG9ja3NbbiAtIDFdKTtcbiAgICByZXR1cm4gbmV3X2Jsb2Nrcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX2VhY2hfa2V5cyhjdHgsIGxpc3QsIGdldF9jb250ZXh0LCBnZXRfa2V5KSB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0X2tleShnZXRfY29udGV4dChjdHgsIGxpc3QsIGkpKTtcbiAgICAgICAgaWYgKGtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgZHVwbGljYXRlIGtleXMgaW4gYSBrZXllZCBlYWNoJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldF9zcHJlYWRfdXBkYXRlKGxldmVscywgdXBkYXRlcykge1xuICAgIGNvbnN0IHVwZGF0ZSA9IHt9O1xuICAgIGNvbnN0IHRvX251bGxfb3V0ID0ge307XG4gICAgY29uc3QgYWNjb3VudGVkX2ZvciA9IHsgJCRzY29wZTogMSB9O1xuICAgIGxldCBpID0gbGV2ZWxzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIGNvbnN0IG8gPSBsZXZlbHNbaV07XG4gICAgICAgIGNvbnN0IG4gPSB1cGRhdGVzW2ldO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbykge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBuKSlcbiAgICAgICAgICAgICAgICAgICAgdG9fbnVsbF9vdXRba2V5XSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50ZWRfZm9yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlW2tleV0gPSBuW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRlZF9mb3Jba2V5XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxzW2ldID0gbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG8pIHtcbiAgICAgICAgICAgICAgICBhY2NvdW50ZWRfZm9yW2tleV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRvX251bGxfb3V0KSB7XG4gICAgICAgIGlmICghKGtleSBpbiB1cGRhdGUpKVxuICAgICAgICAgICAgdXBkYXRlW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBnZXRfc3ByZWFkX29iamVjdChzcHJlYWRfcHJvcHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNwcmVhZF9wcm9wcyA9PT0gJ29iamVjdCcgJiYgc3ByZWFkX3Byb3BzICE9PSBudWxsID8gc3ByZWFkX3Byb3BzIDoge307XG59XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sXG5jb25zdCBib29sZWFuX2F0dHJpYnV0ZXMgPSBuZXcgU2V0KFtcbiAgICAnYWxsb3dmdWxsc2NyZWVuJyxcbiAgICAnYWxsb3dwYXltZW50cmVxdWVzdCcsXG4gICAgJ2FzeW5jJyxcbiAgICAnYXV0b2ZvY3VzJyxcbiAgICAnYXV0b3BsYXknLFxuICAgICdjaGVja2VkJyxcbiAgICAnY29udHJvbHMnLFxuICAgICdkZWZhdWx0JyxcbiAgICAnZGVmZXInLFxuICAgICdkaXNhYmxlZCcsXG4gICAgJ2Zvcm1ub3ZhbGlkYXRlJyxcbiAgICAnaGlkZGVuJyxcbiAgICAnaXNtYXAnLFxuICAgICdsb29wJyxcbiAgICAnbXVsdGlwbGUnLFxuICAgICdtdXRlZCcsXG4gICAgJ25vbW9kdWxlJyxcbiAgICAnbm92YWxpZGF0ZScsXG4gICAgJ29wZW4nLFxuICAgICdwbGF5c2lubGluZScsXG4gICAgJ3JlYWRvbmx5JyxcbiAgICAncmVxdWlyZWQnLFxuICAgICdyZXZlcnNlZCcsXG4gICAgJ3NlbGVjdGVkJ1xuXSk7XG5cbmNvbnN0IGludmFsaWRfYXR0cmlidXRlX25hbWVfY2hhcmFjdGVyID0gL1tcXHMnXCI+Lz1cXHV7RkREMH0tXFx1e0ZERUZ9XFx1e0ZGRkV9XFx1e0ZGRkZ9XFx1ezFGRkZFfVxcdXsxRkZGRn1cXHV7MkZGRkV9XFx1ezJGRkZGfVxcdXszRkZGRX1cXHV7M0ZGRkZ9XFx1ezRGRkZFfVxcdXs0RkZGRn1cXHV7NUZGRkV9XFx1ezVGRkZGfVxcdXs2RkZGRX1cXHV7NkZGRkZ9XFx1ezdGRkZFfVxcdXs3RkZGRn1cXHV7OEZGRkV9XFx1ezhGRkZGfVxcdXs5RkZGRX1cXHV7OUZGRkZ9XFx1e0FGRkZFfVxcdXtBRkZGRn1cXHV7QkZGRkV9XFx1e0JGRkZGfVxcdXtDRkZGRX1cXHV7Q0ZGRkZ9XFx1e0RGRkZFfVxcdXtERkZGRn1cXHV7RUZGRkV9XFx1e0VGRkZGfVxcdXtGRkZGRX1cXHV7RkZGRkZ9XFx1ezEwRkZGRX1cXHV7MTBGRkZGfV0vdTtcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI25vbmNoYXJhY3RlclxuZnVuY3Rpb24gc3ByZWFkKGFyZ3MsIGNsYXNzZXNfdG9fYWRkKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpO1xuICAgIGlmIChjbGFzc2VzX3RvX2FkZCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlcy5jbGFzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3Nlc190b19hZGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzICs9ICcgJyArIGNsYXNzZXNfdG9fYWRkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdHIgPSAnJztcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIudGVzdChuYW1lKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpXG4gICAgICAgICAgICBzdHIgKz0gJyAnICsgbmFtZTtcbiAgICAgICAgZWxzZSBpZiAoYm9vbGVhbl9hdHRyaWJ1dGVzLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IGAgJHtuYW1lfT1cIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn1cbmNvbnN0IGVzY2FwZWQgPSB7XG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OycsXG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKGh0bWwpIHtcbiAgICByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoL1tcIicmPD5dL2csIG1hdGNoID0+IGVzY2FwZWRbbWF0Y2hdKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9hdHRyaWJ1dGVfdmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IGVzY2FwZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGVzY2FwZV9vYmplY3Qob2JqKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZShvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBlYWNoKGl0ZW1zLCBmbikge1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHN0ciArPSBmbihpdGVtc1tpXSwgaSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5jb25zdCBtaXNzaW5nX2NvbXBvbmVudCA9IHtcbiAgICAkJHJlbmRlcjogKCkgPT4gJydcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZV9jb21wb25lbnQoY29tcG9uZW50LCBuYW1lKSB7XG4gICAgaWYgKCFjb21wb25lbnQgfHwgIWNvbXBvbmVudC4kJHJlbmRlcikge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3N2ZWx0ZTpjb21wb25lbnQnKVxuICAgICAgICAgICAgbmFtZSArPSAnIHRoaXM9ey4uLn0nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYDwke25hbWV9PiBpcyBub3QgYSB2YWxpZCBTU1IgY29tcG9uZW50LiBZb3UgbWF5IG5lZWQgdG8gcmV2aWV3IHlvdXIgYnVpbGQgY29uZmlnIHRvIGVuc3VyZSB0aGF0IGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQsIHJhdGhlciB0aGFuIGltcG9ydGVkIGFzIHByZS1jb21waWxlZCBtb2R1bGVzYCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5mdW5jdGlvbiBkZWJ1ZyhmaWxlLCBsaW5lLCBjb2x1bW4sIHZhbHVlcykge1xuICAgIGNvbnNvbGUubG9nKGB7QGRlYnVnfSAke2ZpbGUgPyBmaWxlICsgJyAnIDogJyd9KCR7bGluZX06JHtjb2x1bW59KWApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyh2YWx1ZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICByZXR1cm4gJyc7XG59XG5sZXQgb25fZGVzdHJveTtcbmZ1bmN0aW9uIGNyZWF0ZV9zc3JfY29tcG9uZW50KGZuKSB7XG4gICAgZnVuY3Rpb24gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHBhcmVudF9jb21wb25lbnQgPSBjdXJyZW50X2NvbXBvbmVudDtcbiAgICAgICAgY29uc3QgJCQgPSB7XG4gICAgICAgICAgICBvbl9kZXN0cm95LFxuICAgICAgICAgICAgY29udGV4dDogbmV3IE1hcChjb250ZXh0IHx8IChwYXJlbnRfY29tcG9uZW50ID8gcGFyZW50X2NvbXBvbmVudC4kJC5jb250ZXh0IDogW10pKSxcbiAgICAgICAgICAgIC8vIHRoZXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzY2FyZGVkXG4gICAgICAgICAgICBvbl9tb3VudDogW10sXG4gICAgICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgICAgIGFmdGVyX3VwZGF0ZTogW10sXG4gICAgICAgICAgICBjYWxsYmFja3M6IGJsYW5rX29iamVjdCgpXG4gICAgICAgIH07XG4gICAgICAgIHNldF9jdXJyZW50X2NvbXBvbmVudCh7ICQkIH0pO1xuICAgICAgICBjb25zdCBodG1sID0gZm4ocmVzdWx0LCBwcm9wcywgYmluZGluZ3MsIHNsb3RzKTtcbiAgICAgICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVuZGVyOiAocHJvcHMgPSB7fSwgeyAkJHNsb3RzID0ge30sIGNvbnRleHQgPSBuZXcgTWFwKCkgfSA9IHt9KSA9PiB7XG4gICAgICAgICAgICBvbl9kZXN0cm95ID0gW107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHRpdGxlOiAnJywgaGVhZDogJycsIGNzczogbmV3IFNldCgpIH07XG4gICAgICAgICAgICBjb25zdCBodG1sID0gJCRyZW5kZXIocmVzdWx0LCBwcm9wcywge30sICQkc2xvdHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgcnVuX2FsbChvbl9kZXN0cm95KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgICAgICBjc3M6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogQXJyYXkuZnJvbShyZXN1bHQuY3NzKS5tYXAoY3NzID0+IGNzcy5jb2RlKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsIC8vIFRPRE9cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhlYWQ6IHJlc3VsdC50aXRsZSArIHJlc3VsdC5oZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAkJHJlbmRlclxuICAgIH07XG59XG5mdW5jdGlvbiBhZGRfYXR0cmlidXRlKG5hbWUsIHZhbHVlLCBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgKGJvb2xlYW4gJiYgIXZhbHVlKSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHJldHVybiBgICR7bmFtZX0ke3ZhbHVlID09PSB0cnVlID8gJycgOiBgPSR7dHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KGVzY2FwZSh2YWx1ZSkpIDogYFwiJHt2YWx1ZX1cImB9YH1gO1xufVxuZnVuY3Rpb24gYWRkX2NsYXNzZXMoY2xhc3Nlcykge1xuICAgIHJldHVybiBjbGFzc2VzID8gYCBjbGFzcz1cIiR7Y2xhc3Nlc31cImAgOiAnJztcbn1cblxuZnVuY3Rpb24gYmluZChjb21wb25lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnQuJCQucHJvcHNbbmFtZV07XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29tcG9uZW50LiQkLmJvdW5kW2luZGV4XSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayhjb21wb25lbnQuJCQuY3R4W2luZGV4XSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlX2NvbXBvbmVudChibG9jaykge1xuICAgIGJsb2NrICYmIGJsb2NrLmMoKTtcbn1cbmZ1bmN0aW9uIGNsYWltX2NvbXBvbmVudChibG9jaywgcGFyZW50X25vZGVzKSB7XG4gICAgYmxvY2sgJiYgYmxvY2subChwYXJlbnRfbm9kZXMpO1xufVxuZnVuY3Rpb24gbW91bnRfY29tcG9uZW50KGNvbXBvbmVudCwgdGFyZ2V0LCBhbmNob3IsIGN1c3RvbUVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGZyYWdtZW50LCBvbl9tb3VudCwgb25fZGVzdHJveSwgYWZ0ZXJfdXBkYXRlIH0gPSBjb21wb25lbnQuJCQ7XG4gICAgZnJhZ21lbnQgJiYgZnJhZ21lbnQubSh0YXJnZXQsIGFuY2hvcik7XG4gICAgaWYgKCFjdXN0b21FbGVtZW50KSB7XG4gICAgICAgIC8vIG9uTW91bnQgaGFwcGVucyBiZWZvcmUgdGhlIGluaXRpYWwgYWZ0ZXJVcGRhdGVcbiAgICAgICAgYWRkX3JlbmRlcl9jYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdfb25fZGVzdHJveSA9IG9uX21vdW50Lm1hcChydW4pLmZpbHRlcihpc19mdW5jdGlvbik7XG4gICAgICAgICAgICBpZiAob25fZGVzdHJveSkge1xuICAgICAgICAgICAgICAgIG9uX2Rlc3Ryb3kucHVzaCguLi5uZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBFZGdlIGNhc2UgLSBjb21wb25lbnQgd2FzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSxcbiAgICAgICAgICAgICAgICAvLyBtb3N0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBhIGJpbmRpbmcgaW5pdGlhbGlzaW5nXG4gICAgICAgICAgICAgICAgcnVuX2FsbChuZXdfb25fZGVzdHJveSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb25lbnQuJCQub25fbW91bnQgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFmdGVyX3VwZGF0ZS5mb3JFYWNoKGFkZF9yZW5kZXJfY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGVzdHJveV9jb21wb25lbnQoY29tcG9uZW50LCBkZXRhY2hpbmcpIHtcbiAgICBjb25zdCAkJCA9IGNvbXBvbmVudC4kJDtcbiAgICBpZiAoJCQuZnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgcnVuX2FsbCgkJC5vbl9kZXN0cm95KTtcbiAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuZChkZXRhY2hpbmcpO1xuICAgICAgICAvLyBUT0RPIG51bGwgb3V0IG90aGVyIHJlZnMsIGluY2x1ZGluZyBjb21wb25lbnQuJCQgKGJ1dCBuZWVkIHRvXG4gICAgICAgIC8vIHByZXNlcnZlIGZpbmFsIHN0YXRlPylcbiAgICAgICAgJCQub25fZGVzdHJveSA9ICQkLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgJCQuY3R4ID0gW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpIHtcbiAgICBpZiAoY29tcG9uZW50LiQkLmRpcnR5WzBdID09PSAtMSkge1xuICAgICAgICBkaXJ0eV9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgICAgc2NoZWR1bGVfdXBkYXRlKCk7XG4gICAgICAgIGNvbXBvbmVudC4kJC5kaXJ0eS5maWxsKDApO1xuICAgIH1cbiAgICBjb21wb25lbnQuJCQuZGlydHlbKGkgLyAzMSkgfCAwXSB8PSAoMSA8PCAoaSAlIDMxKSk7XG59XG5mdW5jdGlvbiBpbml0KGNvbXBvbmVudCwgb3B0aW9ucywgaW5zdGFuY2UsIGNyZWF0ZV9mcmFnbWVudCwgbm90X2VxdWFsLCBwcm9wcywgYXBwZW5kX3N0eWxlcywgZGlydHkgPSBbLTFdKSB7XG4gICAgY29uc3QgcGFyZW50X2NvbXBvbmVudCA9IGN1cnJlbnRfY29tcG9uZW50O1xuICAgIHNldF9jdXJyZW50X2NvbXBvbmVudChjb21wb25lbnQpO1xuICAgIGNvbnN0ICQkID0gY29tcG9uZW50LiQkID0ge1xuICAgICAgICBmcmFnbWVudDogbnVsbCxcbiAgICAgICAgY3R4OiBudWxsLFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICBwcm9wcyxcbiAgICAgICAgdXBkYXRlOiBub29wLFxuICAgICAgICBub3RfZXF1YWwsXG4gICAgICAgIGJvdW5kOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgLy8gbGlmZWN5Y2xlXG4gICAgICAgIG9uX21vdW50OiBbXSxcbiAgICAgICAgb25fZGVzdHJveTogW10sXG4gICAgICAgIG9uX2Rpc2Nvbm5lY3Q6IFtdLFxuICAgICAgICBiZWZvcmVfdXBkYXRlOiBbXSxcbiAgICAgICAgYWZ0ZXJfdXBkYXRlOiBbXSxcbiAgICAgICAgY29udGV4dDogbmV3IE1hcChvcHRpb25zLmNvbnRleHQgfHwgKHBhcmVudF9jb21wb25lbnQgPyBwYXJlbnRfY29tcG9uZW50LiQkLmNvbnRleHQgOiBbXSkpLFxuICAgICAgICAvLyBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgY2FsbGJhY2tzOiBibGFua19vYmplY3QoKSxcbiAgICAgICAgZGlydHksXG4gICAgICAgIHNraXBfYm91bmQ6IGZhbHNlLFxuICAgICAgICByb290OiBvcHRpb25zLnRhcmdldCB8fCBwYXJlbnRfY29tcG9uZW50LiQkLnJvb3RcbiAgICB9O1xuICAgIGFwcGVuZF9zdHlsZXMgJiYgYXBwZW5kX3N0eWxlcygkJC5yb290KTtcbiAgICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgICAkJC5jdHggPSBpbnN0YW5jZVxuICAgICAgICA/IGluc3RhbmNlKGNvbXBvbmVudCwgb3B0aW9ucy5wcm9wcyB8fCB7fSwgKGksIHJldCwgLi4ucmVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZXN0Lmxlbmd0aCA/IHJlc3RbMF0gOiByZXQ7XG4gICAgICAgICAgICBpZiAoJCQuY3R4ICYmIG5vdF9lcXVhbCgkJC5jdHhbaV0sICQkLmN0eFtpXSA9IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghJCQuc2tpcF9ib3VuZCAmJiAkJC5ib3VuZFtpXSlcbiAgICAgICAgICAgICAgICAgICAgJCQuYm91bmRbaV0odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgbWFrZV9kaXJ0eShjb21wb25lbnQsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICAkJC51cGRhdGUoKTtcbiAgICByZWFkeSA9IHRydWU7XG4gICAgcnVuX2FsbCgkJC5iZWZvcmVfdXBkYXRlKTtcbiAgICAvLyBgZmFsc2VgIGFzIGEgc3BlY2lhbCBjYXNlIG9mIG5vIERPTSBjb21wb25lbnRcbiAgICAkJC5mcmFnbWVudCA9IGNyZWF0ZV9mcmFnbWVudCA/IGNyZWF0ZV9mcmFnbWVudCgkJC5jdHgpIDogZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIHN0YXJ0X2h5ZHJhdGluZygpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZHJlbihvcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQubChub2Rlcyk7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGRldGFjaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgJCQuZnJhZ21lbnQgJiYgJCQuZnJhZ21lbnQuYygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmludHJvKVxuICAgICAgICAgICAgdHJhbnNpdGlvbl9pbihjb21wb25lbnQuJCQuZnJhZ21lbnQpO1xuICAgICAgICBtb3VudF9jb21wb25lbnQoY29tcG9uZW50LCBvcHRpb25zLnRhcmdldCwgb3B0aW9ucy5hbmNob3IsIG9wdGlvbnMuY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIGVuZF9oeWRyYXRpbmcoKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICB9XG4gICAgc2V0X2N1cnJlbnRfY29tcG9uZW50KHBhcmVudF9jb21wb25lbnQpO1xufVxubGV0IFN2ZWx0ZUVsZW1lbnQ7XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgU3ZlbHRlRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgb25fbW91bnQgfSA9IHRoaXMuJCQ7XG4gICAgICAgICAgICB0aGlzLiQkLm9uX2Rpc2Nvbm5lY3QgPSBvbl9tb3VudC5tYXAocnVuKS5maWx0ZXIoaXNfZnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0b2RvOiBpbXByb3ZlIHR5cGluZ3NcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuJCQuc2xvdHRlZCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG9kbzogaW1wcm92ZSB0eXBpbmdzXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLiQkLnNsb3R0ZWRba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGF0dHIsIF9vbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXNbYXR0cl0gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIHJ1bl9hbGwodGhpcy4kJC5vbl9kaXNjb25uZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAkZGVzdHJveSgpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICAgICAgdGhpcy4kZGVzdHJveSA9IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB0aGlzIGRlbGVnYXRlIHRvIGFkZEV2ZW50TGlzdGVuZXI/XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFja3MgPSAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gfHwgKHRoaXMuJCQuY2FsbGJhY2tzW3R5cGVdID0gW10pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuJCRzZXQgJiYgIWlzX2VtcHR5KCQkcHJvcHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgU3ZlbHRlIGNvbXBvbmVudHMuIFVzZWQgd2hlbiBkZXY9ZmFsc2UuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgJGRlc3Ryb3koKSB7XG4gICAgICAgIGRlc3Ryb3lfY29tcG9uZW50KHRoaXMsIDEpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gbm9vcDtcbiAgICB9XG4gICAgJG9uKHR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9ICh0aGlzLiQkLmNhbGxiYWNrc1t0eXBlXSB8fCAodGhpcy4kJC5jYWxsYmFja3NbdHlwZV0gPSBbXSkpO1xuICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgICRzZXQoJCRwcm9wcykge1xuICAgICAgICBpZiAodGhpcy4kJHNldCAmJiAhaXNfZW1wdHkoJCRwcm9wcykpIHtcbiAgICAgICAgICAgIHRoaXMuJCQuc2tpcF9ib3VuZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiQkc2V0KCQkcHJvcHMpO1xuICAgICAgICAgICAgdGhpcy4kJC5za2lwX2JvdW5kID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoX2Rldih0eXBlLCBkZXRhaWwpIHtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbV9ldmVudCh0eXBlLCBPYmplY3QuYXNzaWduKHsgdmVyc2lvbjogJzMuNDMuMCcgfSwgZGV0YWlsKSwgdHJ1ZSkpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2Rldih0YXJnZXQsIG5vZGUpIHtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTUluc2VydCcsIHsgdGFyZ2V0LCBub2RlIH0pO1xuICAgIGFwcGVuZCh0YXJnZXQsIG5vZGUpO1xufVxuZnVuY3Rpb24gYXBwZW5kX2h5ZHJhdGlvbl9kZXYodGFyZ2V0LCBub2RlKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSB9KTtcbiAgICBhcHBlbmRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSk7XG59XG5mdW5jdGlvbiBpbnNlcnRfZGV2KHRhcmdldCwgbm9kZSwgYW5jaG9yKSB7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01JbnNlcnQnLCB7IHRhcmdldCwgbm9kZSwgYW5jaG9yIH0pO1xuICAgIGluc2VydCh0YXJnZXQsIG5vZGUsIGFuY2hvcik7XG59XG5mdW5jdGlvbiBpbnNlcnRfaHlkcmF0aW9uX2Rldih0YXJnZXQsIG5vZGUsIGFuY2hvcikge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NSW5zZXJ0JywgeyB0YXJnZXQsIG5vZGUsIGFuY2hvciB9KTtcbiAgICBpbnNlcnRfaHlkcmF0aW9uKHRhcmdldCwgbm9kZSwgYW5jaG9yKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9kZXYobm9kZSkge1xuICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlJywgeyBub2RlIH0pO1xuICAgIGRldGFjaChub2RlKTtcbn1cbmZ1bmN0aW9uIGRldGFjaF9iZXR3ZWVuX2RldihiZWZvcmUsIGFmdGVyKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZyAmJiBiZWZvcmUubmV4dFNpYmxpbmcgIT09IGFmdGVyKSB7XG4gICAgICAgIGRldGFjaF9kZXYoYmVmb3JlLm5leHRTaWJsaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hfYmVmb3JlX2RldihhZnRlcikge1xuICAgIHdoaWxlIChhZnRlci5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgZGV0YWNoX2RldihhZnRlci5wcmV2aW91c1NpYmxpbmcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGFjaF9hZnRlcl9kZXYoYmVmb3JlKSB7XG4gICAgd2hpbGUgKGJlZm9yZS5uZXh0U2libGluZykge1xuICAgICAgICBkZXRhY2hfZGV2KGJlZm9yZS5uZXh0U2libGluZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuX2Rldihub2RlLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucywgaGFzX3ByZXZlbnRfZGVmYXVsdCwgaGFzX3N0b3BfcHJvcGFnYXRpb24pIHtcbiAgICBjb25zdCBtb2RpZmllcnMgPSBvcHRpb25zID09PSB0cnVlID8gWydjYXB0dXJlJ10gOiBvcHRpb25zID8gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhvcHRpb25zKSkgOiBbXTtcbiAgICBpZiAoaGFzX3ByZXZlbnRfZGVmYXVsdClcbiAgICAgICAgbW9kaWZpZXJzLnB1c2goJ3ByZXZlbnREZWZhdWx0Jyk7XG4gICAgaWYgKGhhc19zdG9wX3Byb3BhZ2F0aW9uKVxuICAgICAgICBtb2RpZmllcnMucHVzaCgnc3RvcFByb3BhZ2F0aW9uJyk7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01BZGRFdmVudExpc3RlbmVyJywgeyBub2RlLCBldmVudCwgaGFuZGxlciwgbW9kaWZpZXJzIH0pO1xuICAgIGNvbnN0IGRpc3Bvc2UgPSBsaXN0ZW4obm9kZSwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NUmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHsgbm9kZSwgZXZlbnQsIGhhbmRsZXIsIG1vZGlmaWVycyB9KTtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBhdHRyX2Rldihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgYXR0cihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01SZW1vdmVBdHRyaWJ1dGUnLCB7IG5vZGUsIGF0dHJpYnV0ZSB9KTtcbiAgICBlbHNlXG4gICAgICAgIGRpc3BhdGNoX2RldignU3ZlbHRlRE9NU2V0QXR0cmlidXRlJywgeyBub2RlLCBhdHRyaWJ1dGUsIHZhbHVlIH0pO1xufVxuZnVuY3Rpb24gcHJvcF9kZXYobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgbm9kZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICBkaXNwYXRjaF9kZXYoJ1N2ZWx0ZURPTVNldFByb3BlcnR5JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBkYXRhc2V0X2Rldihub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgICBub2RlLmRhdGFzZXRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhc2V0JywgeyBub2RlLCBwcm9wZXJ0eSwgdmFsdWUgfSk7XG59XG5mdW5jdGlvbiBzZXRfZGF0YV9kZXYodGV4dCwgZGF0YSkge1xuICAgIGRhdGEgPSAnJyArIGRhdGE7XG4gICAgaWYgKHRleHQud2hvbGVUZXh0ID09PSBkYXRhKVxuICAgICAgICByZXR1cm47XG4gICAgZGlzcGF0Y2hfZGV2KCdTdmVsdGVET01TZXREYXRhJywgeyBub2RlOiB0ZXh0LCBkYXRhIH0pO1xuICAgIHRleHQuZGF0YSA9IGRhdGE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZV9lYWNoX2FyZ3VtZW50KGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnc3RyaW5nJyAmJiAhKGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiAnbGVuZ3RoJyBpbiBhcmcpKSB7XG4gICAgICAgIGxldCBtc2cgPSAneyNlYWNofSBvbmx5IGl0ZXJhdGVzIG92ZXIgYXJyYXktbGlrZSBvYmplY3RzLic7XG4gICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGFyZyAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gYXJnKSB7XG4gICAgICAgICAgICBtc2cgKz0gJyBZb3UgY2FuIHVzZSBhIHNwcmVhZCB0byBjb252ZXJ0IHRoaXMgaXRlcmFibGUgaW50byBhbiBhcnJheS4nO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlX3Nsb3RzKG5hbWUsIHNsb3QsIGtleXMpIHtcbiAgICBmb3IgKGNvbnN0IHNsb3Rfa2V5IG9mIE9iamVjdC5rZXlzKHNsb3QpKSB7XG4gICAgICAgIGlmICghfmtleXMuaW5kZXhPZihzbG90X2tleSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgPCR7bmFtZX0+IHJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgc2xvdCBcIiR7c2xvdF9rZXl9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIFN2ZWx0ZSBjb21wb25lbnRzIHdpdGggc29tZSBtaW5vciBkZXYtZW5oYW5jZW1lbnRzLiBVc2VkIHdoZW4gZGV2PXRydWUuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudERldiBleHRlbmRzIFN2ZWx0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnRhcmdldCAmJiAhb3B0aW9ucy4kJGlubGluZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIid0YXJnZXQnIGlzIGEgcmVxdWlyZWQgb3B0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgICRkZXN0cm95KCkge1xuICAgICAgICBzdXBlci4kZGVzdHJveSgpO1xuICAgICAgICB0aGlzLiRkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb21wb25lbnQgd2FzIGFscmVhZHkgZGVzdHJveWVkJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAkY2FwdHVyZV9zdGF0ZSgpIHsgfVxuICAgICRpbmplY3Rfc3RhdGUoKSB7IH1cbn1cbi8qKlxuICogQmFzZSBjbGFzcyB0byBjcmVhdGUgc3Ryb25nbHkgdHlwZWQgU3ZlbHRlIGNvbXBvbmVudHMuXG4gKiBUaGlzIG9ubHkgZXhpc3RzIGZvciB0eXBpbmcgcHVycG9zZXMgYW5kIHNob3VsZCBiZSB1c2VkIGluIGAuZC50c2AgZmlsZXMuXG4gKlxuICogIyMjIEV4YW1wbGU6XG4gKlxuICogWW91IGhhdmUgY29tcG9uZW50IGxpYnJhcnkgb24gbnBtIGNhbGxlZCBgY29tcG9uZW50LWxpYnJhcnlgLCBmcm9tIHdoaWNoXG4gKiB5b3UgZXhwb3J0IGEgY29tcG9uZW50IGNhbGxlZCBgTXlDb21wb25lbnRgLiBGb3IgU3ZlbHRlK1R5cGVTY3JpcHQgdXNlcnMsXG4gKiB5b3Ugd2FudCB0byBwcm92aWRlIHR5cGluZ3MuIFRoZXJlZm9yZSB5b3UgY3JlYXRlIGEgYGluZGV4LmQudHNgOlxuICogYGBgdHNcbiAqIGltcG9ydCB7IFN2ZWx0ZUNvbXBvbmVudFR5cGVkIH0gZnJvbSBcInN2ZWx0ZVwiO1xuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50VHlwZWQ8e2Zvbzogc3RyaW5nfT4ge31cbiAqIGBgYFxuICogVHlwaW5nIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIElERXMgbGlrZSBWUyBDb2RlIHdpdGggdGhlIFN2ZWx0ZSBleHRlbnNpb25cbiAqIHRvIHByb3ZpZGUgaW50ZWxsaXNlbnNlIGFuZCB0byB1c2UgdGhlIGNvbXBvbmVudCBsaWtlIHRoaXMgaW4gYSBTdmVsdGUgZmlsZVxuICogd2l0aCBUeXBlU2NyaXB0OlxuICogYGBgc3ZlbHRlXG4gKiA8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuICogXHRpbXBvcnQgeyBNeUNvbXBvbmVudCB9IGZyb20gXCJjb21wb25lbnQtbGlicmFyeVwiO1xuICogPC9zY3JpcHQ+XG4gKiA8TXlDb21wb25lbnQgZm9vPXsnYmFyJ30gLz5cbiAqIGBgYFxuICpcbiAqICMjIyMgV2h5IG5vdCBtYWtlIHRoaXMgcGFydCBvZiBgU3ZlbHRlQ29tcG9uZW50KERldilgP1xuICogQmVjYXVzZVxuICogYGBgdHNcbiAqIGNsYXNzIEFTdWJjbGFzc09mU3ZlbHRlQ29tcG9uZW50IGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50PHtmb286IHN0cmluZ30+IHt9XG4gKiBjb25zdCBjb21wb25lbnQ6IHR5cGVvZiBTdmVsdGVDb21wb25lbnQgPSBBU3ViY2xhc3NPZlN2ZWx0ZUNvbXBvbmVudDtcbiAqIGBgYFxuICogd2lsbCB0aHJvdyBhIHR5cGUgZXJyb3IsIHNvIHdlIG5lZWQgdG8gc2VwYXJhdGUgdGhlIG1vcmUgc3RyaWN0bHkgdHlwZWQgY2xhc3MuXG4gKi9cbmNsYXNzIFN2ZWx0ZUNvbXBvbmVudFR5cGVkIGV4dGVuZHMgU3ZlbHRlQ29tcG9uZW50RGV2IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvb3BfZ3VhcmQodGltZW91dCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmZpbml0ZSBsb29wIGRldGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgeyBIdG1sVGFnLCBIdG1sVGFnSHlkcmF0aW9uLCBTdmVsdGVDb21wb25lbnQsIFN2ZWx0ZUNvbXBvbmVudERldiwgU3ZlbHRlQ29tcG9uZW50VHlwZWQsIFN2ZWx0ZUVsZW1lbnQsIGFjdGlvbl9kZXN0cm95ZXIsIGFkZF9hdHRyaWJ1dGUsIGFkZF9jbGFzc2VzLCBhZGRfZmx1c2hfY2FsbGJhY2ssIGFkZF9sb2NhdGlvbiwgYWRkX3JlbmRlcl9jYWxsYmFjaywgYWRkX3Jlc2l6ZV9saXN0ZW5lciwgYWRkX3RyYW5zZm9ybSwgYWZ0ZXJVcGRhdGUsIGFwcGVuZCwgYXBwZW5kX2RldiwgYXBwZW5kX2VtcHR5X3N0eWxlc2hlZXQsIGFwcGVuZF9oeWRyYXRpb24sIGFwcGVuZF9oeWRyYXRpb25fZGV2LCBhcHBlbmRfc3R5bGVzLCBhc3NpZ24sIGF0dHIsIGF0dHJfZGV2LCBhdHRyaWJ1dGVfdG9fb2JqZWN0LCBiZWZvcmVVcGRhdGUsIGJpbmQsIGJpbmRpbmdfY2FsbGJhY2tzLCBibGFua19vYmplY3QsIGJ1YmJsZSwgY2hlY2tfb3V0cm9zLCBjaGlsZHJlbiwgY2xhaW1fY29tcG9uZW50LCBjbGFpbV9lbGVtZW50LCBjbGFpbV9odG1sX3RhZywgY2xhaW1fc3BhY2UsIGNsYWltX3N2Z19lbGVtZW50LCBjbGFpbV90ZXh0LCBjbGVhcl9sb29wcywgY29tcG9uZW50X3N1YnNjcmliZSwgY29tcHV0ZV9yZXN0X3Byb3BzLCBjb21wdXRlX3Nsb3RzLCBjcmVhdGVFdmVudERpc3BhdGNoZXIsIGNyZWF0ZV9hbmltYXRpb24sIGNyZWF0ZV9iaWRpcmVjdGlvbmFsX3RyYW5zaXRpb24sIGNyZWF0ZV9jb21wb25lbnQsIGNyZWF0ZV9pbl90cmFuc2l0aW9uLCBjcmVhdGVfb3V0X3RyYW5zaXRpb24sIGNyZWF0ZV9zbG90LCBjcmVhdGVfc3NyX2NvbXBvbmVudCwgY3VycmVudF9jb21wb25lbnQsIGN1c3RvbV9ldmVudCwgZGF0YXNldF9kZXYsIGRlYnVnLCBkZXN0cm95X2Jsb2NrLCBkZXN0cm95X2NvbXBvbmVudCwgZGVzdHJveV9lYWNoLCBkZXRhY2gsIGRldGFjaF9hZnRlcl9kZXYsIGRldGFjaF9iZWZvcmVfZGV2LCBkZXRhY2hfYmV0d2Vlbl9kZXYsIGRldGFjaF9kZXYsIGRpcnR5X2NvbXBvbmVudHMsIGRpc3BhdGNoX2RldiwgZWFjaCwgZWxlbWVudCwgZWxlbWVudF9pcywgZW1wdHksIGVuZF9oeWRyYXRpbmcsIGVzY2FwZSwgZXNjYXBlX2F0dHJpYnV0ZV92YWx1ZSwgZXNjYXBlX29iamVjdCwgZXNjYXBlZCwgZXhjbHVkZV9pbnRlcm5hbF9wcm9wcywgZml4X2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfYW5kX291dHJvX2FuZF9kZXN0cm95X2Jsb2NrLCBmaXhfcG9zaXRpb24sIGZsdXNoLCBnZXRBbGxDb250ZXh0cywgZ2V0Q29udGV4dCwgZ2V0X2FsbF9kaXJ0eV9mcm9tX3Njb3BlLCBnZXRfYmluZGluZ19ncm91cF92YWx1ZSwgZ2V0X2N1cnJlbnRfY29tcG9uZW50LCBnZXRfY3VzdG9tX2VsZW1lbnRzX3Nsb3RzLCBnZXRfcm9vdF9mb3Jfc3R5bGUsIGdldF9zbG90X2NoYW5nZXMsIGdldF9zcHJlYWRfb2JqZWN0LCBnZXRfc3ByZWFkX3VwZGF0ZSwgZ2V0X3N0b3JlX3ZhbHVlLCBnbG9iYWxzLCBncm91cF9vdXRyb3MsIGhhbmRsZV9wcm9taXNlLCBoYXNDb250ZXh0LCBoYXNfcHJvcCwgaWRlbnRpdHksIGluaXQsIGluc2VydCwgaW5zZXJ0X2RldiwgaW5zZXJ0X2h5ZHJhdGlvbiwgaW5zZXJ0X2h5ZHJhdGlvbl9kZXYsIGludHJvcywgaW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9jaGFyYWN0ZXIsIGlzX2NsaWVudCwgaXNfY3Jvc3NvcmlnaW4sIGlzX2VtcHR5LCBpc19mdW5jdGlvbiwgaXNfcHJvbWlzZSwgbGlzdGVuLCBsaXN0ZW5fZGV2LCBsb29wLCBsb29wX2d1YXJkLCBtaXNzaW5nX2NvbXBvbmVudCwgbW91bnRfY29tcG9uZW50LCBub29wLCBub3RfZXF1YWwsIG5vdywgbnVsbF90b19lbXB0eSwgb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllcywgb25EZXN0cm95LCBvbk1vdW50LCBvbmNlLCBvdXRyb19hbmRfZGVzdHJveV9ibG9jaywgcHJldmVudF9kZWZhdWx0LCBwcm9wX2RldiwgcXVlcnlfc2VsZWN0b3JfYWxsLCByYWYsIHJ1biwgcnVuX2FsbCwgc2FmZV9ub3RfZXF1YWwsIHNjaGVkdWxlX3VwZGF0ZSwgc2VsZWN0X211bHRpcGxlX3ZhbHVlLCBzZWxlY3Rfb3B0aW9uLCBzZWxlY3Rfb3B0aW9ucywgc2VsZWN0X3ZhbHVlLCBzZWxmLCBzZXRDb250ZXh0LCBzZXRfYXR0cmlidXRlcywgc2V0X2N1cnJlbnRfY29tcG9uZW50LCBzZXRfY3VzdG9tX2VsZW1lbnRfZGF0YSwgc2V0X2RhdGEsIHNldF9kYXRhX2Rldiwgc2V0X2lucHV0X3R5cGUsIHNldF9pbnB1dF92YWx1ZSwgc2V0X25vdywgc2V0X3JhZiwgc2V0X3N0b3JlX3ZhbHVlLCBzZXRfc3R5bGUsIHNldF9zdmdfYXR0cmlidXRlcywgc3BhY2UsIHNwcmVhZCwgc3JjX3VybF9lcXVhbCwgc3RhcnRfaHlkcmF0aW5nLCBzdG9wX3Byb3BhZ2F0aW9uLCBzdWJzY3JpYmUsIHN2Z19lbGVtZW50LCB0ZXh0LCB0aWNrLCB0aW1lX3Jhbmdlc190b19hcnJheSwgdG9fbnVtYmVyLCB0b2dnbGVfY2xhc3MsIHRyYW5zaXRpb25faW4sIHRyYW5zaXRpb25fb3V0LCB0cnVzdGVkLCB1cGRhdGVfYXdhaXRfYmxvY2tfYnJhbmNoLCB1cGRhdGVfa2V5ZWRfZWFjaCwgdXBkYXRlX3Nsb3QsIHVwZGF0ZV9zbG90X2Jhc2UsIHZhbGlkYXRlX2NvbXBvbmVudCwgdmFsaWRhdGVfZWFjaF9hcmd1bWVudCwgdmFsaWRhdGVfZWFjaF9rZXlzLCB2YWxpZGF0ZV9zbG90cywgdmFsaWRhdGVfc3RvcmUsIHhsaW5rX2F0dHIgfTtcbiIsICJpbXBvcnQgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGVidWcsIGVycm9yIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgUG9zLCBURmlsZSwgVEZvbGRlciB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHsgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudCwgYWRkU2libGluZ3NQYXJlbnRJc1BhcmVudCwgYWRkQXVudHNVbmNsZXMsIGFkZENvdXNpbnMsIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzIH0gZnJvbSBcIi4vUmVsYXRpb25zXCI7XHJcbmltcG9ydCB7IGFkZENTVkNydW1icywgZ2V0Q1NWUm93cyB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvQ1NWQ3J1bWJzXCI7XHJcbmltcG9ydCB7IGFkZERhdGF2aWV3Tm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EYXRhdmlld05vdGVzXCI7XHJcbmltcG9ydCB7IGFkZERhdGVOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL0RhdGVOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGREZW5kcm9uTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9EZW5kcm9uTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkRm9sZGVyTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9Gb2xkZXJOb3Rlc1wiO1xyXG5pbXBvcnQge1xyXG4gIGFkZEhOc1RvR3JhcGgsXHJcbiAgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zLFxyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSGllcmFyY2h5Tm90ZXMvSGllcmFyY2h5Tm90ZXNcIjtcclxuaW1wb3J0IHtcclxuICBhZGRKdWdnbExpbmtzVG9HcmFwaCxcclxuICBnZXRKdWdnbExpbmtzLFxyXG59IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvSnVnZ2xMaW5rc1wiO1xyXG5pbXBvcnQgeyBhZGRMaW5rTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9MaW5rTm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkUmVnZXhOb3Rlc1RvR3JhcGggfSBmcm9tIFwiLi9BbHRlcm5hdGl2ZUhpZXJhcmNoaWVzL1JlZ2V4Tm90ZXNcIjtcclxuaW1wb3J0IHsgYWRkVGFnTm90ZXNUb0dyYXBoIH0gZnJvbSBcIi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9UYWdOb3Rlc1wiO1xyXG5pbXBvcnQgeyBhZGRUcmF2ZXJzZU5vdGVzVG9HcmFwaCB9IGZyb20gXCIuL0FsdGVybmF0aXZlSGllcmFyY2hpZXMvVHJhdmVyc2VOb3Rlc1wiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0FMVFMsXHJcbiAgQkNfRFZfTk9URSxcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19JX0FVTlQsXHJcbiAgQkNfSV9DT1VTSU4sXHJcbiAgQkNfSV9QQVJFTlQsXHJcbiAgQkNfSV9TSUJMSU5HXzEsXHJcbiAgQkNfSV9TSUJMSU5HXzIsXHJcbiAgQkNfTElOS19OT1RFLFxyXG4gIEJDX1JFR0VYX05PVEUsXHJcbiAgQkNfVEFHX05PVEUsXHJcbiAgQkNfVFJBVkVSU0VfTk9URSxcclxuICBkcm9wSGVhZGVyT3JBbGlhcyxcclxuICBzcGxpdExpbmtzUmVnZXgsXHJcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHtcclxuICBCQ1NldHRpbmdzLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBkdkxpbmssXHJcbiAgUmF3VmFsdWUsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgYWRkRWRnZUlmTm90LFxyXG4gIGFkZE5vZGVzSWZOb3QsXHJcbiAgYnVpbGRPYnNHcmFwaCxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGZhbGxiYWNrRmllbGQsIGdldEZpZWxkSW5mbywgaXRlcmF0ZUhpZXJzIH0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0QmFzZUZyb21NRFBhdGgsXHJcbiAgZ2V0RFZBcGksXHJcbiAgZ2V0RFZCYXNlbmFtZSxcclxufSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCIuL1ZpZXdzL1RyYWlsVmlld1wiO1xyXG5cclxuZnVuY3Rpb24gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbjogQkNQbHVnaW4sIGZpbGVzOiBURmlsZVtdKSB7XHJcbiAgY29uc3QgeyBkYiB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGFwaSA9IGdldERWQXBpKHBsdWdpbik7XHJcbiAgZGIuc3RhcnQxRyhcImdldERWTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4gYXBpLnBhZ2UoZmlsZS5wYXRoKSk7XHJcblxyXG4gIGRiLmVuZDFHKHsgZnJvbnRtcyB9KTtcclxuICByZXR1cm4gZnJvbnRtcztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T2JzTWV0YWRhdGFDYWNoZShwbHVnaW46IEJDUGx1Z2luLCBmaWxlczogVEZpbGVbXSkge1xyXG4gIGNvbnN0IHsgZGIgfSA9IHBsdWdpbjtcclxuICBkYi5zdGFydDFHKFwiZ2V0T2JzTWV0YWRhdGFDYWNoZVwiKTtcclxuXHJcbiAgY29uc3QgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10gPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgIHJldHVybiBmcm9udG1hdHRlciA/IHsgZmlsZSwgLi4uZnJvbnRtYXR0ZXIgfSA6IHsgZmlsZSB9O1xyXG4gIH0pO1xyXG5cclxuICBkYi5lbmQxRyh7IGZyb250bXMgfSk7XHJcbiAgcmV0dXJuIGZyb250bXM7XHJcbn1cclxuXHJcbmNvbnN0IGlzRFZQcm94eSA9IChpdGVtOiBSYXdWYWx1ZSkgPT4gdHlwZW9mIGl0ZW0uZGVmYXVsdENvbXBhcmF0b3IgPT09IFwiZnVuY3Rpb25cIlxyXG5cclxuLyoqXHJcbiAqIEtlZXAgdW53cmFwcGluZyBhIHByb3hpZWQgaXRlbSB1bnRpbCBpdCBpc24ndCBvbmUgYW55bW9yZVxyXG4gKiBAcGFyYW0gIHtSYXdWYWx1ZX0gaXRlbVxyXG4gKi9cclxuZnVuY3Rpb24gdW5wcm94eShpdGVtOiBSYXdWYWx1ZSkge1xyXG4gIGNvbnN0IHVucHJveGllZCA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlID0gW2l0ZW1dO1xyXG5cclxuICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBjdXJySXRlbSA9IHF1ZXVlLnNoaWZ0KCk7XHJcblxyXG4gICAgaWYgKGlzRFZQcm94eShjdXJySXRlbSkpIHF1ZXVlLnB1c2goLi4uY3Vyckl0ZW0udmFsdWVzKTtcclxuICAgIGVsc2UgdW5wcm94aWVkLnB1c2goY3Vyckl0ZW0pO1xyXG4gIH1cclxuICByZXR1cm4gdW5wcm94aWVkO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdpdmVuIGEgYGR2Q2FjaGVbZmllbGRdYCB2YWx1ZSwgcGFyc2UgdGhlIGxpbmsocykgb3V0IG9mIGl0XHJcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZX0gdmFsdWVcclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlRmllbGRWYWx1ZShcclxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCBzdHJpbmdbXVtdIHwgZHZMaW5rIHwgZHZMaW5rW10gfCBQb3MgfCBURmlsZVxyXG4pIHtcclxuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XHJcblxyXG4gIGNvbnN0IHBhcnNlZDogc3RyaW5nW10gPSBbXTtcclxuICB0cnkge1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgY29uc3Qgc3BsaXRzID0gdmFsdWUubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KTtcclxuXHJcbiAgICAgIGlmIChzcGxpdHMgIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBsaW5rTmFtZXMgPSBzcGxpdHMubWFwKChsaW5rKSA9PlxyXG4gICAgICAgICAgZ2V0QmFzZUZyb21NRFBhdGgobGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcylbMV0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBwYXJzZWQucHVzaCguLi5saW5rTmFtZXMpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByYXdWYWx1ZXM6IFJhd1ZhbHVlW10gPSBbdmFsdWVdLmZsYXQoNCk7XHJcbiAgICAgIGRlYnVnKC4uLnJhd1ZhbHVlcyk7XHJcblxyXG4gICAgICByYXdWYWx1ZXMuZm9yRWFjaCgocmF3SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghcmF3SXRlbSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCB1blByb3hpZWQgPSB1bnByb3h5KHJhd0l0ZW0pO1xyXG4gICAgICAgIHVuUHJveGllZC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmF3QXNTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBzcGxpdHMgPSByYXdBc1N0cmluZy5tYXRjaChzcGxpdExpbmtzUmVnZXgpO1xyXG4gICAgICAgICAgICBpZiAoc3BsaXRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3RycyA9IHNwbGl0cy5tYXAoKGxpbmspID0+XHJcbiAgICAgICAgICAgICAgICBnZXRCYXNlRnJvbU1EUGF0aChsaW5rLm1hdGNoKGRyb3BIZWFkZXJPckFsaWFzKVsxXSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKC4uLnN0cnMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0QmFzZUZyb21NRFBhdGgocmF3QXNTdHJpbmcpO1xyXG4gICAgICAgICAgICAgIHBhcnNlZC5wdXNoKGJhc2VuYW1lLnNwbGl0KFwiI1wiKVswXS5zcGxpdChcInxcIilbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IGdldEJhc2VGcm9tTURQYXRoKHZhbHVlLnBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoYmFzZW5hbWUgIT09IHVuZGVmaW5lZCkgcGFyc2VkLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcmV0dXJuIHBhcnNlZDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1haW5HKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPE11bHRpR3JhcGg+IHtcclxuICBjb25zdCBtYWluRyA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHsgc2V0dGluZ3MsIGRiIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7IHVzZXJIaWVycywgQ1NWUGF0aHMsIHBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbCwgaGllcmFyY2h5Tm90ZXMgfSA9XHJcbiAgICAgIHNldHRpbmdzO1xyXG4gICAgZGIuc3RhcnQyRyhcImluaXRHcmFwaHNcIik7XHJcblxyXG4gICAgaWYgKHVzZXJIaWVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgZGIuZW5kMkcoKTtcclxuICAgICAgbmV3IE5vdGljZShcIllvdSBkbyBub3QgaGF2ZSBhbnkgQnJlYWRjcnVtYnMgaGllcmFyY2hpZXMgc2V0IHVwLlwiKTtcclxuICAgICAgcmV0dXJuIG1haW5HO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbGVzID0gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKTtcclxuICAgIGNvbnN0IGR2USA9IGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhcImRhdGF2aWV3XCIpO1xyXG5cclxuICAgIGxldCBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSA9IGR2UVxyXG4gICAgICA/IGdldERWTWV0YWRhdGFDYWNoZShwbHVnaW4sIGZpbGVzKVxyXG4gICAgICA6IGdldE9ic01ldGFkYXRhQ2FjaGUocGx1Z2luLCBmaWxlcyk7XHJcblxyXG4gICAgaWYgKGZyb250bXMuc29tZSgoZnJvbnRtKSA9PiBmcm9udG0gPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgYXdhaXQgd2FpdCgyMDAwKTtcclxuICAgICAgZnJvbnRtcyA9IGR2UVxyXG4gICAgICAgID8gZ2V0RFZNZXRhZGF0YUNhY2hlKHBsdWdpbiwgZmlsZXMpXHJcbiAgICAgICAgOiBnZXRPYnNNZXRhZGF0YUNhY2hlKHBsdWdpbiwgZmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IENTVlJvd3MgPSBDU1ZQYXRocyAhPT0gXCJcIiA/IGF3YWl0IGdldENTVlJvd3MocGx1Z2luKSA6IFtdO1xyXG5cclxuICAgIGNvbnN0IGVsaWdhYmxlQWx0czogeyBbYWx0RmllbGQ6IHN0cmluZ106IGR2RnJvbnRtYXR0ZXJDYWNoZVtdIH0gPSB7fTtcclxuICAgIEJDX0FMVFMuZm9yRWFjaCgoYWx0KSA9PiAoZWxpZ2FibGVBbHRzW2FsdF0gPSBbXSkpO1xyXG5cclxuICAgIGRiLnN0YXJ0MkcoXCJhZGRGcm9udG1hdHRlclRvR3JhcGhcIik7XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgQkNfQUxUUy5mb3JFYWNoKChhbHQpID0+IHtcclxuICAgICAgICBpZiAocGFnZVthbHRdICE9PSB1bmRlZmluZWQgJiYgcGFnZVthbHRdICE9PSBudWxsKVxyXG4gICAgICAgICAgZWxpZ2FibGVBbHRzW2FsdF0ucHVzaChwYWdlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihwYWdlKTtcclxuXHJcbiAgICAgIGl0ZXJhdGVIaWVycyh1c2VySGllcnMsIChoaWVyLCBkaXIsIGZpZWxkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gcGFyc2VGaWVsZFZhbHVlKHBhZ2VbZmllbGRdKTtcclxuXHJcbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKFwiPCVcIikgfHwgdGFyZ2V0LnN0YXJ0c1dpdGgoXCJ7e1wiKSkgcmV0dXJuO1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXQpO1xyXG5cclxuICAgICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgIHRhcmdldCxcclxuICAgICAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgICAgIHRhcmdldE9yZGVyXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChDU1ZSb3dzLmxlbmd0aCkgYWRkQ1NWQ3J1bWJzKG1haW5HLCBDU1ZSb3dzLCBkaXIsIGZpZWxkKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkYi5lbmQyRygpO1xyXG5cclxuICAgIC8vIFNFQ1RJT04gIEp1Z2dsIExpbmtzXHJcbiAgICBjb25zdCBqdWdnbExpbmtzID1cclxuICAgICAgYXBwLnBsdWdpbnMucGx1Z2lucy5qdWdnbCB8fCBwYXJzZUp1Z2dsTGlua3NXaXRob3V0SnVnZ2xcclxuICAgICAgICA/IGF3YWl0IGdldEp1Z2dsTGlua3MocGx1Z2luLCBmaWxlcylcclxuICAgICAgICA6IFtdO1xyXG5cclxuICAgIGlmIChqdWdnbExpbmtzLmxlbmd0aClcclxuICAgICAgYWRkSnVnZ2xMaW5rc1RvR3JhcGgoc2V0dGluZ3MsIGp1Z2dsTGlua3MsIGZyb250bXMsIG1haW5HKTtcclxuXHJcbiAgICAvLyAhU0VDVElPTiAgSnVnZ2wgTGlua3NcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiQWx0ZXJuYXRpdmUgSGllcmFyY2hpZXNcIik7XHJcbiAgICAvLyBTRUNUSU9OICBIaWVyYXJjaHkgTm90ZXNcclxuICAgIGRiLnN0YXJ0MkcoXCJIaWVyYXJjaHkgTm90ZXNcIik7XHJcblxyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vdGVPckZvbGRlciBvZiBoaWVyYXJjaHlOb3Rlcykge1xyXG4gICAgICAgIGlmIChub3RlT3JGb2xkZXIuZW5kc1dpdGgoXCIvXCIpKSB7XHJcbiAgICAgICAgICBjb25zdCBmb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKFxyXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoKG5vdGVPckZvbGRlcilcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgVEZvbGRlcikpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmb2xkZXIuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICBhZGRITnNUb0dyYXBoKFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRIaWVyYXJjaHlOb3RlSXRlbXMoY2hpbGQpLFxyXG4gICAgICAgICAgICAgICAgbWFpbkdcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlT3JGb2xkZXIsIFwiXCIpO1xyXG4gICAgICAgICAgaWYgKGZpbGUpXHJcbiAgICAgICAgICAgIGFkZEhOc1RvR3JhcGgoXHJcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGUpLFxyXG4gICAgICAgICAgICAgIG1haW5HXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIC8vICFTRUNUSU9OICBIaWVyYXJjaHkgTm90ZXNcclxuXHJcbiAgICBkYi5zdGFydDJHKFwiRm9sZGVyIE5vdGVzXCIpO1xyXG4gICAgYWRkRm9sZGVyTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX0ZPTERFUl9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJUYWcgTm90ZXNcIik7XHJcbiAgICBhZGRUYWdOb3Rlc1RvR3JhcGgocGx1Z2luLCBlbGlnYWJsZUFsdHNbQkNfVEFHX05PVEVdLCBmcm9udG1zLCBtYWluRyk7XHJcbiAgICBkYi5lbmQyRygpO1xyXG4gICAgZGIuc3RhcnQyRyhcIkxpbmsgTm90ZXNcIik7XHJcbiAgICBhZGRMaW5rTm90ZXNUb0dyYXBoKHBsdWdpbiwgZWxpZ2FibGVBbHRzW0JDX0xJTktfTk9URV0sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiUmVnZXggTm90ZXNcIik7XHJcbiAgICBhZGRSZWdleE5vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19SRUdFWF9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIC8vIHBsdWdpbi5hZGROYW1pbmdTeXN0ZW1Ob3Rlc1RvR3JhcGgoZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuc3RhcnQyRyhcIlRyYXZlcnNlIE5vdGVzXCIpO1xyXG4gICAgYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgICAgIHBsdWdpbixcclxuICAgICAgZWxpZ2FibGVBbHRzW0JDX1RSQVZFUlNFX05PVEVdLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgYnVpbGRPYnNHcmFwaCgpXHJcbiAgICApO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJEZW5kcm9uIE5vdGVzXCIpO1xyXG4gICAgYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChwbHVnaW4sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgICBkYi5zdGFydDJHKFwiRGF0YXZpZXcgTm90ZXNcIik7XHJcbiAgICBhZGREYXRhdmlld05vdGVzVG9HcmFwaChwbHVnaW4sIGVsaWdhYmxlQWx0c1tCQ19EVl9OT1RFXSwgZnJvbnRtcywgbWFpbkcpO1xyXG4gICAgZGIuZW5kMkcoKTtcclxuICAgIGRiLnN0YXJ0MkcoXCJEYXRlIE5vdGVzXCIpO1xyXG4gICAgYWRkRGF0ZU5vdGVzVG9HcmFwaChwbHVnaW4sIGZyb250bXMsIG1haW5HKTtcclxuICAgIGRiLmVuZDJHKCk7XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuXHJcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiBhZGROb2Rlc0lmTm90KG1haW5HLCBbZmlsZS5iYXNlbmFtZV0pKTtcclxuICAgIGRiLmVuZDJHKFwiZ3JhcGhzIGluaXRlZFwiLCB7IG1haW5HIH0pO1xyXG4gICAgcmV0dXJuIG1haW5HO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgZXJyb3IoZXJyKTtcclxuICAgIHBsdWdpbi5kYi5lbmQyRygpO1xyXG4gICAgcmV0dXJuIG1haW5HO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xvc2VkRyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBtYWluRywgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7XHJcbiAgICB1c2VySGllcnMsXHJcbiAgICBpbXBsaWVkUmVsYXRpb25zOiB7XHJcbiAgICAgIHNhbWVQYXJlbnRJc1NpYmxpbmcsXHJcbiAgICAgIHBhcmVudHNTaWJsaW5nc0lzUGFyZW50cyxcclxuICAgICAgY291c2luc0lzU2libGluZyxcclxuICAgICAgc2libGluZ3NTaWJsaW5nSXNTaWJsaW5nLFxyXG4gICAgICBzaWJsaW5nc1BhcmVudElzUGFyZW50LFxyXG4gICAgfSxcclxuICB9ID0gc2V0dGluZ3M7XHJcbiAgbGV0IGNsb3NlZEcgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKG1haW5HLCB1c2VySGllcnMpO1xyXG5cclxuICBpZiAoc2FtZVBhcmVudElzU2libGluZykgYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudChjbG9zZWRHLCBzZXR0aW5ncyk7XHJcbiAgaWYgKHNpYmxpbmdzUGFyZW50SXNQYXJlbnQpIGFkZFNpYmxpbmdzUGFyZW50SXNQYXJlbnQoY2xvc2VkRyk7XHJcbiAgaWYgKHBhcmVudHNTaWJsaW5nc0lzUGFyZW50cykgYWRkQXVudHNVbmNsZXMoY2xvc2VkRyk7XHJcbiAgaWYgKGNvdXNpbnNJc1NpYmxpbmcpIGFkZENvdXNpbnMoY2xvc2VkRyk7XHJcbiAgaWYgKHNpYmxpbmdzU2libGluZ0lzU2libGluZykgYWRkU3RydWN0dXJhbEVxdWl2YWxlbmNlU2libGluZ3MoY2xvc2VkRyk7XHJcblxyXG4gIHJldHVybiBjbG9zZWRHO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEluZGV4KHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBpZiAoIXBsdWdpbi5hY3RpdmVMZWFmQ2hhbmdlKSBwbHVnaW4ucmVnaXN0ZXJBY3RpdmVMZWFmQ2hhbmdlRXZlbnQoKTtcclxuICBpZiAoIXBsdWdpbi5sYXlvdXRDaGFuZ2UpIHBsdWdpbi5yZWdpc3RlckxheW91dENoYW5nZUV2ZW50KCk7XHJcblxyXG4gIHBsdWdpbi5tYWluRyA9IGF3YWl0IGJ1aWxkTWFpbkcocGx1Z2luKTtcclxuICBwbHVnaW4uY2xvc2VkRyA9IGJ1aWxkQ2xvc2VkRyhwbHVnaW4pO1xyXG5cclxuICBmb3IgKGNvbnN0IHsgdHlwZSB9IG9mIHBsdWdpbi5WSUVXUylcclxuICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyh0eXBlKT8uZHJhdygpO1xyXG5cclxuICBpZiAocGx1Z2luLnNldHRpbmdzLnNob3dCQ3MpIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gIGlmIChwbHVnaW4uc2V0dGluZ3Muc2hvd1JlZnJlc2hOb3RpY2UpIG5ldyBOb3RpY2UoXCJCQyBJbmRleCByZWZyZXNoZWRcIik7XHJcbn1cclxuIiwgImltcG9ydCBHcmFwaCwgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgZGZzRnJvbU5vZGUgfSBmcm9tIFwiZ3JhcGhvbG9neS10cmF2ZXJzYWxcIjtcclxuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVzIH0gZnJvbSBcImdyYXBob2xvZ3ktdHlwZXNcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lfUkVGTEVYSVZFLFxyXG4gIEJDX09SREVSLFxyXG4gIGJsYW5rUmVhbE5JbXBsaWVkLFxyXG4gIERJUkVDVElPTlMsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgQkNTZXR0aW5ncyxcclxuICBEaXJlY3Rpb25zLFxyXG4gIGR2RnJvbnRtYXR0ZXJDYWNoZSxcclxuICBFZGdlQXR0cixcclxuICBOb2RlUGF0aCxcclxuICBSZWFsTkltcGxpZWQsXHJcbiAgVXNlckhpZXIsXHJcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRJbmZvLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRCYXNlRnJvbU1EUGF0aCB9IGZyb20gXCIuL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlYWwgJiBpbXBsaWVkIGdyYXBocyBmb3IgYSBnaXZlbiByZWxhdGlvbiwgYW5kIHJldHVybnMgYSBuZXcgZ3JhcGhzIHdpdGggYm90aC5cclxuLy8gSXQgbWFrZXMgaW1wbGllZCByZWxhdGlvbnMgcmVhbFxyXG4vLyBUT0RPIHVzZSByZWZsZXhpdmVDbG9zdXJlIGluc3RlYWRcclxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlSW1wbGllZExpbmtzKFxyXG4gIHJlYWw6IE11bHRpR3JhcGgsXHJcbiAgaW1wbGllZDogTXVsdGlHcmFwaFxyXG4pOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBjbG9zZWRHID0gcmVhbC5jb3B5KCk7XHJcbiAgaW1wbGllZC5mb3JFYWNoRWRnZSgoa2V5LCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjbG9zZWRHLm1lcmdlRWRnZSh0LCBzLCBhKTtcclxuICB9KTtcclxuICByZXR1cm4gY2xvc2VkRztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVW5saW5rZWROb2RlcyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgY29uc3QgY29weSA9IGcuY29weSgpO1xyXG4gIGNvcHkuZm9yRWFjaE5vZGUoKG5vZGUpID0+IHtcclxuICAgIGlmICghY29weS5kZWdyZWUobm9kZSkpIGNvcHkuZHJvcE5vZGUobm9kZSk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gYSBzdWJncmFwaCBvZiBhbGwgbm9kZXMgJiBlZGdlcyB3aXRoIGBkaXJzLmluY2x1ZGVzKGEuZGlyKWBcclxuICpcclxuICogRmlsdGVyIHRoZSBnaXZlbiBncmFwaCB0byBvbmx5IGluY2x1ZGUgZWRnZXMgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbnMuXHJcbiAqIEBwYXJhbSAge011bHRpR3JhcGh9IGdcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc30gZGlyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViSW5EaXJzKGc6IE11bHRpR3JhcGgsIC4uLmRpcnM6IERpcmVjdGlvbnNbXSkge1xyXG4gIGNvbnN0IHN1YiA9IG5ldyBNdWx0aUdyYXBoKCk7XHJcbiAgZz8uZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChkaXJzLmluY2x1ZGVzKGEuZGlyKSkge1xyXG4gICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgYWRkTm9kZXNJZk5vdChzdWIsIFtzLCB0XSwgeyBvcmRlcjogYS5vcmRlciB9KTtcclxuICAgICAgc3ViLmFkZEVkZ2UocywgdCwgYSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHN1YjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhIHN1YmdyYXBoIG9mIGFsbCBub2RlcyAmIGVkZ2VzIHdpdGggYGZpZWxkcy5pbmNsdWRlcyhhLmZpZWxkKWAuXHJcbiAqXHJcbiAqIEZpbHRlciB0aGUgZ2l2ZW4gZ3JhcGggdG8gb25seSBpbmNsdWRlIGVkZ2VzIHdpdGggdGhlIGdpdmVuIGZpZWxkcy5cclxuICogQHBhcmFtICB7TXVsdGlHcmFwaH0gZ1xyXG4gKiBAcGFyYW0gIHtzdHJpbmdbXX0gZmllbGRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViRm9yRmllbGRzKGc6IE11bHRpR3JhcGgsIGZpZWxkczogc3RyaW5nW10pIHtcclxuICBjb25zdCBzdWIgPSBuZXcgTXVsdGlHcmFwaCgpO1xyXG4gIGcuZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGlmIChmaWVsZHMuaW5jbHVkZXMoYS5maWVsZCkpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIGFkZE5vZGVzSWZOb3Qoc3ViLCBbcywgdF0sIHsgb3JkZXI6IGEub3JkZXIgfSk7XHJcbiAgICAgIHN1Yi5hZGRFZGdlKHMsIHQsIGEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBzdWI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3IgZXZlcnkgZWRnZSBpbiBgZ2AsIGFkZCB0aGUgcmV2ZXJzZSBvZiB0aGUgZWRnZSB0byBhIGNvcHkgb2YgYGdgLlxyXG4gKlxyXG4gKiBJdCBhbHNvIHNldHMgdGhlIGF0dHJzIG9mIHRoZSByZXZlcnNlIGVkZ2VzIHRvIGBvcHBEaXJgIGFuZCBgb3BwRmllbGRzWzBdYFxyXG4gKiBAcGFyYW0gIHtNdWx0aUdyYXBofSBnXHJcbiAqIEBwYXJhbSAge1VzZXJIaWVyW119IHVzZXJIaWVyc1xyXG4gKiBAcGFyYW0gIHtib29sZWFufSBjbG9zZUFzT3Bwb3NpdGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWZsZXhpdmVDbG9zdXJlKFxyXG4gIGc6IE11bHRpR3JhcGgsXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdXHJcbik6IE11bHRpR3JhcGgge1xyXG4gIGNvbnN0IGNvcHkgPSBnLmNvcHkoKTtcclxuICBjb3B5LmZvckVhY2hFZGdlKChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9XHJcbiAgICAgIGRpciA9PT0gXCJzYW1lXCIgPyBmaWVsZCA6IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoY29weSwgW3MsIHRdLCB7IG9yZGVyOiA5OTk5IH0pO1xyXG4gICAgYWRkRWRnZUlmTm90KGNvcHksIHQsIHMsIHtcclxuICAgICAgZGlyOiBvcHBEaXIsXHJcbiAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgaW1wbGllZDogQkNfSV9SRUZMRVhJVkUsXHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZE5vZGVzSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBub2Rlczogc3RyaW5nW10sXHJcbiAgYXR0ciA9IHsgb3JkZXI6IDk5OTkgfVxyXG4pIHtcclxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgIGcudXBkYXRlTm9kZShub2RlLCAoZXhzdGFudEF0dHJzOiBBdHRyaWJ1dGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4dGFudE9yZGVyOiBudW1iZXIgfCB1bmRlZmluZWQgPSBleHN0YW50QXR0cnMub3JkZXI7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZXhzdGFudEF0dHJzLFxyXG4gICAgICAgIG9yZGVyOiBleHRhbnRPcmRlciAmJiBleHRhbnRPcmRlciA8IDk5OTkgPyBleHRhbnRPcmRlciA6IGF0dHIub3JkZXIsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRFZGdlSWZOb3QoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICB0YXJnZXQ6IHN0cmluZyxcclxuICBhdHRyPzogQXR0cmlidXRlc1xyXG4pIHtcclxuICBpZiAoIWcuaGFzRWRnZShzb3VyY2UsIHRhcmdldCkpIGcuYWRkRWRnZShzb3VyY2UsIHRhcmdldCwgYXR0cik7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTaW5rcyA9IChnOiBNdWx0aUdyYXBoKSA9PlxyXG4gIGcuZmlsdGVyTm9kZXMoKG5vZGUpID0+IGcuaGFzTm9kZShub2RlKSAmJiAhZy5vdXREZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZXMgPSAoZzogTXVsdGlHcmFwaCkgPT5cclxuICBnLmZpbHRlck5vZGVzKChub2RlKSA9PiBnLmhhc05vZGUobm9kZSkgJiYgIWcuaW5EZWdyZWUobm9kZSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE91dE5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcub3V0TmVpZ2hib3JzKG5vZGUpIDogW107XHJcbmV4cG9ydCBjb25zdCBnZXRJbk5laWdoYm91cnMgPSAoZzogTXVsdGlHcmFwaCwgbm9kZTogc3RyaW5nKSA9PlxyXG4gIGcuaGFzTm9kZShub2RlKSA/IGcuaW5OZWlnaGJvcnMobm9kZSkgOiBbXTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kcyBhbGwgcGF0aHMgZnJvbSBhIHN0YXJ0aW5nIG5vZGUgdG8gYWxsIG90aGVyIHNpbmtzIGluIGEgZ3JhcGguXHJcbiAqXHJcbiAqXHJcbiAqIEBwYXJhbSB7TXVsdGlHcmFwaH0gZyAtIFRoZSBncmFwaCB0byBzZWFyY2hcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIG5vZGVcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJyYXlzLiBFYWNoIGFycmF5IGlzIGEgcGF0aC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZnNBbGxQYXRocyhnOiBNdWx0aUdyYXBoLCBzdGFydDogc3RyaW5nKTogc3RyaW5nW11bXSB7XHJcbiAgY29uc3QgcXVldWU6IE5vZGVQYXRoW10gPSBbeyBub2RlOiBzdGFydCwgcGF0aDogW10gfV07XHJcbiAgY29uc3QgdmlzaXRlZDogeyBbbm90ZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBjb25zdCBhbGxQYXRoczogc3RyaW5nW11bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDAgJiYgaSA8IDEwMDApIHtcclxuICAgIGkrKztcclxuICAgIGNvbnN0IHsgbm9kZSwgcGF0aCB9ID0gcXVldWUuc2hpZnQoKTtcclxuXHJcbiAgICBjb25zdCBleHRQYXRoID0gW25vZGUsIC4uLnBhdGhdO1xyXG4gICAgY29uc3Qgc3VjY3NOb3RWaXNpdGVkID0gZy5oYXNOb2RlKG5vZGUpXHJcbiAgICAgID8gZy5maWx0ZXJPdXROZWlnaGJvcnMoXHJcbiAgICAgICAgbm9kZSxcclxuICAgICAgICAoc3VjYykgPT4gIXZpc2l0ZWRbc3VjY10gfHwgdmlzaXRlZFtzdWNjXSA8IDVcclxuICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgbmV3SXRlbXMgPSBzdWNjc05vdFZpc2l0ZWQubWFwKChzdWNjKSA9PiB7XHJcbiAgICAgIHZpc2l0ZWRbc3VjY10gPSB2aXNpdGVkW3N1Y2NdID8gdmlzaXRlZFtzdWNjXSArIDEgOiAxO1xyXG4gICAgICByZXR1cm4geyBub2RlOiBzdWNjLCBwYXRoOiBleHRQYXRoIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICBxdWV1ZS51bnNoaWZ0KC4uLm5ld0l0ZW1zKTtcclxuXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCAhZy5vdXREZWdyZWUobm9kZSkpIGFsbFBhdGhzLnB1c2goZXh0UGF0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBhbGxQYXRocztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJmc0FsbFBhdGhzKGc6IE11bHRpR3JhcGgsIHN0YXJ0OiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICBjb25zdCBwYXRoc0Fycjogc3RyaW5nW11bXSA9IFtdO1xyXG4gIGNvbnN0IHF1ZXVlOiBOb2RlUGF0aFtdID0gW3sgbm9kZTogc3RhcnQsIHBhdGg6IFtdIH1dO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG4gICAgY29uc3QgeyBub2RlLCBwYXRoIH0gPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgZXh0UGF0aCA9IFtub2RlLCAuLi5wYXRoXTtcclxuXHJcbiAgICBjb25zdCBzdWNjcyA9IGcuaGFzTm9kZShub2RlKVxyXG4gICAgICA/IGcuZmlsdGVyT3V0TmVpZ2hib3JzKG5vZGUsIChuKSA9PiAhcGF0aC5pbmNsdWRlcyhuKSlcclxuICAgICAgOiBbXTtcclxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBzdWNjcykge1xyXG4gICAgICBxdWV1ZS5wdXNoKHsgbm9kZSwgcGF0aDogZXh0UGF0aCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0ZXJtaW5hbCBub2RlXHJcbiAgICBpZiAoIWcuaGFzTm9kZShub2RlKSB8fCBzdWNjcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcGF0aHNBcnIucHVzaChleHRQYXRoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gU3BsaWNlIG9mZiB0aGUgY3VycmVudCBub3RlIGZyb20gdGhlIHBhdGhcclxuICBwYXRoc0Fyci5mb3JFYWNoKChwYXRoKSA9PiB7XHJcbiAgICBpZiAocGF0aC5sZW5ndGgpIHBhdGguc3BsaWNlKHBhdGgubGVuZ3RoIC0gMSwgMSk7XHJcbiAgfSk7XHJcbiAgaW5mbyh7IHBhdGhzQXJyIH0pO1xyXG4gIHJldHVybiBwYXRoc0FycjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUN5Y2xlcyhnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpIHtcclxuICBjb25zdCBjb3B5ID0gZy5jb3B5KCk7XHJcbiAgbGV0IHByZXZOb2RlID0gbnVsbDtcclxuICBkZnNGcm9tTm9kZShjb3B5LCBzdGFydE5vZGUsIChuKSA9PiB7XHJcbiAgICBjb3B5LmZvckVhY2hPdXROZWlnaGJvcihuLCAodCkgPT4ge1xyXG4gICAgICBpZiAodCA9PT0gcHJldk5vZGUgJiYgY29weS5oYXNFZGdlKHQsIHByZXZOb2RlKSkge1xyXG4gICAgICAgIHRyeSB7IGNvcHkuZHJvcEVkZ2UodCwgcHJldk5vZGUpIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcih0LCBwcmV2Tm9kZSwgZXJyb3IpIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcHJldk5vZGUgPSBuO1xyXG4gIH0pO1xyXG4gIHJldHVybiBjb3B5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ViQ2xvc2VTdWIoXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICB1c2VySGllcnM6IFVzZXJIaWVyW10sXHJcbiAgLi4uZGlyczogRGlyZWN0aW9uc1tdXHJcbikge1xyXG4gIGNvbnN0IHN1YiA9IGdldFN1YkluRGlycyhnLCAuLi5kaXJzKTtcclxuICBjb25zdCBjbG9zZWQgPSBnZXRSZWZsZXhpdmVDbG9zdXJlKHN1YiwgdXNlckhpZXJzKTtcclxuICBjb25zdCBjbG9zZWRTdWIgPSBnZXRTdWJJbkRpcnMoY2xvc2VkLCBkaXJzWzBdKTtcclxuICByZXR1cm4gY2xvc2VkU3ViO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPYnNHcmFwaCgpOiBNdWx0aUdyYXBoIHtcclxuICBjb25zdCBPYnNHID0gbmV3IE11bHRpR3JhcGgoKTtcclxuICBjb25zdCB7IHJlc29sdmVkTGlua3MsIHVucmVzb2x2ZWRMaW5rcyB9ID0gYXBwLm1ldGFkYXRhQ2FjaGU7XHJcblxyXG4gIGZvciAoY29uc3Qgc291cmNlIGluIHJlc29sdmVkTGlua3MpIHtcclxuICAgIGlmICghc291cmNlLmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgIGNvbnN0IHNvdXJjZUJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChzb3VyY2UpO1xyXG4gICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbc291cmNlQmFzZV0pO1xyXG5cclxuICAgIGZvciAoY29uc3QgZGVzdCBpbiByZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgaWYgKCFkZXN0LmVuZHNXaXRoKFwiLm1kXCIpKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9yIChjb25zdCBzb3VyY2UgaW4gdW5yZXNvbHZlZExpbmtzKSB7XHJcbiAgICBjb25zdCBzb3VyY2VCYXNlID0gZ2V0QmFzZUZyb21NRFBhdGgoc291cmNlKTtcclxuICAgIGFkZE5vZGVzSWZOb3QoT2JzRywgW3NvdXJjZUJhc2VdKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGRlc3QgaW4gdW5yZXNvbHZlZExpbmtzW3NvdXJjZV0pIHtcclxuICAgICAgY29uc3QgZGVzdEJhc2UgPSBnZXRCYXNlRnJvbU1EUGF0aChkZXN0KTtcclxuICAgICAgYWRkTm9kZXNJZk5vdChPYnNHLCBbZGVzdEJhc2VdKTtcclxuICAgICAgaWYgKHNvdXJjZUJhc2UgPT09IGRlc3RCYXNlKSBjb250aW51ZTtcclxuICAgICAgT2JzRy5hZGRFZGdlKHNvdXJjZUJhc2UsIGRlc3RCYXNlLCB7IHJlc29sdmVkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluZm8oeyBPYnNHIH0pO1xyXG4gIHJldHVybiBPYnNHO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVNYWluKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoLFxyXG4gIHNvdXJjZTogc3RyaW5nLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgdGFyZ2V0OiBzdHJpbmcsXHJcbiAgc291cmNlT3JkZXI6IG51bWJlcixcclxuICB0YXJnZXRPcmRlcjogbnVtYmVyLFxyXG4gIGZpbGxPcHAgPSBmYWxzZVxyXG4pOiB2b2lkIHtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZGlyID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpLmZpZWxkRGlyO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbc291cmNlXSwge1xyXG4gICAgb3JkZXI6IHNvdXJjZU9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGROb2Rlc0lmTm90KG1haW5HLCBbdGFyZ2V0XSwge1xyXG4gICAgb3JkZXI6IHRhcmdldE9yZGVyLFxyXG4gIH0pO1xyXG5cclxuICBhZGRFZGdlSWZOb3QobWFpbkcsIHNvdXJjZSwgdGFyZ2V0LCB7XHJcbiAgICBkaXIsXHJcbiAgICBmaWVsZCxcclxuICB9KTtcclxuICBpZiAoZmlsbE9wcCkge1xyXG4gICAgYWRkRWRnZUlmTm90KG1haW5HLCB0YXJnZXQsIHNvdXJjZSwge1xyXG4gICAgICBkaXI6IGdldE9wcERpcihkaXIpLFxyXG4gICAgICBmaWVsZDogZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIGRpcilbMF0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRPcmRlciA9IChmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSwgdGFyZ2V0OiBzdHJpbmcpID0+XHJcbiAgcGFyc2VJbnQoXHJcbiAgICAoZnJvbnRtcy5maW5kKChmZikgPT4gZmY/LmZpbGU/LmJhc2VuYW1lID09PSB0YXJnZXQpPy5bXHJcbiAgICAgIEJDX09SREVSXHJcbiAgICBdIGFzIHN0cmluZykgPz8gXCI5OTk5XCJcclxuICApO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZU9yZGVyID0gKGZyb250bTogZHZGcm9udG1hdHRlckNhY2hlKSA9PlxyXG4gIHBhcnNlSW50KChmcm9udG1bQkNfT1JERVJdIGFzIHN0cmluZykgPz8gXCI5OTk5XCIpO1xyXG5cclxuLyoqIFJlbWVtYmVyIHRvIGZpbHRlciBieSBoaWVyYXJjaHkgaW4gTWF0cml4VmlldyEgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlYWxuSW1wbGllZChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGN1cnJOb2RlOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zID0gbnVsbFxyXG4pOiBSZWFsTkltcGxpZWQge1xyXG4gIGNvbnN0IHJlYWxzbkltcGxpZWRzOiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGNsb3NlZEcgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmICghY2xvc2VkRy5oYXNOb2RlKGN1cnJOb2RlKSkgcmV0dXJuIHJlYWxzbkltcGxpZWRzO1xyXG4gIGNsb3NlZEcuZm9yRWFjaEVkZ2UoY3Vyck5vZGUsIChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkLCBkaXI6IGVkZ2VEaXIsIGltcGxpZWQgfSA9IGEgYXMgRWRnZUF0dHI7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBlZGdlRGlyKVswXTtcclxuXHJcbiAgICAoZGlyID8gW2RpciwgZ2V0T3BwRGlyKGRpcildIDogRElSRUNUSU9OUykuZm9yRWFjaChcclxuICAgICAgKGN1cnJEaXI6IERpcmVjdGlvbnMpID0+IHtcclxuICAgICAgICBjb25zdCBvcHBEaXIgPSBnZXRPcHBEaXIoY3VyckRpcik7XHJcbiAgICAgICAgLy8gUmVhbHNcclxuICAgICAgICBpZiAocyA9PT0gY3Vyck5vZGUgJiYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSkge1xyXG4gICAgICAgICAgY29uc3QgYXJyID0gcmVhbHNuSW1wbGllZHNbZWRnZURpcl0ucmVhbHM7XHJcbiAgICAgICAgICBpZiAoYXJyLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS50byA9PT0gdCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIGFyci5wdXNoKHsgdG86IHQsIGZpZWxkLCBpbXBsaWVkIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJbXBsaWVkc1xyXG4gICAgICAgIC8vIElmIGBzICE9PSBjdXJyTm9kZWAgdGhlbiBgdGAgbXVzdCBiZVxyXG4gICAgICAgIGVsc2UgaWYgKGVkZ2VEaXIgPT09IGN1cnJEaXIgfHwgZWRnZURpciA9PT0gb3BwRGlyKSB7XHJcbiAgICAgICAgICBjb25zdCBhcnIgPSByZWFsc25JbXBsaWVkc1tnZXRPcHBEaXIoZWRnZURpcildLmltcGxpZWRzO1xyXG4gICAgICAgICAgaWYgKGFyci5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udG8gPT09IHMpID09PSAtMSkge1xyXG4gICAgICAgICAgICBhcnIucHVzaCh7XHJcbiAgICAgICAgICAgICAgdG86IHMsXHJcbiAgICAgICAgICAgICAgZmllbGQ6IG9wcEZpZWxkLFxyXG4gICAgICAgICAgICAgIGltcGxpZWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9KTtcclxuICByZXR1cm4gcmVhbHNuSW1wbGllZHM7XHJcbn1cclxuIiwgImltcG9ydCB7IEFSUk9XX0RJUkVDVElPTlMsIERJUkVDVElPTlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucywgVXNlckhpZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuLyoqXHJcbiAqIEdldCBhbGwgdGhlIGZpZWxkcyBpbiBgZGlyYC5cclxuICogUmV0dXJucyBhbGwgZmllbGRzIGlmIGBkaXIgPT09ICdhbGwnYFxyXG4gKiBAcGFyYW0gIHtVc2VySGllcltdfSB1c2VySGllcnNcclxuICogQHBhcmFtICB7RGlyZWN0aW9uc3xcImFsbFwifSBkaXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGRpcjogRGlyZWN0aW9ucyB8IFwiYWxsXCIgPSBcImFsbFwiXHJcbikge1xyXG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgaWYgKGRpciA9PT0gXCJhbGxcIikge1xyXG4gICAgICBESVJFQ1RJT05TLmZvckVhY2goKGVhY2hEaXIpID0+IHtcclxuICAgICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2VhY2hEaXJdKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWVsZHMucHVzaCguLi5oaWVyW2Rpcl0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBmaWVsZHM7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcHBEaXIgPSAoZGlyOiBEaXJlY3Rpb25zKTogRGlyZWN0aW9ucyA9PiB7XHJcbiAgc3dpdGNoIChkaXIpIHtcclxuICAgIGNhc2UgXCJ1cFwiOlxyXG4gICAgICByZXR1cm4gXCJkb3duXCI7XHJcbiAgICBjYXNlIFwiZG93blwiOlxyXG4gICAgICByZXR1cm4gXCJ1cFwiO1xyXG4gICAgY2FzZSBcInNhbWVcIjpcclxuICAgICAgcmV0dXJuIFwic2FtZVwiO1xyXG4gICAgY2FzZSBcIm5leHRcIjpcclxuICAgICAgcmV0dXJuIFwicHJldlwiO1xyXG4gICAgY2FzZSBcInByZXZcIjpcclxuICAgICAgcmV0dXJuIFwibmV4dFwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiAgR2V0IHRoZSBoaWVyYXJjaHkgYW5kIGRpcmVjdGlvbiB0aGF0IGBmaWVsZGAgaXMgaW5cclxuICogKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkSW5mbyh1c2VySGllcnM6IFVzZXJIaWVyW10sIGZpZWxkOiBzdHJpbmcpIHtcclxuICBsZXQgZmllbGREaXI6IERpcmVjdGlvbnM7XHJcbiAgbGV0IGZpZWxkSGllcjogVXNlckhpZXI7XHJcblxyXG4gIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyOiBEaXJlY3Rpb25zKSA9PiB7XHJcbiAgICB1c2VySGllcnMuZm9yRWFjaCgoaGllcikgPT4ge1xyXG4gICAgICBpZiAoaGllcltkaXJdLmluY2x1ZGVzKGZpZWxkKSkge1xyXG4gICAgICAgIGZpZWxkRGlyID0gZGlyO1xyXG4gICAgICAgIGZpZWxkSGllciA9IGhpZXI7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxuICByZXR1cm4geyBmaWVsZEhpZXIsIGZpZWxkRGlyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRPcHBGaWVsZHMoXHJcbiAgdXNlckhpZXJzOiBVc2VySGllcltdLFxyXG4gIGZpZWxkOiBzdHJpbmcsXHJcbiAgZGlyOiBEaXJlY3Rpb25zXHJcbikge1xyXG4gIC8vIElmIHRoZSBmaWVsZCBlbmRzIHdpdGggYD5gLCBpdCBpcyBhbHJlYWR5IHRoZSBvcHBvc2l0ZSBmaWVsZCB3ZSBuZWVkIChjb21pbmcgZnJvbSBgZ2V0T3BwRmFsbGJhY2tgKVxyXG4gIGlmIChmaWVsZC5lbmRzV2l0aChcIj5cIikpIHJldHVybiBbZmllbGQuc2xpY2UoMCwgLTQpXTtcclxuXHJcbiAgY29uc3Qgb3BwRmllbGRzID0gW2ZhbGxiYWNrT3BwRmllbGQoZmllbGQsIGRpcildO1xyXG4gIGNvbnN0IHsgZmllbGRIaWVyLCBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpO1xyXG4gIGlmICghZmllbGRIaWVyIHx8ICFmaWVsZERpcikgcmV0dXJuIG9wcEZpZWxkcztcclxuXHJcbiAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGZpZWxkRGlyKTtcclxuICBvcHBGaWVsZHMudW5zaGlmdCguLi5maWVsZEhpZXJbb3BwRGlyXSk7XHJcbiAgcmV0dXJuIG9wcEZpZWxkcztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGhpZXJUb1N0ciA9IChoaWVyOiBVc2VySGllcikgPT5cclxuICBESVJFQ1RJT05TLm1hcChcclxuICAgIChkaXIpID0+IGAke0FSUk9XX0RJUkVDVElPTlNbZGlyXX06ICR7aGllcltkaXJdLmpvaW4oXCIsIFwiKX1gXHJcbiAgKS5qb2luKFwiXFxuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZhbGxiYWNrRmllbGQgPSAoZmllbGQ6IHN0cmluZywgZGlyOiBEaXJlY3Rpb25zKSA9PlxyXG4gIGAke2ZpZWxkfSA8JHtBUlJPV19ESVJFQ1RJT05TW2Rpcl19PmA7XHJcbmV4cG9ydCBjb25zdCBmYWxsYmFja09wcEZpZWxkID0gKGZpZWxkOiBzdHJpbmcsIGRpcjogRGlyZWN0aW9ucykgPT5cclxuICBgJHtmaWVsZH0gPCR7QVJST1dfRElSRUNUSU9OU1tnZXRPcHBEaXIoZGlyKV19PmA7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUhpZXJzKFxyXG4gIHVzZXJIaWVyczogVXNlckhpZXJbXSxcclxuICBmbjogKGhpZXI6IFVzZXJIaWVyLCBkaXI6IERpcmVjdGlvbnMsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcclxuKSB7XHJcbiAgdXNlckhpZXJzLmZvckVhY2goKGhpZXIpID0+IHtcclxuICAgIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyKSA9PiB7XHJcbiAgICAgIGhpZXJbZGlyXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgIGZuKGhpZXIsIGRpciwgZmllbGQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgeyBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7XHJcbiAgRnJvbnRNYXR0ZXJDYWNoZSxcclxuICBwYXJzZVlhbWwsXHJcbiAgc3RyaW5naWZ5WWFtbCxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBpc0luVmF1bHQsXHJcbiAgd2FpdCxcclxuICB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyxcclxufSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgTWV0YWVkaXRBcGkgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi9nZW5lcmFsVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRTZXR0aW5ncyA9ICgpID0+IGFwcC5wbHVnaW5zLnBsdWdpbnMuYnJlYWRjcnVtYnMuc2V0dGluZ3NcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyRmlsZSA9ICgpOiBURmlsZSB8IG51bGwgPT4gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClcclxuXHJcbi8qKlxyXG4gKiBHZXQgYmFzZW5hbWUgZnJvbSBhICoqTWFya2Rvd24qKiBgcGF0aGBcclxuICogQHBhcmFtICB7c3RyaW5nfSBwYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0QmFzZUZyb21NRFBhdGggPSAocGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3Qgc3BsaXRTbGFzaCA9IHBhdGguc3BsaXQoXCIvXCIpLmxhc3QoKTtcclxuICBpZiAoc3BsaXRTbGFzaC5lbmRzV2l0aChcIi5tZFwiKSkge1xyXG4gICAgcmV0dXJuIHNwbGl0U2xhc2guc3BsaXQoXCIubWRcIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG4gIH0gZWxzZSByZXR1cm4gc3BsaXRTbGFzaDtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREVkJhc2VuYW1lID0gKGZpbGU6IFRGaWxlKSA9PiBmaWxlLmJhc2VuYW1lIHx8IGZpbGUubmFtZTtcclxuZXhwb3J0IGNvbnN0IGdldEZvbGRlck5hbWUgPSAoZmlsZTogVEZpbGUpOiBzdHJpbmcgPT5cclxuICAvL0B0cy1pZ25vcmVcclxuICBmaWxlPy5wYXJlbnQ/Lm5hbWUgfHwgZmlsZS5mb2xkZXI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVdpa2koc3RyOiBzdHJpbmcsIHdpa2lRID0gdHJ1ZSkge1xyXG4gIGxldCBjb3B5ID0gc3RyLnNsaWNlKCk7XHJcbiAgaWYgKHdpa2lRKSB7XHJcbiAgICBjb3B5ID0gXCJbW1wiICsgY29weTtcclxuICAgIGNvcHkgKz0gXCJdXVwiO1xyXG4gIH1cclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRyb3BXaWtpbGlua3Moc3RyOiBzdHJpbmcpIHtcclxuICBsZXQgY29weSA9IHN0ci5zbGljZSgpO1xyXG4gIGlmIChjb3B5LnN0YXJ0c1dpdGgoXCJbW1wiKSAmJiBjb3B5LmVuZHNXaXRoKFwiXV1cIikpIGNvcHkgPSBjb3B5LnNsaWNlKDIsIC0yKTtcclxuICByZXR1cm4gY29weTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZHMgb3IgdXBkYXRlcyB0aGUgZ2l2ZW4geWFtbCBga2V5YCB0byBgdmFsdWVgIGluIHRoZSBnaXZlbiBURmlsZVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGtleVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlXHJcbiAqIEBwYXJhbSAge1RGaWxlfSBmaWxlXHJcbiAqIEBwYXJhbSAge0Zyb250TWF0dGVyQ2FjaGV8dW5kZWZpbmVkfSBmcm9udG1hdHRlclxyXG4gKiBAcGFyYW0gIHtNZXRhZWRpdEFwaX0gYXBpXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3JlYXRlT3JVcGRhdGVZYW1sID0gYXN5bmMgKFxyXG4gIGtleTogc3RyaW5nLFxyXG4gIHZhbHVlOiBzdHJpbmcsXHJcbiAgZmlsZTogVEZpbGUsXHJcbiAgZnJvbnRtYXR0ZXI6IEZyb250TWF0dGVyQ2FjaGUgfCB1bmRlZmluZWQsXHJcbiAgYXBpOiBNZXRhZWRpdEFwaVxyXG4pID0+IHtcclxuICBjb25zdCB2YWx1ZVN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcblxyXG4gIGlmICghZnJvbnRtYXR0ZXIgfHwgZnJvbnRtYXR0ZXJba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICBpbmZvKGBDcmVhdGluZzogJHtrZXl9OiAke3ZhbHVlU3RyfWApO1xyXG4gICAgYXdhaXQgYXBpLmNyZWF0ZVlhbWxQcm9wZXJ0eShrZXksIGBbJyR7dmFsdWVTdHJ9J11gLCBmaWxlKTtcclxuICB9IGVsc2UgaWYgKFsuLi5bZnJvbnRtYXR0ZXJba2V5XV1dLmZsYXQoMykuc29tZSgodmFsKSA9PiB2YWwgPT0gdmFsdWVTdHIpKSB7XHJcbiAgICBpbmZvKFwiQWxyZWFkeSBFeGlzdHMhXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvbGRWYWx1ZUZsYXQ6IHN0cmluZ1tdID0gWy4uLltmcm9udG1hdHRlcltrZXldXV0uZmxhdCg0KTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gWy4uLm9sZFZhbHVlRmxhdCwgYCcke3ZhbHVlU3RyfSdgXTtcclxuICAgIGluZm8oYFVwZGF0aW5nOiAke2tleX06ICR7bmV3VmFsdWV9YCk7XHJcbiAgICBhd2FpdCBhcGkudXBkYXRlKGtleSwgYFske25ld1ZhbHVlLmpvaW4oXCIsIFwiKX1dYCwgZmlsZSk7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVlhbWwoeWFtbDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICh5YW1sID09PSBcIlwiKSB7XHJcbiAgICByZXR1cm4gYCR7a2V5fTogWycke25ld1ZhbH0nXWA7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHBhcnNlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHBhcnNlWWFtbCh5YW1sKTtcclxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW2tleV07XHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBwYXJzZWRba2V5XSA9IG5ld1ZhbDtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICE9PSBuZXdWYWwpIHtcclxuICAgICAgcGFyc2VkW2tleV0gPSBbdmFsdWUsIG5ld1ZhbF07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0eXBlb2YgdmFsdWU/LlswXSA9PT0gXCJzdHJpbmdcIiAmJlxyXG4gICAgICB2YWx1ZS5pbmNsdWRlcyAmJlxyXG4gICAgICAhdmFsdWUuaW5jbHVkZXMobmV3VmFsKVxyXG4gICAgKSB7XHJcbiAgICAgIHBhcnNlZFtrZXldID0gWy4uLnZhbHVlLCBuZXdWYWxdO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSBpZiAob3RoZXIgdHlwZXMgb2YgdmFsdWVzLi4uKVxyXG4gICAgcmV0dXJuIHN0cmluZ2lmeVlhbWwocGFyc2VkKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0WWFtbChjb250ZW50OiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcclxuICBpZiAoIWNvbnRlbnQuc3RhcnRzV2l0aChcIi0tLVxcblwiKSkgcmV0dXJuIFtcIlwiLCBjb250ZW50XTtcclxuICBlbHNlIHtcclxuICAgIGNvbnN0IHNwbGl0cyA9IGNvbnRlbnQuc3BsaXQoXCItLS1cIik7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBzcGxpdHMuc2xpY2UoMCwgMikuam9pbihcIi0tLVwiKSArIFwiLS0tXCIsXHJcbiAgICAgIHNwbGl0cy5zbGljZSgyKS5qb2luKFwiLS0tXCIpLFxyXG4gICAgXTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBkcm9wSGFzaCA9ICh0YWc6IHN0cmluZykgPT5cclxuICB0YWcuc3RhcnRzV2l0aChcIiNcIikgPyB0YWcuc2xpY2UoMSkgOiB0YWc7XHJcblxyXG5leHBvcnQgY29uc3QgYWRkSGFzaCA9ICh0YWc6IHN0cmluZykgPT4gKHRhZy5zdGFydHNXaXRoKFwiI1wiKSA/IHRhZyA6IGAjJHt0YWd9YCk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWx0KG5vZGU6IHN0cmluZywgcGx1Z2luOiBCQ1BsdWdpbik6IHN0cmluZyB8IG51bGwge1xyXG4gIGNvbnN0IHsgYWx0TGlua0ZpZWxkcywgc2hvd0FsbEFsaWFzZXMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuICBpZiAoYWx0TGlua0ZpZWxkcy5sZW5ndGgpIHtcclxuICAgIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub2RlLCBcIlwiKTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gICAgICBmb3IgKGNvbnN0IGFsdEZpZWxkIG9mIGFsdExpbmtGaWVsZHMpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG1ldGFkYXRhPy5mcm9udG1hdHRlcj8uW2FsdEZpZWxkXTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJyOiBzdHJpbmdbXSA9XHJcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBzcGxpdEFuZFRyaW0odmFsdWUpIDogdmFsdWU7XHJcbiAgICAgICAgaWYgKHZhbHVlKSByZXR1cm4gc2hvd0FsbEFsaWFzZXMgPyBhcnIuam9pbihcIiwgXCIpIDogYXJyWzBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHJldHVybiBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckNhY2hlKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKFwiZGF0YXZpZXdcIikpIHtcclxuICAgIGxldCBiYXNlbmFtZTogc3RyaW5nO1xyXG4gICAgd2hpbGUgKCFiYXNlbmFtZSB8fCAhYXBwLnBsdWdpbnMucGx1Z2lucy5kYXRhdmlldy5hcGkucGFnZShiYXNlbmFtZSkpIHtcclxuICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBhd2FpdCB3YWl0Rm9yUmVzb2x2ZWRMaW5rcyhhcHApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxpbmtDbGFzcyA9ICh0bzogc3RyaW5nLCByZWFsUSA9IHRydWUpID0+XHJcbiAgYGludGVybmFsLWxpbmsgQkMtTGluayAke2lzSW5WYXVsdCh0bykgPyBcIlwiIDogXCJpcy11bnJlc29sdmVkXCJ9ICR7cmVhbFEgPyBcIlwiIDogXCJCQy1JbXBsaWVkXCJcclxuICB9YDtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXREVkFwaSA9IChwbHVnaW46IEJDUGx1Z2luKSA9PlxyXG4gIGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXc/LmFwaTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZVlhbWwoKTogYm9vbGVhbiB8IG51bGwge1xyXG4gIGNvbnN0IHsgd29ya3NwYWNlLCBtZXRhZGF0YUNhY2hlIH0gPSBhcHA7XHJcbiAgY29uc3QgeyBhY3RpdmVMZWFmIH0gPSB3b3Jrc3BhY2U7XHJcbiAgY29uc3Qge1xyXG4gICAgc3RhdGU6IHsgbW9kZSB9LFxyXG4gIH0gPSBhY3RpdmVMZWFmLmdldFZpZXdTdGF0ZSgpO1xyXG5cclxuICBpZiAobW9kZSAhPT0gXCJzb3VyY2VcIikgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IHsgZWRpdG9yIH0gPSBhY3RpdmVMZWFmLnZpZXc7XHJcblxyXG4gIGNvbnN0IGZpbGUgPSBnZXRDdXJyRmlsZSgpO1xyXG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IG1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xyXG4gIGlmICghZnJvbnRtYXR0ZXIpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBmcm9udG1hdHRlci5wb3NpdGlvbjtcclxuICBjb25zdCBjdXJyT2ZmID0gZWRpdG9yLnBvc1RvT2Zmc2V0KGVkaXRvci5nZXRDdXJzb3IoKSk7XHJcbiAgaWYgKGN1cnJPZmYgPj0gc3RhcnQub2Zmc2V0ICYmIGN1cnJPZmYgPD0gZW5kLm9mZnNldCkgcmV0dXJuIHRydWU7XHJcbiAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbn1cclxuIiwgImltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgZHJvcEhlYWRlck9yQWxpYXMsIHJlZ05GbGFncywgc3BsaXRMaW5rc1JlZ2V4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN1bShhcnI6IG51bWJlcltdKTogbnVtYmVyIHtcclxuICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXNlKGFycjogbnVtYmVyW10pOiBudW1iZXJbXSB7XHJcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uYXJyKTtcclxuICByZXR1cm4gYXJyLm1hcCgoaXRlbSkgPT4gaXRlbSAvIG1heCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc1N1YnNldCA9IDxUPihhcnIxOiBUW10sIGFycjI6IFRbXSk6IGJvb2xlYW4gPT5cclxuICBhcnIxLmV2ZXJ5KCh2YWx1ZSkgPT4gYXJyMi5pbmNsdWRlcyh2YWx1ZSkpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QW5kRHJvcChzdHI6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gKFxyXG4gICAgc3RyXHJcbiAgICAgID8ubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICA/Lm1hcCgobGluaykgPT4gbGluay5tYXRjaChkcm9wSGVhZGVyT3JBbGlhcyk/LlsxXSkgPz8gW11cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZHJvcFBhdGggPSAocGF0aDogc3RyaW5nKSA9PiBwYXRoLnJlcGxhY2UoL14uKlxcLy8sIFwiXCIpO1xyXG5leHBvcnQgY29uc3QgZHJvcERlbmRyb24gPSAocGF0aDogc3RyaW5nLCBzZXR0aW5nczogQkNTZXR0aW5ncykgPT5cclxuICBzZXR0aW5ncy50cmltRGVuZHJvbk5vdGVzXHJcbiAgICA/IHBhdGguc3BsaXQoc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIpLmxhc3QoKVxyXG4gICAgOiBwYXRoO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BQYXRoTkRlbmRyb24gPSAocGF0aDogc3RyaW5nLCBzZXR0aW5nczogQkNTZXR0aW5ncykgPT5cclxuICBkcm9wRGVuZHJvbihkcm9wUGF0aChwYXRoKSwgc2V0dGluZ3MpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRyb3BGb2xkZXIgPSAocGF0aDogc3RyaW5nKSA9PlxyXG4gIHBhdGguc3BsaXQoXCIvXCIpLmxhc3QoKS5zcGxpdChcIi5cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNwbGl0QW5kVHJpbSA9IChmaWVsZHM6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcclxuICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMgPT09IFwiXCIpIHJldHVybiBbXTtcclxuICBlbHNlIHJldHVybiBmaWVsZHMuc3BsaXQoXCIsXCIpLm1hcCgoc3RyKSA9PiBzdHIudHJpbSgpKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBQYWQgYW4gYXJyYXkgd2l0aCBhIGZpbGxlciB2YWx1ZSB0byBhIHNwZWNpZmllZCBsZW5ndGguXHJcbiAqIEBwYXJhbSB7VFtdfSBhcnIgLSBUaGUgYXJyYXkgdG8gcGFkLlxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmluYWxMZW5ndGggLSBUaGUgZmluYWwgbGVuZ3RoIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGxlcj1cIlwiXSAtIFRoZSBmaWxsZXIgdG8gdXNlIGlmIHRoZSBhcnJheSBpcyB0b28gc2hvcnQuXHJcbiAqIEByZXR1cm5zIHsoVCB8IHN0cmluZylbXX0gVGhlIGFycmF5IHdpdGggdGhlIG5ldyB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFkQXJyYXk8VD4oXHJcbiAgYXJyOiBUW10sXHJcbiAgZmluYWxMZW5ndGg6IG51bWJlcixcclxuICBmaWxsZXI6IHN0cmluZyA9IFwiXCJcclxuKTogKFQgfCBzdHJpbmcpW10ge1xyXG4gIGNvbnN0IGNvcHk6IChUIHwgc3RyaW5nKVtdID0gWy4uLmFycl07XHJcbiAgY29uc3QgY3Vyckxlbmd0aCA9IGNvcHkubGVuZ3RoO1xyXG4gIGlmIChjdXJyTGVuZ3RoID4gZmluYWxMZW5ndGgpXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDdXJyZW50IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gZmluYWwgbGVuZ3RoXCIpO1xyXG4gIGVsc2UgaWYgKGN1cnJMZW5ndGggPT09IGZpbmFsTGVuZ3RoKSByZXR1cm4gY29weTtcclxuICBlbHNlIHtcclxuICAgIGZvciAobGV0IGkgPSBjdXJyTGVuZ3RoOyBpIDwgZmluYWxMZW5ndGg7IGkrKykgY29weS5wdXNoKGZpbGxlcik7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0cmFuc3Bvc2UoQSkgcmV0dXJucyB0aGUgdHJhbnNwb3NlIG9mIEEuXHJcbiAqIEBwYXJhbSB7VFtdW119IEEgLSBUaGUgbWF0cml4IHRvIHRyYW5zcG9zZS5cclxuICogQHJldHVybnMge1RbXVtdfSBBIDJEIGFycmF5IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2U8VD4oQTogVFtdW10pOiBUW11bXSB7XHJcbiAgY29uc3QgY29scyA9IEFbMF0ubGVuZ3RoO1xyXG4gIGNvbnN0IEFUOiBUW11bXSA9IFtdO1xyXG5cclxuICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykgQVQucHVzaChBLm1hcCgocm93KSA9PiByb3dbal0pKTtcclxuXHJcbiAgcmV0dXJuIEFUO1xyXG59XHJcblxyXG4vKipcclxuICogR2l2ZW4gYW4gYXJyYXkgb2Ygc3RyaW5ncywgcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMgdGhhdCByZXByZXNlbnQgdGhlIHJ1bnMgb2YgY29uc2VjdXRpdmUgc3RyaW5nc1xyXG4gKiBpbiB0aGUgYXJyYXkuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcnJcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcclxuICpcclxuICogICBgdmFsdWVgOiB0aGUgdmFsdWUgb2YgdGhlIHJ1blxyXG4gKlxyXG4gKiAgIGBmaXJzdGA6IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcnVuXHJcbiAqXHJcbiAqICAgYGxhc3RgOiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgcnVuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcnVucyhcclxuICBhcnI6IHN0cmluZ1tdXHJcbik6IHsgdmFsdWU6IHN0cmluZzsgZmlyc3Q6IG51bWJlcjsgbGFzdDogbnVtYmVyIH1bXSB7XHJcbiAgY29uc3QgcnVuczogeyB2YWx1ZTogc3RyaW5nOyBmaXJzdDogbnVtYmVyOyBsYXN0OiBudW1iZXIgfVtdID0gW107XHJcbiAgbGV0IGkgPSAwO1xyXG4gIHdoaWxlIChpIDwgYXJyLmxlbmd0aCkge1xyXG4gICAgY29uc3QgY3VyclZhbHVlID0gYXJyW2ldO1xyXG4gICAgcnVucy5wdXNoKHsgdmFsdWU6IGN1cnJWYWx1ZSwgZmlyc3Q6IGksIGxhc3Q6IHVuZGVmaW5lZCB9KTtcclxuICAgIHdoaWxlIChjdXJyVmFsdWUgPT09IGFycltpXSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBydW5zLmxhc3QoKS5sYXN0ID0gaSAtIDE7XHJcbiAgfVxyXG4gIHJldHVybiBydW5zO1xyXG59XHJcblxyXG4vLyBTT1VSQ0UgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTk2MDkwOC9wZXJtdXRhdGlvbnMtaW4tamF2YXNjcmlwdFxyXG4vKipcclxuICogR2l2ZW4gYSBwZXJtdXRhdGlvbiwgcmV0dXJuIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMgb2YgdGhhdCBwZXJtdXRhdGlvbi5cclxuICogQHBhcmFtIHBlcm11dGF0aW9uIC0gdGhlIGFycmF5IHRvIGJlIHBlcm11dGVkXHJcbiAqIEByZXR1cm5zIGBbIFsgMSwgMiwgMyBdLCBbIDEsIDMsIDIgXSwgWyAyLCAxLCAzIF0sIFsgMiwgMywgMSBdLCBbIDMsIDEsIDIgXSwgWyAzLCAyLCAxIF0gXWBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwZXJtdXRlKHBlcm11dGF0aW9uOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gIGNvbnN0IGxlbmd0aCA9IHBlcm11dGF0aW9uLmxlbmd0aCxcclxuICAgIHJlc3VsdCA9IFtwZXJtdXRhdGlvbi5zbGljZSgpXSxcclxuICAgIGMgPSBuZXcgQXJyYXkobGVuZ3RoKS5maWxsKDApO1xyXG5cclxuICBsZXQgaSA9IDEsXHJcbiAgICBrOiBudW1iZXIsXHJcbiAgICBwOiBudW1iZXI7XHJcblxyXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XHJcbiAgICBpZiAoY1tpXSA8IGkpIHtcclxuICAgICAgayA9IGkgJSAyICYmIGNbaV07XHJcbiAgICAgIHAgPSBwZXJtdXRhdGlvbltpXTtcclxuICAgICAgcGVybXV0YXRpb25baV0gPSBwZXJtdXRhdGlvbltrXTtcclxuICAgICAgcGVybXV0YXRpb25ba10gPSBwO1xyXG4gICAgICArK2NbaV07XHJcbiAgICAgIGkgPSAxO1xyXG4gICAgICByZXN1bHQucHVzaChwZXJtdXRhdGlvbi5zbGljZSgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNbaV0gPSAwO1xyXG4gICAgICArK2k7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByYW5nZSA9IChuOiBudW1iZXIpID0+IFsuLi5BcnJheShuKS5rZXlzKCldO1xyXG5cclxuLyoqXHJcbiAqIFwiR2l2ZW4gdHdvIGFycmF5cywgcmV0dXJuIHRoZSBlbGVtZW50cyBpbiB0aGUgZmlyc3QgYXJyYXkgdGhhdCBhcmUgbm90IGluIHRoZSBzZWNvbmQgYXJyYXkuXCJcclxuICogQHBhcmFtIHtUW119IEEgLSB0aGUgYXJyYXkgb2YgaXRlbXMgdG8gYmUgZmlsdGVyZWRcclxuICogQHBhcmFtIHtUW119IEIgLSB0aGUgYXJyYXkgb2YgaXRlbXMgdGhhdCBhcmUgbm90IGluIEFcclxuICogQHJldHVybnMge1RbXX0gTm9uZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNvbXBsZW1lbnQgPSA8VD4oQTogVFtdLCBCOiBUW10pID0+XHJcbiAgQS5maWx0ZXIoKGEpID0+ICFCLmluY2x1ZGVzKGEpKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzd2FwSXRlbXM8VD4oaTogbnVtYmVyLCBqOiBudW1iZXIsIGFycjogVFtdKSB7XHJcbiAgY29uc3QgbWF4ID0gYXJyLmxlbmd0aCAtIDE7XHJcbiAgaWYgKGkgPCAwIHx8IGkgPiBtYXggfHwgaiA8IDAgfHwgaiA+IG1heCkgcmV0dXJuIGFycjtcclxuICBjb25zdCB0bXAgPSBhcnJbaV07XHJcbiAgYXJyW2ldID0gYXJyW2pdO1xyXG4gIGFycltqXSA9IHRtcDtcclxuICByZXR1cm4gYXJyO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBhbiBhcnJheS5cclxuICogQHBhcmFtIHtUW119IGFyciAtIFRoZSBhcnJheSB0byBiZSBmaWx0ZXJlZC5cclxuICogQHJldHVybnMge1RbXX0gVGhlIGFycmF5IHdpdGggZHVwbGljYXRlcyByZW1vdmVkLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbW92ZUR1cGxpY2F0ZXMgPSA8VD4oYXJyOiBUW10pID0+IFsuLi5uZXcgU2V0KGFycildO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0clRvUmVnZXgoaW5wdXQ6IHN0cmluZykge1xyXG4gIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2gocmVnTkZsYWdzKTtcclxuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcclxuICBjb25zdCBbLCBpbm5lclJlZ2V4LCBmbGFnc10gPSBtYXRjaDtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGlubmVyUmVnZXgsIGZsYWdzKTtcclxuICAgIHJldHVybiByZWdleDtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICB3YXJuKGUpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBTb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcclxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ2V4KHN0cmluZykge1xyXG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgYWRkRWRnZUlmTm90IH0gZnJvbSBcIi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBCQ19JX0FVTlQsIEJDX0lfQ09VU0lOLCBCQ19JX1BBUkVOVCwgQkNfSV9TSUJMSU5HXzEsIEJDX0lfU0lCTElOR18yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncyB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZmFsbGJhY2tGaWVsZCwgZ2V0RmllbGRJbmZvIH0gZnJvbSBcIi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkU2libGluZ3NGcm9tU2FtZVBhcmVudChnOiBNdWx0aUdyYXBoLCBzZXR0aW5nczogQkNTZXR0aW5ncykge1xyXG4gICAgY29uc3QgeyB1c2VySGllcnMsIHRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nIH0gPSBzZXR0aW5ncztcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgLy8gRmluZCBwYXJlbnRzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyTkF0dHIsIHMsIHBhcmVudE5vZGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJOQXR0ci5kaXIgIT09IFwidXBcIikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBmaWVsZERpciwgZmllbGRIaWVyIH0gPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCBjdXJyTkF0dHIuZmllbGQpO1xyXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9XHJcbiAgICAgICAgICAgICAgICBmaWVsZEhpZXIuc2FtZVswXSA/PyBmYWxsYmFja0ZpZWxkKGN1cnJOQXR0ci5maWVsZCwgZmllbGREaXIpO1xyXG5cclxuICAgICAgICAgICAgLy8gRmluZCB0aGUgY2hpbGRyZW4gb2YgdGhvc2UgcGFyZW50c1xyXG4gICAgICAgICAgICBnLmZvckVhY2hPdXRFZGdlKHBhcmVudE5vZGUsIChrLCBhLCBzLCBpbXBsaWVkU2libGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgY3VycmVudCBub2RlIGlmIHRoZSBzZXR0aW5ncyBzYXkgdG9cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBhLmRpciAhPT0gXCJkb3duXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICAoIXRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nICYmIGltcGxpZWRTaWJsaW5nID09PSBjdXJyTilcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgYWRkRWRnZUlmTm90KGcsIGN1cnJOLCBpbXBsaWVkU2libGluZywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJzYW1lXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9TSUJMSU5HXzEsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNpYmxpbmdzUGFyZW50SXNQYXJlbnQoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHNpYmxpbmdzIG9mIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgIGcuZm9yRWFjaE91dEVkZ2UoY3Vyck4sIChrLCBjdXJyTkF0dHIsIHMsIHNpYmxpbmcpID0+IHtcclxuICAgICAgICAgICAgaWYgKGN1cnJOQXR0ci5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudHMgb2YgdGhvc2Ugc2libGluZ3NcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShzaWJsaW5nLCAoaywgYSwgcywgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRpciwgZmllbGQgfSA9IGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIHBhcmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpcjogXCJ1cFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfUEFSRU5ULFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFRyYW5zaXRpdmUgY2xvc3VyZSBvZiBzaWJsaW5nc1xyXG5leHBvcnQgZnVuY3Rpb24gYWRkU2libGluZ3NGcm9tU2libGluZ3MoZzogTXVsdGlHcmFwaCkgeyB9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQXVudHNVbmNsZXMoZzogTXVsdGlHcmFwaCkge1xyXG4gICAgZy5mb3JFYWNoTm9kZSgoY3Vyck4sIGEpID0+IHtcclxuICAgICAgICAvLyBGaW5kIHBhcmVudHMgb2YgY3VycmVudCBub2RlXHJcbiAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShjdXJyTiwgKGssIGN1cnJFQXR0ciwgcywgcGFyZW50Tm9kZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY3VyckVBdHRyLmRpciAhPT0gXCJ1cFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHNpYmxpbmdzIG9mIHRob3NlIHBhcmVudHNcclxuICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZShwYXJlbnROb2RlLCAoaywgYSwgcywgdW5jbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChhLmRpciAhPT0gXCJzYW1lXCIpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIHVuY2xlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyOiBcInVwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzdGFydGluZyBub2RlJ3MgcGFyZW50IGZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGN1cnJFQXR0ci5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBsaWVkOiBCQ19JX0FVTlQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ291c2lucyhnOiBNdWx0aUdyYXBoKSB7XHJcbiAgICBnLmZvckVhY2hOb2RlKChjdXJyTiwgYSkgPT4ge1xyXG4gICAgICAgIC8vIEZpbmQgcGFyZW50cyBvZiBjdXJyZW50IG5vZGVcclxuICAgICAgICBnLmZvckVhY2hPdXRFZGdlKGN1cnJOLCAoaywgY3VyckVBdHRyLCBzLCBwYXJlbnROb2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyRUF0dHIuZGlyICE9PSBcInVwXCIpIHJldHVybjtcclxuICAgICAgICAgICAgLy8gRmluZCB0aGUgc2libGluZ3Mgb2YgdGhvc2UgcGFyZW50c1xyXG4gICAgICAgICAgICBnLmZvckVhY2hPdXRFZGdlKHBhcmVudE5vZGUsIChrLCBwYXJlbnRTaWJsaW5nQXR0ciwgcywgdW5jbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTaWJsaW5nQXR0ci5kaXIgIT09IFwic2FtZVwiKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgZy5mb3JFYWNoT3V0RWRnZSh1bmNsZSwgKGssIGEsIHMsIGNvdXNpbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmRpciAhPT0gXCJkb3duXCIgfHwgY3Vyck4gPT09IGNvdXNpbikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBhZGRFZGdlSWZOb3QoZywgY3Vyck4sIGNvdXNpbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcGFyZW50U2libGluZ0F0dHIuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWQ6IEJDX0lfQ09VU0lOLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFNpcyAtLT4gTWUgPC0tIEJyb1xyXG4vLyBJbXBsaWVzOiBTaXMgPC0tPiBCcm9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN0cnVjdHVyYWxFcXVpdmFsZW5jZVNpYmxpbmdzKGc6IE11bHRpR3JhcGgpIHtcclxuICAgIGcuZm9yRWFjaE5vZGUoKGN1cnJOLCBhKSA9PiB7XHJcbiAgICAgICAgZy5mb3JFYWNoSW5FZGdlKGN1cnJOLCAoaywgYVNpcywgc2lzLCBfKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhU2lzLmRpciAhPT0gXCJzYW1lXCIpIHJldHVybjtcclxuICAgICAgICAgICAgZy5mb3JFYWNoSW5FZGdlKGN1cnJOLCAoaywgYUJybywgYnJvLCBfKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYUJyby5kaXIgIT09IFwic2FtZVwiIHx8IHNpcyA9PT0gYnJvKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAoYUJyby5maWVsZCA9PT0gYVNpcy5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZEVkZ2VJZk5vdChnLCBzaXMsIGJybywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IFwic2FtZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYUJyby5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZDogQkNfSV9TSUJMSU5HXzIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZHJvcFdpa2lsaW5rcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGFkZEVkZ2VJZk5vdCwgYWRkTm9kZXNJZk5vdCB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q1NWUm93cyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBDU1ZQYXRocyB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG4gIGNvbnN0IENTVlJvd3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIGlmIChDU1ZQYXRocyA9PT0gXCJcIikgcmV0dXJuIENTVlJvd3M7XHJcblxyXG4gIGNvbnN0IGZ1bGxQYXRoID0gbm9ybWFsaXplUGF0aChDU1ZQYXRocyk7XHJcblxyXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5yZWFkKGZ1bGxQYXRoKTtcclxuICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoZWFkKSA9PiBoZWFkLnRyaW0oKSk7XHJcbiAgbGluZXMuc2xpY2UoMSkuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICBjb25zdCByb3dPYmogPSB7fTtcclxuICAgIHJvd1xyXG4gICAgICAuc3BsaXQoXCIsXCIpXHJcbiAgICAgIC5tYXAoKGhlYWQpID0+IGRyb3BXaWtpbGlua3MoaGVhZC50cmltKCkpKVxyXG4gICAgICAuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xyXG4gICAgICAgIHJvd09ialtoZWFkZXJzW2ldXSA9IGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgZGVidWcoeyByb3dPYmogfSk7XHJcbiAgICBDU1ZSb3dzLnB1c2gocm93T2JqKTtcclxuICB9KTtcclxuICByZXR1cm4gQ1NWUm93cztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZENTVkNydW1icyhcclxuICBnOiBNdWx0aUdyYXBoLFxyXG4gIENTVlJvd3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1bXSxcclxuICBkaXI6IERpcmVjdGlvbnMsXHJcbiAgZmllbGQ6IHN0cmluZ1xyXG4pIHtcclxuICBDU1ZSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgYWRkTm9kZXNJZk5vdChnLCBbcm93LmZpbGVdKTtcclxuICAgIGlmIChmaWVsZCA9PT0gXCJcIiB8fCAhcm93W2ZpZWxkXSkgcmV0dXJuO1xyXG5cclxuICAgIGFkZE5vZGVzSWZOb3QoZywgW3Jvd1tmaWVsZF1dKTtcclxuICAgIGFkZEVkZ2VJZk5vdChnLCByb3cuZmlsZSwgcm93W2ZpZWxkXSwgeyBkaXIsIGZpZWxkIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBCQ19EVl9OT1RFLCBCQ19EVl9OT1RFX0ZJRUxELCBCQ19JR05PUkUsIERBVEFWSUVXX01JU1NJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkFwaSwgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF0YXZpZXdOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBlbGlnYWJsZUFsdHM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycywgZGF0YXZpZXdOb3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGR2ID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICBpZiAoIWR2ICYmIGVsaWdhYmxlQWx0cy5sZW5ndGgpIHtcclxuICAgIG5ldyBOb3RpY2UoREFUQVZJRVdfTUlTU0lORyk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IGJhc2VuYW1lID0gZ2V0RFZCYXNlbmFtZShhbHRGaWxlLmZpbGUpO1xyXG5cclxuICAgIGxldCBxdWVyeSA9IGFsdEZpbGVbQkNfRFZfTk9URV0gYXMgKHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xyXG4gICAgaWYgKHF1ZXJ5Lmhhc093blByb3BlcnR5KCdwYXRoJykpIHtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHF1ZXJ5ID0gYFtbJHtxdWVyeS5wYXRofV1dYDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbGV0IGZpZWxkID1cclxuICAgICAgKGFsdEZpbGVbQkNfRFZfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAoZGF0YXZpZXdOb3RlRmllbGQgfHwgZmllbGRzWzBdKTtcclxuXHJcbiAgICBsZXQgdGFyZ2V0czogZHZGcm9udG1hdHRlckNhY2hlW10gPSBbXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRhcmdldHMgPSBkdi5wYWdlcyg8c3RyaW5nPnF1ZXJ5KS52YWx1ZXM7XHJcbiAgICB9IGNhdGNoIChlcikge1xyXG4gICAgICBuZXcgTm90aWNlKGAke3F1ZXJ5fSBpcyBub3QgYSB2YWxpZCBEYXRhdmlldyBmcm9tLXF1ZXJ5YCk7XHJcbiAgICAgIHdhcm4oZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgaWYgKHRhcmdldFtCQ19JR05PUkVdKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgdGFyZ2V0Qk4gPSBnZXREVkJhc2VuYW1lKHRhcmdldC5maWxlKTtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YXJnZXRCTik7XHJcblxyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0Qk4sXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHBvcHVsYXRlTWFpbiB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldERWQmFzZW5hbWUgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgKiBhcyBsdXhvbiBmcm9tIFwibHV4b25cIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREYXRlTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHtcclxuICAgIGFkZERhdGVOb3RlcyxcclxuICAgIGRhdGVOb3RlQWRkTW9udGgsXHJcbiAgICBkYXRlTm90ZUFkZFllYXIsXHJcbiAgICBkYXRlTm90ZUZvcm1hdCxcclxuICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgfSA9IHNldHRpbmdzO1xyXG4gIGlmICghYWRkRGF0ZU5vdGVzKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IHsgcmVnZXggfSA9IGx1eG9uLkRhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKFwiXCIsIGRhdGVOb3RlRm9ybWF0KTtcclxuICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgIGNvbnN0IHsgZmlsZSB9ID0gcGFnZTtcclxuICAgIGNvbnN0IHsgZGF5IH0gPSBmaWxlO1xyXG4gICAgaWYgKCFkYXkgfHwgIXJlZ2V4LnRlc3QoZ2V0RFZCYXNlbmFtZShmaWxlKSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0b2RheSA9IGdldERWQmFzZW5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b21vcnJvdyA9IGRheS5wbHVzKHsgZGF5czogMSB9KTtcclxuICAgIGNvbnN0IHRvbVN0ciA9IHRvbW9ycm93LnRvRm9ybWF0KGRhdGVOb3RlRm9ybWF0KTtcclxuXHJcbiAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgIHNldHRpbmdzLFxyXG4gICAgICBtYWluRyxcclxuICAgICAgdG9kYXksXHJcbiAgICAgIGRhdGVOb3RlRmllbGQsXHJcbiAgICAgIHRvbVN0cixcclxuICAgICAgOTk5OSxcclxuICAgICAgOTk5OSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfSUdOT1JFLCBCQ19JR05PUkVfREVORFJPTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBkdkZyb250bWF0dGVyQ2FjaGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldERlbmRyb25QYXJlbnQgPSAoZGVuZHJvbjogc3RyaW5nLCBzcGxpdHRlcjogc3RyaW5nKSA9PlxyXG4gIGRlbmRyb24uc3BsaXQoc3BsaXR0ZXIpLnNsaWNlKDAsIC0xKS5qb2luKHNwbGl0dGVyKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGREZW5kcm9uTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgYWRkRGVuZHJvbk5vdGVzLCBkZW5kcm9uTm90ZURlbGltaXRlciwgZGVuZHJvbk5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgaWYgKCFhZGREZW5kcm9uTm90ZXMpIHJldHVybjtcclxuXHJcbiAgZm9yIChjb25zdCBmcm9udG0gb2YgZnJvbnRtcykge1xyXG4gICAgaWYgKGZyb250bVtCQ19JR05PUkVfREVORFJPTl0gfHwgZnJvbnRtW0JDX0lHTk9SRV0pIGNvbnRpbnVlO1xyXG5cclxuICAgIGxldCBjdXJyID0gZ2V0RFZCYXNlbmFtZShmcm9udG0uZmlsZSk7XHJcbiAgICBsZXQgcGFyZW50ID0gZ2V0RGVuZHJvblBhcmVudChjdXJyLCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcblxyXG4gICAgd2hpbGUgKHBhcmVudCAhPT0gXCJcIikge1xyXG4gICAgICBjb25zdCBwYXJlbnRGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4gICAgICAgIChmbSkgPT4gZ2V0RFZCYXNlbmFtZShmbS5maWxlKSA9PT0gcGFyZW50XHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyAhcGFyZW50RmlsZSBpbXBsaWVzIGEgXCJzdHViXCJcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAoIXBhcmVudEZpbGUgfHwgcGFyZW50RmlsZVtCQ19JR05PUkVfREVORFJPTl0gIT09IHRydWUpIHtcclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgY3VycixcclxuICAgICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbiAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgOTk5OSxcclxuICAgICAgICAgIHRydWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnIgPSBwYXJlbnQ7XHJcbiAgICAgIHBhcmVudCA9IGdldERlbmRyb25QYXJlbnQocGFyZW50LCBkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBleHBvcnQgZnVuY3Rpb24gYWRkRGVuZHJvbk5vdGVzVG9HcmFwaChcclxuLy8gICBwbHVnaW46IEJDUGx1Z2luLFxyXG4vLyAgIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4vLyAgIG1haW5HOiBNdWx0aUdyYXBoXHJcbi8vICkge1xyXG4vLyAgIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuLy8gICBjb25zdCB7IGFkZERlbmRyb25Ob3RlcywgZGVuZHJvbk5vdGVEZWxpbWl0ZXIsIGRlbmRyb25Ob3RlRmllbGQgfSA9IHNldHRpbmdzO1xyXG4vLyAgIGlmICghYWRkRGVuZHJvbk5vdGVzKSByZXR1cm47XHJcblxyXG4vLyAgIGZvciAoY29uc3QgZnJvbnRtIG9mIGZyb250bXMpIHtcclxuLy8gICAgIGlmIChmcm9udG1bQkNfSUdOT1JFX0RFTkRST05dKSBjb250aW51ZTtcclxuXHJcbi8vICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZnJvbnRtLmZpbGUpO1xyXG5cclxuLy8gICAgIGNvbnN0IHNwbGl0cyA9IGJhc2VuYW1lLnNwbGl0KGRlbmRyb25Ob3RlRGVsaW1pdGVyKTtcclxuLy8gICAgIGlmIChzcGxpdHMubGVuZ3RoIDw9IDEpIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IG5leHRTbGljZSA9IHNwbGl0cy5zbGljZSgwLCAtMSkuam9pbihkZW5kcm9uTm90ZURlbGltaXRlcik7XHJcbi8vICAgICBpZiAoIW5leHRTbGljZSkgY29udGludWU7XHJcbi8vICAgICBjb25zdCBuZXh0U2xpY2VGaWxlID0gZnJvbnRtcy5maW5kKFxyXG4vLyAgICAgICAoZm0pID0+IGdldERWQmFzZW5hbWUoZm0uZmlsZSkgPT09IG5leHRTbGljZVxyXG4vLyAgICAgKTtcclxuXHJcbi8vICAgICBpZiAoIW5leHRTbGljZUZpbGUgfHwgbmV4dFNsaWNlRmlsZVtCQ19JR05PUkVfREVORFJPTl0pIGNvbnRpbnVlO1xyXG5cclxuLy8gICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gZ2V0U291cmNlT3JkZXIoZnJvbnRtKTtcclxuLy8gICAgIGNvbnN0IHRhcmdldE9yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbmV4dFNsaWNlKTtcclxuXHJcbi8vICAgICBwb3B1bGF0ZU1haW4oXHJcbi8vICAgICAgIHNldHRpbmdzLFxyXG4vLyAgICAgICBtYWluRyxcclxuLy8gICAgICAgYmFzZW5hbWUsXHJcbi8vICAgICAgIGRlbmRyb25Ob3RlRmllbGQsXHJcbi8vICAgICAgIG5leHRTbGljZSxcclxuLy8gICAgICAgc291cmNlT3JkZXIsXHJcbi8vICAgICAgIHRhcmdldE9yZGVyLFxyXG4vLyAgICAgICB0cnVlXHJcbi8vICAgICApO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgVEZpbGUsIFRGb2xkZXIgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHtcclxuICBCQ19GT0xERVJfTk9URSxcclxuICBCQ19GT0xERVJfTk9URV9SRUNVUlNJVkUsXHJcbiAgQkNfRk9MREVSX05PVEVfU1VCRk9MREVSUyxcclxuICBCQ19JR05PUkUsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSwgZ2V0Rm9sZGVyTmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5jb25zdCBnZXRTdWJzRnJvbUZvbGRlciA9IChmb2xkZXI6IFRGb2xkZXIpID0+IHtcclxuICBjb25zdCBvdGhlck5vdGVzOiBURmlsZVtdID0gW10sXHJcbiAgICBzdWJGb2xkZXJzOiBURm9sZGVyW10gPSBbXTtcclxuICBmb2xkZXIuY2hpbGRyZW4uZm9yRWFjaCgodEFic3RyYWN0KSA9PiB7XHJcbiAgICBpZiAodEFic3RyYWN0IGluc3RhbmNlb2YgVEZpbGUpIG90aGVyTm90ZXMucHVzaCh0QWJzdHJhY3QpO1xyXG4gICAgZWxzZSBzdWJGb2xkZXJzLnB1c2godEFic3RyYWN0IGFzIFRGb2xkZXIpO1xyXG4gIH0pO1xyXG4gIHJldHVybiB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRGb2xkZXJOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBmb2xkZXJOb3RlczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgZm9sZGVyTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3QgdG9wRm9sZGVyTmFtZSA9IGdldEZvbGRlck5hbWUoZmlsZSk7XHJcbiAgICBjb25zdCB0b3BGb2xkZXIgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRvcEZvbGRlck5hbWUpIGFzIFRGb2xkZXI7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoXHJcbiAgICAgICAgKG90aGVyKSA9PlxyXG4gICAgICAgICAgZ2V0Rm9sZGVyTmFtZShvdGhlcikgPT09IHRvcEZvbGRlck5hbWUgJiYgb3RoZXIucGF0aCAhPT0gZmlsZS5wYXRoICYmICFvdGhlcltCQ19JR05PUkVdXHJcbiAgICAgIClcclxuICAgICAgLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICBjb25zdCBmaWVsZCA9IGFsdEZpbGVbQkNfRk9MREVSX05PVEVdIGFzIHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgZmllbGQgIT09IFwic3RyaW5nXCIgfHwgIWZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpIHJldHVybjtcclxuXHJcbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xyXG4gICAgICAvLyBUaGlzIGlzIGdldHRpbmcgdGhlIG9yZGVyIG9mIHRoZSBmb2xkZXIgbm90ZSwgbm90IHRoZSBzb3VyY2UgcG9pbnRpbmcgdXAgdG8gaXRcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICBtYWluRyxcclxuICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICBmaWVsZCxcclxuICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgc291cmNlT3JkZXIsXHJcbiAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgdHJ1ZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfU1VCRk9MREVSU10pIHtcclxuICAgICAgY29uc3Qgc3ViZm9sZGVyRmllbGQgPSBhbHRGaWxlW0JDX0ZPTERFUl9OT1RFX1NVQkZPTERFUlNdIGFzIHN0cmluZztcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiBzdWJmb2xkZXJGaWVsZCAhPT0gXCJzdHJpbmdcIiB8fFxyXG4gICAgICAgICFmaWVsZHMuaW5jbHVkZXMoc3ViZm9sZGVyRmllbGQpXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcblxyXG4gICAgICBzdWJGb2xkZXJzLmZvckVhY2goKHN1YkZvbGRlcikgPT4ge1xyXG4gICAgICAgIHN1YkZvbGRlci5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoY2hpbGQpO1xyXG5cclxuICAgICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgICAgIGJhc2VuYW1lLFxyXG4gICAgICAgICAgICAgIHN1YmZvbGRlckZpZWxkLFxyXG4gICAgICAgICAgICAgIGNoaWxkQmFzZW5hbWUsXHJcbiAgICAgICAgICAgICAgOTk5OSxcclxuICAgICAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFsdEZpbGVbQkNfRk9MREVSX05PVEVfUkVDVVJTSVZFXSkge1xyXG4gICAgICBjb25zdCB7IHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKHRvcEZvbGRlcik7XHJcbiAgICAgIGNvbnN0IGZvbGRlclF1ZXVlOiBURm9sZGVyW10gPSBbLi4uc3ViRm9sZGVyc107XHJcblxyXG4gICAgICBsZXQgY3VyckZvbGRlciA9IGZvbGRlclF1ZXVlLnNoaWZ0KCk7XHJcbiAgICAgIHdoaWxlIChjdXJyRm9sZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCB7IG90aGVyTm90ZXMsIHN1YkZvbGRlcnMgfSA9IGdldFN1YnNGcm9tRm9sZGVyKGN1cnJGb2xkZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb2xkZXJOb3RlID0gY3VyckZvbGRlci5uYW1lO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBvdGhlck5vdGVzLm1hcChnZXREVkJhc2VuYW1lKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKCFpc0luVmF1bHQoIGZvbGRlck5vdGUsIGZvbGRlck5vdGUpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSA5OTk5OyAvLyBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudEZvbGRlck5vdGUgPSBjdXJyRm9sZGVyLnBhcmVudC5uYW1lO1xyXG5cclxuICAgICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgIG1haW5HLFxyXG4gICAgICAgICAgcGFyZW50Rm9sZGVyTm90ZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgZm9sZGVyTm90ZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0T3JkZXIsXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IGZvbGRlck5vdGUpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IHNvdXJjZU9yZGVyID0gOTk5OTsgLy8gZ2V0U291cmNlT3JkZXIoYWx0RmlsZSk7XHJcbiAgICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IDk5OTk7IC8vICBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgICAgICBzZXR0aW5ncyxcclxuICAgICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICAgIGZvbGRlck5vdGUsXHJcbiAgICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9sZGVyUXVldWUucHVzaCguLi5zdWJGb2xkZXJzKTtcclxuICAgICAgICBjdXJyRm9sZGVyID0gZm9sZGVyUXVldWUuc2hpZnQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpcnN0IGFkZCBvdGhlck5vdGVzIHRvIGdyYXBoXHJcblxyXG4gICAgLy8gVGhlbiBpdGVyYXRlIHN1YkZvbGRlcnMgZG9pbmcgdGhlIHNhbWVcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lLCBnZXRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncywgSGllcmFyY2h5Tm90ZUl0ZW0gfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBhZGRFZGdlSWZOb3QsIGFkZE5vZGVzSWZOb3QgfSBmcm9tIFwiLi4vLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcywgZ2V0T3BwRGlyLCBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGllcmFyY2h5Tm90ZUl0ZW1zKGZpbGU6IFRGaWxlKSB7XHJcbiAgY29uc3QgeyBsaXN0SXRlbXMgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICBpZiAoIWxpc3RJdGVtcykgcmV0dXJuIFtdO1xyXG5cclxuICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUoZmlsZSlcclxuICBjb25zdCB7IGhpZXJhcmNoeU5vdGVJc1BhcmVudCB9ID0gZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgY29uc3QgbGluZXMgPSAoYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkpLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICBjb25zdCBoaWVyYXJjaHlOb3RlSXRlbXM6IEhpZXJhcmNoeU5vdGVJdGVtW10gPSBbXTtcclxuXHJcbiAgY29uc3QgYWZ0ZXJCdWxsZXRSZWcgPSBuZXcgUmVnRXhwKC9cXHMqWysqLV1cXHMoLiokKS8pO1xyXG4gIGNvbnN0IGRyb3BXaWtpTGlua3NSZWcgPSBuZXcgUmVnRXhwKC9cXFtcXFsoLio/KVxcXVxcXS8pO1xyXG4gIGNvbnN0IGZpZWxkUmVnID0gbmV3IFJlZ0V4cCgvKC4qPylcXFtcXFsuKj9cXF1cXF0vKTtcclxuXHJcbiAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3RJdGVtcykge1xyXG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2l0ZW0ucG9zaXRpb24uc3RhcnQubGluZV07XHJcblxyXG4gICAgY29uc3QgYWZ0ZXJCdWxsZXRDdXJyID0gYWZ0ZXJCdWxsZXRSZWcuZXhlYyhsaW5lKVsxXTtcclxuICAgIGNvbnN0IG5vdGUgPSBkcm9wV2lraUxpbmtzUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXTtcclxuICAgIGxldCBmaWVsZCA9IGZpZWxkUmVnLmV4ZWMoYWZ0ZXJCdWxsZXRDdXJyKVsxXS50cmltKCkgfHwgbnVsbDtcclxuXHJcbiAgICBjb25zdCB7IHBhcmVudCB9ID0gaXRlbTtcclxuICAgIGlmIChwYXJlbnQgPj0gMCkge1xyXG4gICAgICBjb25zdCBwYXJlbnROb3RlID0gbGluZXNbcGFyZW50XTtcclxuICAgICAgY29uc3QgYWZ0ZXJCdWxsZXRQYXJlbnQgPSBhZnRlckJ1bGxldFJlZy5leGVjKHBhcmVudE5vdGUpWzFdO1xyXG4gICAgICBjb25zdCBkcm9wV2lraVBhcmVudCA9IGRyb3BXaWtpTGlua3NSZWcuZXhlYyhhZnRlckJ1bGxldFBhcmVudClbMV07XHJcblxyXG4gICAgICBoaWVyYXJjaHlOb3RlSXRlbXMucHVzaCh7XHJcbiAgICAgICAgbm90ZSxcclxuICAgICAgICBwYXJlbnQ6IGRyb3BXaWtpUGFyZW50LFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGhpZXJhcmNoeU5vdGVJdGVtcy5wdXNoKHtcclxuICAgICAgICBub3RlLFxyXG4gICAgICAgIHBhcmVudDogaGllcmFyY2h5Tm90ZUlzUGFyZW50ID8gYmFzZW5hbWUgOiBudWxsLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGhpZXJhcmNoeU5vdGVJdGVtcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhOc1RvR3JhcGgoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgaG5BcnI6IEhpZXJhcmNoeU5vdGVJdGVtW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBITlVwRmllbGQsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgdXBGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzLCBcInVwXCIpO1xyXG5cclxuICBobkFyci5mb3JFYWNoKChobkl0ZW0sIGkpID0+IHtcclxuICAgIGNvbnN0IHsgbm90ZSwgZmllbGQsIHBhcmVudCB9ID0gaG5JdGVtO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldEZpZWxkID0gZmllbGQgPz8gKEhOVXBGaWVsZCB8fCB1cEZpZWxkc1swXSk7XHJcbiAgICBjb25zdCBkaXIgPSBnZXRGaWVsZEluZm8odXNlckhpZXJzLCB0YXJnZXRGaWVsZCk/LmZpZWxkRGlyO1xyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIHRhcmdldEZpZWxkLCBkaXIpWzBdO1xyXG5cclxuICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgY29uc3QgcyA9IG5vdGU7XHJcbiAgICAgIGNvbnN0IHQgPSBobkFycltpICsgMV0/Lm5vdGU7XHJcblxyXG4gICAgICBhZGROb2Rlc0lmTm90KG1haW5HLCBbcywgdF0pO1xyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHMsIHQsIHsgZGlyOiBvcHBEaXIsIGZpZWxkOiBvcHBGaWVsZCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkZE5vZGVzSWZOb3QobWFpbkcsIFtub3RlLCBwYXJlbnRdKTtcclxuICAgICAgaWYgKHNldHRpbmdzLnNob3dVcEluSnVnZ2wpIHtcclxuICAgICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIG5vdGUsIHBhcmVudCwge1xyXG4gICAgICAgICAgZGlyLFxyXG4gICAgICAgICAgZmllbGQ6IHRhcmdldEZpZWxkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhZGRFZGdlSWZOb3QobWFpbkcsIHBhcmVudCwgbm90ZSwge1xyXG4gICAgICAgIGRpcjogb3BwRGlyLFxyXG4gICAgICAgIGZpZWxkOiBvcHBGaWVsZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IHBhcnNlVHlwZWRMaW5rIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IHNwbGl0TGlua3NSZWdleCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBkdkZyb250bWF0dGVyQ2FjaGUsIEp1Z2dsTGluayB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldFRhcmdldE9yZGVyLCBwb3B1bGF0ZU1haW4gfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZEluZm8sIGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbi8vIFRPRE8gSSB0aGluayBpdCdkIGJlIGJldHRlciB0byBkbyB0aGlzIHdob2xlIHRoaW5nIGFzIGFuIG9iaiBpbnN0ZWFkIG9mIEp1Z2dsTGlua1tdXHJcbi8vID0+IHtbbm90ZTogc3RyaW5nXToge3R5cGU6IHN0cmluZywgbGlua3NJbkxpbmU6IHN0cmluZ1tdfVtdfVxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SnVnZ2xMaW5rcyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGZpbGVzOiBURmlsZVtdXHJcbik6IFByb21pc2U8SnVnZ2xMaW5rW10+IHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBkYiB9ID0gcGx1Z2luO1xyXG4gIGRiLnN0YXJ0MkcoXCJnZXRKdWdnbExpbmtzXCIpO1xyXG5cclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIC8vIEFkZCBKdWdnbCBsaW5rc1xyXG4gIGNvbnN0IHR5cGVkTGlua3NBcnI6IEp1Z2dsTGlua1tdID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcclxuICAgICAgY29uc3QganVnZ2xMaW5rOiBKdWdnbExpbmsgPSB7IGZpbGUsIGxpbmtzOiBbXSB9O1xyXG5cclxuICAgICAgLy8gVXNlIE9icyBtZXRhZGF0YWNhY2hlIHRvIGdldCB0aGUgbGlua3MgaW4gdGhlIGN1cnJlbnQgZmlsZVxyXG4gICAgICBjb25zdCBsaW5rcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKT8ubGlua3MgPz8gW107XHJcblxyXG4gICAgICBjb25zdCBjb250ZW50ID0gbGlua3MubGVuZ3RoID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiBcIlwiO1xyXG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGluZU5vID0gbGluay5wb3NpdGlvbi5zdGFydC5saW5lO1xyXG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsaW5lTm9dO1xyXG5cclxuICAgICAgICAvLyBDaGVjayB0aGUgbGluZSBmb3Igd2lraWxpbmtzLCBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGxpbmsuaW5uZXJUZXh0XHJcbiAgICAgICAgY29uc3QgbGlua3NJbkxpbmUgPVxyXG4gICAgICAgICAgbGluZVxyXG4gICAgICAgICAgICAubWF0Y2goc3BsaXRMaW5rc1JlZ2V4KVxyXG4gICAgICAgICAgICA/Lm1hcCgobGluaykgPT4gbGluay5zbGljZSgyLCBsaW5rLmxlbmd0aCAtIDIpKVxyXG4gICAgICAgICAgICA/Lm1hcCgoaW5uZXJUZXh0KSA9PiBpbm5lclRleHQuc3BsaXQoXCJ8XCIpWzBdKSA/PyBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZWRMaW5rUHJlZml4ID1cclxuICAgICAgICAgIGFwcC5wbHVnaW5zLnBsdWdpbnMuanVnZ2w/LnNldHRpbmdzLnR5cGVkTGlua1ByZWZpeCA/PyBcIi1cIjtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyc2VkTGlua3MgPSBwYXJzZVR5cGVkTGluayhsaW5rLCBsaW5lLCB0eXBlZExpbmtQcmVmaXgpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHBhcnNlZExpbmtzPy5wcm9wZXJ0aWVzPy50eXBlID8/IFwiXCI7XHJcbiAgICAgICAgaWYgKGZpZWxkID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgeyBmaWVsZERpciB9ID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpIHx8IHt9O1xyXG4gICAgICAgIGlmICghZmllbGREaXIpIHJldHVybjtcclxuXHJcbiAgICAgICAganVnZ2xMaW5rLmxpbmtzLnB1c2goe1xyXG4gICAgICAgICAgZGlyOiBmaWVsZERpcixcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua3NJbkxpbmUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBjb25zdCBhbGxGaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuXHJcbiAgY29uc3QgZmlsdGVyZWRMaW5rcyA9IHR5cGVkTGlua3NBcnIubWFwKChqdWdnbExpbmspID0+IHtcclxuICAgIC8vIEZpbHRlciBvdXQgbGlua3Mgd2hvc2UgdHlwZSBpcyBub3QgaW4gYWxsRmllbGRzXHJcbiAgICBqdWdnbExpbmsubGlua3MgPSBqdWdnbExpbmsubGlua3MuZmlsdGVyKChsaW5rKSA9PlxyXG4gICAgICBhbGxGaWVsZHMuaW5jbHVkZXMobGluay5maWVsZClcclxuICAgICk7XHJcbiAgICByZXR1cm4ganVnZ2xMaW5rO1xyXG4gIH0pO1xyXG4gIGRiLmVuZDJHKHsgZmlsdGVyZWRMaW5rcyB9KTtcclxuICByZXR1cm4gZmlsdGVyZWRMaW5rcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEp1Z2dsTGlua3NUb0dyYXBoKFxyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzLFxyXG4gIGp1Z2dsTGlua3M6IEp1Z2dsTGlua1tdLFxyXG4gIGZyb250bXM6IGR2RnJvbnRtYXR0ZXJDYWNoZVtdLFxyXG4gIG1haW5HOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGp1Z2dsTGlua3MuZm9yRWFjaCgoanVnZ2xMaW5rKSA9PiB7XHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBqdWdnbExpbmsuZmlsZTtcclxuICAgIGp1Z2dsTGluay5saW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgbGlua3NJbkxpbmUgfSA9IGxpbms7XHJcbiAgICAgIGlmIChkaXIgPT09IFwiXCIpIHJldHVybjtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBiYXNlbmFtZSk7XHJcbiAgICAgIGxpbmtzSW5MaW5lLmZvckVhY2goKGxpbmtJbkxpbmUpID0+IHtcclxuICAgICAgICAvLyBJcyB0aGlzIGEgYnVnPyBXaHkgbm90IGBnZXRTb3VyY2VPcmRlcmA/XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0c09yZGVyID0gZ2V0VGFyZ2V0T3JkZXIoZnJvbnRtcywgbGlua0luTGluZSk7XHJcblxyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgIGZpZWxkLFxyXG4gICAgICAgICAgbGlua0luTGluZSxcclxuICAgICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgICAgdGFyZ2V0c09yZGVyXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgQkNfTElOS19OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0U291cmNlT3JkZXIsXHJcbiAgZ2V0VGFyZ2V0T3JkZXIsXHJcbiAgcG9wdWxhdGVNYWluLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkTGlua05vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuICBjb25zdCBmaWVsZHMgPSBnZXRGaWVsZHModXNlckhpZXJzKTtcclxuICBlbGlnYWJsZUFsdHMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgbGlua05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgbGlua05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUobGlua05vdGVGaWxlKTtcclxuXHJcbiAgICBsZXQgZmllbGQgPSBhbHRGaWxlW0JDX0xJTktfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGxpbmtzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8ubGlua3M/Lm1hcCgobCkgPT4gbC5saW5rLm1hdGNoKC9bXiN8XSsvKVswXSk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRzID0gYXBwLm1ldGFkYXRhQ2FjaGVcclxuICAgICAgLmdldEZpbGVDYWNoZShsaW5rTm90ZUZpbGUpXHJcbiAgICAgID8uZW1iZWRzPy5tYXAoKGwpID0+IGwubGluay5tYXRjaCgvW14jfF0rLylbMF0pO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldHMgPSBbLi4uKGxpbmtzID8/IFtdKSwgLi4uKGVtYmVkcyA/PyBbXSldO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCBsaW5rTm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIGxpbmtOb3RlQmFzZW5hbWUsXHJcbiAgICAgICAgZmllbGQsXHJcbiAgICAgICAgdGFyZ2V0LFxyXG4gICAgICAgIHNvdXJjZU9yZGVyLFxyXG4gICAgICAgIHRhcmdldE9yZGVyLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19JR05PUkUsIEJDX1JFR0VYX05PVEUsIEJDX1JFR0VYX05PVEVfRklFTEQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3RyVG9SZWdleCB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICBnZXRTb3VyY2VPcmRlcixcclxuICBnZXRUYXJnZXRPcmRlcixcclxuICBwb3B1bGF0ZU1haW4sXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRSZWdleE5vdGVzVG9HcmFwaChcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGVsaWdhYmxlQWx0czogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgZnJvbnRtczogZHZGcm9udG1hdHRlckNhY2hlW10sXHJcbiAgbWFpbkc6IE11bHRpR3JhcGhcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzLCByZWdleE5vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIGVsaWdhYmxlQWx0cy5mb3JFYWNoKChhbHRGaWxlKSA9PiB7XHJcbiAgICBjb25zdCByZWdleE5vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG4gICAgY29uc3QgcmVnZXhOb3RlQmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKHJlZ2V4Tm90ZUZpbGUpO1xyXG5cclxuICAgIGNvbnN0IHJlZ2V4ID0gc3RyVG9SZWdleChhbHRGaWxlW0JDX1JFR0VYX05PVEVdIGFzIHN0cmluZyk7XHJcbiAgICBpbmZvKHsgcmVnZXggfSk7XHJcblxyXG4gICAgbGV0IGZpZWxkID0gYWx0RmlsZVtCQ19SRUdFWF9OT1RFX0ZJRUxEXSBhcyBzdHJpbmc7XHJcbiAgICBpZiAodHlwZW9mIGZpZWxkICE9PSBcInN0cmluZ1wiIHx8ICFmaWVsZHMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICAgICBmaWVsZCA9IHJlZ2V4Tm90ZUZpZWxkIHx8IGZpZWxkc1swXTtcclxuXHJcbiAgICBjb25zdCB0YXJnZXRzID0gW107XHJcbiAgICBmcm9udG1zLmZvckVhY2goKHBhZ2UpID0+IHtcclxuICAgICAgaWYgKHBhZ2VbQkNfSUdOT1JFXSkgcmV0dXJuO1xyXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IGdldERWQmFzZW5hbWUocGFnZS5maWxlKTtcclxuICAgICAgaWYgKGJhc2VuYW1lICE9PSByZWdleE5vdGVCYXNlbmFtZSAmJiByZWdleC50ZXN0KGJhc2VuYW1lKSlcclxuICAgICAgICB0YXJnZXRzLnB1c2goYmFzZW5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xyXG4gICAgICBjb25zdCBzb3VyY2VPcmRlciA9IGdldFNvdXJjZU9yZGVyKGFsdEZpbGUpO1xyXG4gICAgICBjb25zdCB0YXJnZXRPcmRlciA9IGdldFRhcmdldE9yZGVyKGZyb250bXMsIHJlZ2V4Tm90ZUJhc2VuYW1lKTtcclxuICAgICAgcG9wdWxhdGVNYWluKFxyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgIG1haW5HLFxyXG4gICAgICAgIHJlZ2V4Tm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQge1xyXG4gIEJDX0lHTk9SRSxcclxuICBCQ19UQUdfTk9URSxcclxuICBCQ19UQUdfTk9URV9FWEFDVCxcclxuICBCQ19UQUdfTk9URV9GSUVMRCxcclxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgZHZGcm9udG1hdHRlckNhY2hlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIGdldFNvdXJjZU9yZGVyLFxyXG4gIGdldFRhcmdldE9yZGVyLFxyXG4gIHBvcHVsYXRlTWFpbixcclxufSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGFkZEhhc2gsIGRyb3BIYXNoLCBnZXREVkJhc2VuYW1lIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IGdldEFsbFRhZ3MgPSAoZmlsZTogVEZpbGUsIHdpdGhIYXNoID0gdHJ1ZSk6IHN0cmluZ1tdID0+IHtcclxuICBjb25zdCB7IHRhZ3MsIGZyb250bWF0dGVyIH0gPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XHJcbiAgY29uc3QgYWxsVGFnczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgdGFncz8uZm9yRWFjaCgodCkgPT4gYWxsVGFncy5wdXNoKGRyb3BIYXNoKHQudGFnKSkpO1xyXG5cclxuICBbZnJvbnRtYXR0ZXI/LnRhZ3MgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcbiAgW2Zyb250bWF0dGVyPy50YWcgPz8gW11dLmZsYXQoKS5mb3JFYWNoKCh0OiBzdHJpbmcpID0+IHtcclxuICAgIHNwbGl0QW5kVHJpbSh0KS5mb3JFYWNoKChpbm5lclQpID0+IGFsbFRhZ3MucHVzaChkcm9wSGFzaChpbm5lclQpKSk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBhbGxUYWdzLm1hcCgodCkgPT4gKHdpdGhIYXNoID8gXCIjXCIgOiBcIlwiKSArIHQudG9Mb3dlckNhc2UoKSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFnTm90ZXNUb0dyYXBoKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgZWxpZ2FibGVBbHRzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBmcm9udG1zOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMsIHRhZ05vdGVGaWVsZCB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcbiAgZWxpZ2FibGVBbHRzLmZvckVhY2goKGFsdEZpbGUpID0+IHtcclxuICAgIGNvbnN0IHRhZ05vdGVGaWxlID0gYWx0RmlsZS5maWxlO1xyXG5cclxuICAgIGNvbnN0IHRhZ05vdGVCYXNlbmFtZSA9IGdldERWQmFzZW5hbWUodGFnTm90ZUZpbGUpO1xyXG4gICAgY29uc3QgdGFnID0gYWRkSGFzaCgoYWx0RmlsZVtCQ19UQUdfTk9URV0gYXMgc3RyaW5nKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgICBpbmZvKHsgdGFnIH0pO1xyXG5cclxuICAgIGNvbnN0IGhhc1RoaXNUYWcgPSAoZmlsZTogVEZpbGUpID0+IHtcclxuICAgICAgY29uc3QgYWxsVGFncyA9IGdldEFsbFRhZ3MoZmlsZSk7XHJcbiAgICAgIHJldHVybiBhbHRGaWxlW0JDX1RBR19OT1RFX0VYQUNUXSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgPyBhbGxUYWdzLmluY2x1ZGVzKHRhZylcclxuICAgICAgICA6IGFsbFRhZ3Muc29tZSgodCkgPT4gdC5pbmNsdWRlcyh0YWcpKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0cyA9IGZyb250bXNcclxuICAgICAgLm1hcCgoZmYpID0+IGZmLmZpbGUpXHJcbiAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUucGF0aCAhPT0gdGFnTm90ZUZpbGUucGF0aCAmJiBoYXNUaGlzVGFnKGZpbGUpICYmICFmaWxlW0JDX0lHTk9SRV0pXHJcbiAgICAgIC5tYXAoZ2V0RFZCYXNlbmFtZSk7XHJcbiAgICBpbmZvKHsgdGFyZ2V0cyB9KTtcclxuXHJcbiAgICBsZXQgZmllbGQgPVxyXG4gICAgICAoYWx0RmlsZVtCQ19UQUdfTk9URV9GSUVMRF0gYXMgc3RyaW5nKSA/PyAodGFnTm90ZUZpZWxkIHx8IGZpZWxkc1swXSk7XHJcblxyXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IHtcclxuICAgICAgY29uc3Qgc291cmNlT3JkZXIgPSBnZXRTb3VyY2VPcmRlcihhbHRGaWxlKTtcclxuICAgICAgY29uc3QgdGFyZ2V0T3JkZXIgPSBnZXRUYXJnZXRPcmRlcihmcm9udG1zLCB0YWdOb3RlQmFzZW5hbWUpO1xyXG4gICAgICBwb3B1bGF0ZU1haW4oXHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgdGFnTm90ZUJhc2VuYW1lLFxyXG4gICAgICAgIGZpZWxkLFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBzb3VyY2VPcmRlcixcclxuICAgICAgICB0YXJnZXRPcmRlcixcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHR5cGUgeyBNdWx0aUdyYXBoIH0gZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBCQ19UUkFWRVJTRV9OT1RFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IGR2RnJvbnRtYXR0ZXJDYWNoZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRmc0FsbFBhdGhzLCBwb3B1bGF0ZU1haW4sIHJlbW92ZUN5Y2xlcyB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RFZCYXNlbmFtZSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVHJhdmVyc2VOb3Rlc1RvR3JhcGgoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB0cmF2ZXJzZU5vdGVzOiBkdkZyb250bWF0dGVyQ2FjaGVbXSxcclxuICBtYWluRzogTXVsdGlHcmFwaCxcclxuICBvYnNHOiBNdWx0aUdyYXBoXHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIHRyYXZlcnNlTm90ZXMuZm9yRWFjaCgoYWx0RmlsZSkgPT4ge1xyXG4gICAgY29uc3QgeyBmaWxlIH0gPSBhbHRGaWxlO1xyXG4gICAgY29uc3QgYmFzZW5hbWUgPSBnZXREVkJhc2VuYW1lKGZpbGUpO1xyXG4gICAgY29uc3Qgbm9DeWNsZXMgPSByZW1vdmVDeWNsZXMob2JzRywgYmFzZW5hbWUpO1xyXG5cclxuICAgIGxldCBmaWVsZCA9IGFsdEZpbGVbQkNfVFJBVkVSU0VfTk9URV0gYXMgc3RyaW5nO1xyXG4gICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiB8fCAhZmllbGRzLmluY2x1ZGVzKGZpZWxkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFsbFBhdGhzID0gZGZzQWxsUGF0aHMobm9DeWNsZXMsIGJhc2VuYW1lKTtcclxuICAgIGluZm8oYWxsUGF0aHMpO1xyXG4gICAgY29uc3QgcmV2ZXJzZWQgPSBbLi4uYWxsUGF0aHNdLm1hcCgocGF0aCkgPT4gcGF0aC5yZXZlcnNlKCkpO1xyXG4gICAgcmV2ZXJzZWQuZm9yRWFjaCgocGF0aCkgPT4ge1xyXG4gICAgICBwYXRoLmZvckVhY2goKG5vZGUsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gcGF0aFtpICsgMV07XHJcbiAgICAgICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIHBvcHVsYXRlTWFpbihcclxuICAgICAgICAgIHNldHRpbmdzLFxyXG4gICAgICAgICAgbWFpbkcsXHJcbiAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgZmllbGQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgbmV4dCxcclxuICAgICAgICAgIDk5OTksXHJcbiAgICAgICAgICA5OTk5LFxyXG4gICAgICAgICAgdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IGVycm9yLCBpbmZvIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IE1hcmtkb3duVmlldywgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IE5leHRQcmV2IGZyb20gXCIuLi9Db21wb25lbnRzL05leHRQcmV2LnN2ZWx0ZVwiO1xyXG5pbXBvcnQgVHJhaWxHcmlkIGZyb20gXCIuLi9Db21wb25lbnRzL1RyYWlsR3JpZC5zdmVsdGVcIjtcclxuaW1wb3J0IFRyYWlsUGF0aCBmcm9tIFwiLi4vQ29tcG9uZW50cy9UcmFpbFBhdGguc3ZlbHRlXCI7XHJcbmltcG9ydCB7XHJcbiAgQkNfSElERV9UUkFJTCxcclxuICBibGFua1JlYWxOSW1wbGllZCxcclxuICBKVUdHTF9UUkFJTF9ERUZBVUxUUyxcclxuICBUUkFJTF9MRU5HVEhTLFxyXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgeyBCQ1NldHRpbmdzLCBFZGdlQXR0ciwgUmVhbE5JbXBsaWVkIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHtcclxuICBiZnNBbGxQYXRocyxcclxuICBnZXRSZWZsZXhpdmVDbG9zdXJlLFxyXG4gIGdldFN1YkZvckZpZWxkcyxcclxuICBnZXRTdWJJbkRpcnMsXHJcbn0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzLCBnZXRPcHBEaXIsIGdldE9wcEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSnVnZ2xUcmFpbCB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9KdWdnbFwiO1xyXG5cclxuZnVuY3Rpb24gZ2V0TGltaXRlZFRyYWlsU3ViKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBtYWluRywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgbGltaXRUcmFpbENoZWNrYm94ZXMsIHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGlmIChcclxuICAgIGdldEZpZWxkcyh1c2VySGllcnMpLmV2ZXJ5KChmaWVsZCkgPT4gbGltaXRUcmFpbENoZWNrYm94ZXMuaW5jbHVkZXMoZmllbGQpKVxyXG4gICkge1xyXG4gICAgcmV0dXJuIGdldFN1YkluRGlycyhjbG9zZWRHLCBcInVwXCIpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBvcHBGaWVsZHMgPSBsaW1pdFRyYWlsQ2hlY2tib3hlc1xyXG4gICAgICAubWFwKChmaWVsZCkgPT4gZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIFwidXBcIik/LlswXSlcclxuICAgICAgLmZpbHRlcigoZmllbGQpID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xyXG4gICAgY29uc3Qgc3ViR3JhcGggPSBnZXRTdWJGb3JGaWVsZHMobWFpbkcsIFtcclxuICAgICAgLi4ubGltaXRUcmFpbENoZWNrYm94ZXMsXHJcbiAgICAgIC4uLm9wcEZpZWxkcyxcclxuICAgIF0pO1xyXG4gICAgY29uc3QgY2xvc2VkID0gZ2V0UmVmbGV4aXZlQ2xvc3VyZShzdWJHcmFwaCwgdXNlckhpZXJzKTtcclxuICAgIHJldHVybiBnZXRTdWJJbkRpcnMoY2xvc2VkLCBcInVwXCIpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnMoXHJcbiAgc2V0dGluZ3M6IEJDU2V0dGluZ3MsXHJcbiAgZzogTXVsdGlHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGVcclxuKTogc3RyaW5nW11bXSB8IG51bGwge1xyXG4gIGNvbnN0IHsgYmFzZW5hbWUsIGV4dGVuc2lvbiB9ID0gY3VyckZpbGU7XHJcbiAgaWYgKGV4dGVuc2lvbiAhPT0gXCJtZFwiKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgY29uc3QgYWxsVHJhaWxzID0gYmZzQWxsUGF0aHMoZywgYmFzZW5hbWUpO1xyXG4gIGxldCBmaWx0ZXJlZFRyYWlscyA9IFsuLi5hbGxUcmFpbHNdO1xyXG5cclxuICBjb25zdCB7IGluZGV4Tm90ZXMsIHNob3dBbGxQYXRoc0lmTm9uZVRvSW5kZXhOb3RlIH0gPSBzZXR0aW5ncztcclxuICAvLyBGaWx0ZXIgZm9yIGluZGV4IG5vdGVzXHJcbiAgaWYgKFxyXG4gICAgLy8gV29ya3MgZm9yIGB1bmRlZmluZWRgIGFuZCBgXCJcImBcclxuICAgIGluZGV4Tm90ZXNbMF0gJiZcclxuICAgIGZpbHRlcmVkVHJhaWxzLmxlbmd0aFxyXG4gICkge1xyXG4gICAgZmlsdGVyZWRUcmFpbHMgPSBmaWx0ZXJlZFRyYWlscy5maWx0ZXIoKHRyYWlsKSA9PlxyXG4gICAgICBpbmRleE5vdGVzLmluY2x1ZGVzKHRyYWlsWzBdKVxyXG4gICAgKTtcclxuICAgIGlmIChmaWx0ZXJlZFRyYWlscy5sZW5ndGggPT09IDAgJiYgc2hvd0FsbFBhdGhzSWZOb25lVG9JbmRleE5vdGUpXHJcbiAgICAgIGZpbHRlcmVkVHJhaWxzID0gWy4uLmFsbFRyYWlsc107XHJcbiAgfVxyXG5cclxuICBjb25zdCBzb3J0ZWRUcmFpbHMgPSBmaWx0ZXJlZFRyYWlsc1xyXG4gICAgLmZpbHRlcigodHJhaWwpID0+IHRyYWlsLmxlbmd0aCA+IDApXHJcbiAgICAuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCk7XHJcblxyXG4gIHJldHVybiBzb3J0ZWRUcmFpbHM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5leHROUHJldihwbHVnaW46IEJDUGx1Z2luLCBjdXJyTm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBtYWluRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgaWYgKCFtYWluRykgcmV0dXJuIG51bGw7XHJcbiAgY29uc3QgbmV4dE5QcmV2OiBSZWFsTkltcGxpZWQgPSBibGFua1JlYWxOSW1wbGllZCgpO1xyXG5cclxuICBtYWluRy5mb3JFYWNoRWRnZShjdXJyTm9kZSwgKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGNvbnN0IHsgZGlyLCBmaWVsZCwgaW1wbGllZCB9ID0gYSBhcyBFZGdlQXR0cjtcclxuICAgIGlmIChkaXIgIT09IFwibmV4dFwiICYmIGRpciAhPT0gXCJwcmV2XCIpIHJldHVybjtcclxuICAgIGlmIChzID09PSBjdXJyTm9kZSkge1xyXG4gICAgICBuZXh0TlByZXZbZGlyXS5yZWFscy5wdXNoKHsgZmllbGQsIHRvOiB0LCBpbXBsaWVkIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgb3BwRmllbGQgPSBnZXRPcHBGaWVsZHModXNlckhpZXJzLCBmaWVsZCwgZGlyKVswXTtcclxuICAgICAgbmV4dE5QcmV2W2dldE9wcERpcihkaXIpXS5pbXBsaWVkcy5wdXNoKHtcclxuICAgICAgICBmaWVsZDogb3BwRmllbGQsXHJcbiAgICAgICAgdG86IHMsXHJcbiAgICAgICAgaW1wbGllZCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG5leHROUHJldjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYWlsTGVuZ3RoKGN1cnI6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIgPSAxKSB7XHJcbiAgY29uc3QgaW5kZXggPVxyXG4gICAgKFRSQUlMX0xFTkdUSFMuaW5kZXhPZihjdXJyKSArIG9mZnNldCkgJSBUUkFJTF9MRU5HVEhTLmxlbmd0aDtcclxuICByZXR1cm4gVFJBSUxfTEVOR1RIU1tpbmRleCA8IDAgPyBUUkFJTF9MRU5HVEhTLmxlbmd0aCArIGluZGV4IDogaW5kZXhdO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZHJhd1RyYWlsKHBsdWdpbjogQkNQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBzZXR0aW5ncywgZGIsIG1haW5HIH0gPSBwbHVnaW47XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHNob3dCQ3MsXHJcbiAgICAgIG5vUGF0aE1lc3NhZ2UsXHJcbiAgICAgIHJlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGgsXHJcbiAgICAgIHNob3dUcmFpbCxcclxuICAgICAgc2hvd0dyaWQsXHJcbiAgICAgIHNob3dKdWdnbCxcclxuICAgICAgc2hvd1ByZXZOZXh0LFxyXG4gICAgICBzaG93QkNzSW5FZGl0TFBNb2RlLFxyXG4gICAgfSA9IHNldHRpbmdzO1xyXG5cclxuICAgIGRiLnN0YXJ0MkcoXCJkcmF3VHJhaWxcIik7XHJcblxyXG4gICAgY29uc3QgYWN0aXZlTURWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcbiAgICBjb25zdCBtb2RlID0gYWN0aXZlTURWaWV3Py5nZXRNb2RlKCk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAhc2hvd0JDcyB8fFxyXG4gICAgICAhYWN0aXZlTURWaWV3IHx8XHJcbiAgICAgIChtb2RlICE9PSBcInByZXZpZXdcIiAmJiAhc2hvd0JDc0luRWRpdExQTW9kZSlcclxuICAgICkge1xyXG4gICAgICBhY3RpdmVNRFZpZXc/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoXCIuQkMtdHJhaWxcIik/LnJlbW92ZSgpO1xyXG4gICAgICByZXR1cm4gZGIuZW5kMkcoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGZpbGUgfSA9IGFjdGl2ZU1EVmlldztcclxuICAgIGNvbnN0IHsgZnJvbnRtYXR0ZXIgfSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShmaWxlKSA/PyB7fTtcclxuXHJcblxyXG4gICAgaWYgKGZyb250bWF0dGVyPy5bQkNfSElERV9UUkFJTF0gfHwgZnJvbnRtYXR0ZXI/LltcImthbmJhbi1wbHVnaW5cIl0pIHJldHVybiBkYi5lbmQyRygpO1xyXG5cclxuICAgIGNvbnN0IHsgYmFzZW5hbWUgfSA9IGZpbGU7XHJcbiAgICBpZiAoIW1haW5HLmhhc05vZGUoYmFzZW5hbWUpKSByZXR1cm4gZGIuZW5kMkcoKTtcclxuXHJcbiAgICBjb25zdCB2aWV3ID1cclxuICAgICAgbW9kZSA9PT0gXCJwcmV2aWV3XCJcclxuICAgICAgICA/IGFjdGl2ZU1EVmlldy5wcmV2aWV3TW9kZS5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgXCJkaXYubWFya2Rvd24tcHJldmlldy12aWV3XCJcclxuICAgICAgICApXHJcbiAgICAgICAgOiBhY3RpdmVNRFZpZXcuY29udGVudEVsLnF1ZXJ5U2VsZWN0b3IoXCJkaXYubWFya2Rvd24tc291cmNlLXZpZXdcIik7XHJcblxyXG4gICAgYWN0aXZlTURWaWV3LmNvbnRhaW5lckVsXHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiLkJDLXRyYWlsXCIpXHJcbiAgICAgID8uZm9yRWFjaCgodHJhaWwpID0+IHRyYWlsLnJlbW92ZSgpKTtcclxuXHJcbiAgICBjb25zdCBjbG9zZWRVcCA9IGdldExpbWl0ZWRUcmFpbFN1YihwbHVnaW4pO1xyXG4gICAgY29uc3Qgc29ydGVkVHJhaWxzID0gZ2V0QnJlYWRjcnVtYnMoc2V0dGluZ3MsIGNsb3NlZFVwLCBmaWxlKTtcclxuICAgIGluZm8oeyBzb3J0ZWRUcmFpbHMgfSk7XHJcblxyXG4gICAgY29uc3Qge1xyXG4gICAgICBuZXh0OiB7IHJlYWxzOiByTmV4dCwgaW1wbGllZHM6IGlOZXh0IH0sXHJcbiAgICAgIHByZXY6IHsgcmVhbHM6IHJQcmV2LCBpbXBsaWVkczogaVByZXYgfSxcclxuICAgIH0gPSBnZXROZXh0TlByZXYocGx1Z2luLCBiYXNlbmFtZSk7XHJcblxyXG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZSBpbXBsaWVkXHJcbiAgICBjb25zdCBuZXh0ID0gWy4uLnJOZXh0XTtcclxuICAgIGlOZXh0LmZvckVhY2goKGkpID0+IHtcclxuICAgICAgaWYgKG5leHQuZmluZEluZGV4KChuKSA9PiBuLnRvID09PSBpLnRvKSA9PT0gLTEpXHJcbiAgICAgICAgbmV4dC5wdXNoKGkpXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHByZXYgPSBbLi4uclByZXZdO1xyXG4gICAgaVByZXYuZm9yRWFjaCgoaSkgPT4ge1xyXG4gICAgICBpZiAocHJldi5maW5kSW5kZXgoKG4pID0+IG4udG8gPT09IGkudG8pID09PSAtMSlcclxuICAgICAgICBwcmV2LnB1c2goaSlcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG5vSXRlbXMgPSAhc29ydGVkVHJhaWxzLmxlbmd0aCAmJiAhbmV4dC5sZW5ndGggJiYgIXByZXYubGVuZ3RoO1xyXG5cclxuICAgIGlmIChub0l0ZW1zICYmIG5vUGF0aE1lc3NhZ2UgPT09IFwiXCIpIHJldHVybiBkYi5lbmQyRygpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdG9yRm9yTWF4V2lkdGggPVxyXG4gICAgICBtb2RlID09PSBcInByZXZpZXdcIlxyXG4gICAgICAgID8gXCIubWFya2Rvd24tcHJldmlldy12aWV3LmlzLXJlYWRhYmxlLWxpbmUtd2lkdGggLm1hcmtkb3duLXByZXZpZXctc2l6ZXJcIlxyXG4gICAgICAgIDogXCJcIjtcclxuXHJcbiAgICBjb25zdCBlbEZvck1heFdpZHRoID1cclxuICAgICAgc2VsZWN0b3JGb3JNYXhXaWR0aCAhPT0gXCJcIlxyXG4gICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvckZvck1heFdpZHRoKVxyXG4gICAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IG1heF93aWR0aCA9IGVsRm9yTWF4V2lkdGhcclxuICAgICAgPyBnZXRDb21wdXRlZFN0eWxlKGVsRm9yTWF4V2lkdGgpLmdldFByb3BlcnR5VmFsdWUoXCJtYXgtd2lkdGhcIilcclxuICAgICAgOiBcIjEwMCVcIjtcclxuXHJcbiAgICBjb25zdCB0cmFpbERpdiA9IGNyZWF0ZURpdih7XHJcbiAgICAgIGNsczogYEJDLXRyYWlsICR7cmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aFxyXG4gICAgICAgID8gXCJpcy1yZWFkYWJsZS1saW5lLXdpZHRoIG1hcmtkb3duLXByZXZpZXctc2l6ZXIgbWFya2Rvd24tcHJldmlldy1zZWN0aW9uXCJcclxuICAgICAgICA6IFwiXCJcclxuICAgICAgICB9YCxcclxuICAgICAgYXR0cjoge1xyXG4gICAgICAgIHN0eWxlOlxyXG4gICAgICAgICAgKG1vZGUgIT09IFwicHJldmlld1wiID8gYG1heC13aWR0aDogJHttYXhfd2lkdGh9O2AgOiBcIlwiKSArXHJcbiAgICAgICAgICBcIm1hcmdpbjogMCBhdXRvO1wiICtcclxuICAgICAgICAgIGAke3Jlc3BlY3RSZWFkYWJsZUxpbmVMZW5ndGhcclxuICAgICAgICAgICAgPyAnd2lkdGg6IHZhcigtLWZpbGUtbGluZS13aWR0aCk7J1xyXG4gICAgICAgICAgICA6ICd3aWR0aDogMTAwJSd9YCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIHBsdWdpbi52aXNpdGVkLnB1c2goW2ZpbGUucGF0aCwgdHJhaWxEaXZdKTtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gXCJwcmV2aWV3XCIpIHtcclxuICAgICAgdmlldy5xdWVyeVNlbGVjdG9yKFwiZGl2Lm1hcmtkb3duLXByZXZpZXctc2l6ZXJcIikuYmVmb3JlKHRyYWlsRGl2KTtcclxuXHJcbiAgICAgIC8vIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vYnNpZGlhbi1iYW5uZXItd3JhcHBlcicpXHJcbiAgICAgIC8vIGlmIChiYW5uZXIpIHtcclxuICAgICAgLy8gICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAvLyAgICAgY29uc3QgYmFubmVyTWFyZ2luID0gZ2V0Q29tcHV0ZWRTdHlsZShiYW5uZXIpLm1hcmdpblRvcFxyXG4gICAgICAvLyAgICAgY29uc29sZS5sb2coYmFubmVyTWFyZ2luKVxyXG4gICAgICAvLyAgICAgdHJhaWxEaXYuc3R5bGUubWFyZ2luVG9wID0gYmFubmVyTWFyZ2luO1xyXG4gICAgICAvLyAgICAgYmFubmVyLnN0eWxlLm1hcmdpblRvcCA9ICcwcHgnXHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgLy8gfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY21HdXR0ZXIgPSB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuY20tZ3V0dGVyc1wiKTtcclxuICAgICAgaWYgKGNtR3V0dGVyKSB7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGd1dHRlckhlaWdodCA9IHRyYWlsRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuICAgICAgICAgIC8vIHNldCBwYWRkaW5nIHRvcCBvZiBndXR0ZXIgdG8gbWF0Y2ggaGVpZ2h0IG9mIHRyYWlsRGl2XHJcbiAgICAgICAgICBjbUd1dHRlci5zdHlsZS5wYWRkaW5nVG9wID0gYCR7Z3V0dGVySGVpZ2h0ICsgNH1weGA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnN0IGJhbm5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vYnNpZGlhbi1iYW5uZXItc3BhY2VyJylcclxuICAgICAgLy8gaWYgKGJhbm5lcikge1xyXG4gICAgICAvLyAgIGNvbnNvbGUubG9nKHsgYmFubmVyIH0pXHJcbiAgICAgIC8vICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgLy8gICAgIGNvbnN0IGJhbm5lck1hcmdpbiA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoYmFubmVyKS5oZWlnaHQpXHJcbiAgICAgIC8vICAgICBjb25zb2xlLmxvZyhiYW5uZXJNYXJnaW4pXHJcbiAgICAgIC8vICAgICB0cmFpbERpdi5zdHlsZS5tYXJnaW5Ub3AgPSBgJHtiYW5uZXJNYXJnaW4gKyAxMH1weGA7XHJcbiAgICAgIC8vICAgICBiYW5uZXIuc3R5bGUuaGVpZ2h0ID0gJzBweCdcclxuICAgICAgLy8gICB9KVxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICB2aWV3LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuY20tY29udGVudENvbnRhaW5lclwiKT8uYmVmb3JlKHRyYWlsRGl2KVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgdHJhaWxEaXYuZW1wdHkoKTtcclxuICAgIGlmIChzZXR0aW5ncy5pbmRleE5vdGVzLmluY2x1ZGVzKGJhc2VuYW1lKSkge1xyXG4gICAgICB0cmFpbERpdi5pbm5lclRleHQgPSBcIkluZGV4IE5vdGVcIjtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5vSXRlbXMpIHtcclxuICAgICAgdHJhaWxEaXYuaW5uZXJUZXh0ID0gbm9QYXRoTWVzc2FnZTtcclxuICAgICAgcmV0dXJuIGRiLmVuZDJHKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0UHJvcHMgPSB7XHJcbiAgICAgIHRhcmdldDogdHJhaWxEaXYsXHJcbiAgICAgIHByb3BzOiB7IHNvcnRlZFRyYWlscywgcGx1Z2luIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChzaG93VHJhaWwgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkgbmV3IFRyYWlsUGF0aCh0YXJnZXRQcm9wcyk7XHJcbiAgICBpZiAoc2hvd0dyaWQgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkgbmV3IFRyYWlsR3JpZCh0YXJnZXRQcm9wcyk7XHJcbiAgICBpZiAoc2hvd1ByZXZOZXh0ICYmIChuZXh0Lmxlbmd0aCB8fCBwcmV2Lmxlbmd0aCkpIHtcclxuICAgICAgbmV3IE5leHRQcmV2KHtcclxuICAgICAgICB0YXJnZXQ6IHRyYWlsRGl2LFxyXG4gICAgICAgIHByb3BzOiB7IHBsdWdpbiwgbmV4dCwgcHJldiB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChzaG93SnVnZ2wgJiYgc29ydGVkVHJhaWxzLmxlbmd0aCkge1xyXG4gICAgICBjcmVhdGVKdWdnbFRyYWlsKFxyXG4gICAgICAgIHBsdWdpbixcclxuICAgICAgICB0cmFpbERpdixcclxuICAgICAgICBzb3J0ZWRUcmFpbHMsXHJcbiAgICAgICAgYmFzZW5hbWUsXHJcbiAgICAgICAgSlVHR0xfVFJBSUxfREVGQVVMVFNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGRiLmVuZDJHKCk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBlcnJvcihlcnIpO1xyXG4gICAgcGx1Z2luLmRiLmVuZDJHKCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IG9wZW5PclN3aXRjaCwgaG92ZXJQcmV2aWV3IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuICBpbXBvcnQgdHlwZSB7IFNxdWFyZUl0ZW0gfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgbGlua0NsYXNzIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgbmV4dDogU3F1YXJlSXRlbVtdO1xyXG4gIGV4cG9ydCBsZXQgcHJldjogU3F1YXJlSXRlbVtdO1xyXG5cclxuICBjb25zdCBhY3RpdmVMZWFmVmlldyA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3O1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1OZXh0UHJldi1Db250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtcHJldnNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICB7I2VhY2ggcHJldiBhcyB7IGZpZWxkLCByZWFsLCB0byB9fVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwie2xpbmtDbGFzcyh0bywgcmVhbCl9IEJDLXByZXZcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB0byl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHN0cm9uZz57ZmllbGR9PC9zdHJvbmc+XHJcbiAgICAgICAgICB7dG99XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiQkMtbmV4dHNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICB7I2VhY2ggbmV4dCBhcyB7IGZpZWxkLCByZWFsLCB0byB9fVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwie2xpbmtDbGFzcyh0bywgcmVhbCl9IEJDLW5leHRcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB0byl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3RvfSA8c3Ryb25nPntmaWVsZH08L3N0cm9uZz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgey9lYWNofVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuQkMtbmV4dHMgZGl2IHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgLkJDLW5leHRzIHtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gIH1cclxuICAuQkMtcHJldnMge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gIH1cclxuXHJcbiAgLkJDLU5leHRQcmV2LUNvbnRhaW5lciB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHtcclxuICAgIGhvdmVyUHJldmlldyxcclxuICAgIG9wZW5PclN3aXRjaCxcclxuICB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7XHJcbiAgICBkcm9wRGVuZHJvbixcclxuICAgIHBhZEFycmF5LFxyXG4gICAgcnVucyxcclxuICAgIHRyYW5zcG9zZSxcclxuICB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBnZXRBbHQsIGxpbmtDbGFzcyB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgc29ydGVkVHJhaWxzOiBzdHJpbmdbXVtdO1xyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuXHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgZ3JpZERlZmF1bHREZXB0aCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IGFjdGl2ZUxlYWZWaWV3ID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXc7XHJcbiAgY29uc3QgbWF4TGVuZ3RoID0gc29ydGVkVHJhaWxzLmxhc3QoKS5sZW5ndGg7XHJcblxyXG4gIC8vIFVzZSB0aGUgdXNlciBzZXR0aW5nIHRvIGxpbWl0IHRoZSBpbml0aWFsIGRlcHRoXHJcbiAgbGV0IGRlcHRoID0gTWF0aC5taW4obWF4TGVuZ3RoLCBncmlkRGVmYXVsdERlcHRoKTtcclxuXHJcbiAgbGV0IHNsaWNlZFRyYWlscyA9IHNvcnRlZFRyYWlscztcclxuICAkOiB7XHJcbiAgICBzbGljZWRUcmFpbHMgPSBbXTtcclxuICAgIHNvcnRlZFRyYWlscy5mb3JFYWNoKCh0cmFpbCkgPT4ge1xyXG4gICAgICBjb25zdCBzbGljZSA9IHRyYWlsLnNsaWNlKG1heExlbmd0aCAtIGRlcHRoKTtcclxuICAgICAgaWYgKHNsaWNlLmxlbmd0aCkgc2xpY2VkVHJhaWxzLnB1c2goc2xpY2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAkOiBwYWRkZWRUcmFpbHMgPSBzbGljZWRUcmFpbHMubWFwKCh0cmFpbCkgPT4gcGFkQXJyYXkodHJhaWwsIGRlcHRoKSk7XHJcblxyXG4gICQ6IHRyYW5zcG9zZWRUcmFpbHMgPSB0cmFuc3Bvc2UocGFkZGVkVHJhaWxzKTtcclxuICAkOiBhbGxSdW5zID0gdHJhbnNwb3NlZFRyYWlscy5tYXAocnVucyk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIkJDLWdyaWQtd3JhcHBlclwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiQkMtdHJhaWwtZ3JpZFwiXHJcbiAgICBzdHlsZT1cIlxyXG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHsnMWZyICcucmVwZWF0KHRyYW5zcG9zZWRUcmFpbHMubGVuZ3RoKX07XHJcbiAgICAgIGdyaWQtdGVtcGxhdGUtcm93czogeycxZnIgJy5yZXBlYXQoc2xpY2VkVHJhaWxzLmxlbmd0aCl9O1wiXHJcbiAgPlxyXG4gICAgeyNlYWNoIHRyYW5zcG9zZWRUcmFpbHMgYXMgY29sLCBpfVxyXG4gICAgICB7I2VhY2ggYWxsUnVuc1tpXSBhcyB7IHZhbHVlLCBmaXJzdCwgbGFzdCB9fVxyXG4gICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1vdXNlLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJCQy10cmFpbC1ncmlkLWl0ZW0ge3ZhbHVlID09PSAnJyA/ICdCQy1maWxsZXInIDogJyd9XCJcclxuICAgICAgICAgIHN0eWxlPVwiXHJcbiAgICAgICAgICAgICAgZ3JpZC1hcmVhOiB7Zmlyc3QgKyAxfSAvIHtpICsgMX0gL1xyXG4gICAgICAgICAgICAgICAgICB7bGFzdCArIDJ9IC8ge2kgKyAyfTtcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godmFsdWUsIGUpfVxyXG4gICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGFjdGl2ZUxlYWZWaWV3LCB2YWx1ZSl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz17bGlua0NsYXNzKHZhbHVlKX0+XHJcbiAgICAgICAgICAgIHtnZXRBbHQodmFsdWUsIHBsdWdpbikgPz8gZHJvcERlbmRyb24odmFsdWUsIHNldHRpbmdzKX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB7L2VhY2h9XHJcbiAgICB7L2VhY2h9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJCQy1ncmlkLW9wdGlvbnNcIj5cclxuICAgIDxzcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIkJDLWdyaWQtb3B0aW9ucy1pY29uXCI+XHUyNjk5XHVGRTBGPC9zcGFuPlxyXG5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJCQy1ncmlkLW9wdGlvbnMtb3B0aW9uc1wiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiQkMtZGVwdGgtYnV0dG9uXCJcclxuICAgICAgICAgIGRpc2FibGVkPXtkZXB0aCA9PT0gMX1cclxuICAgICAgICAgIG9uOmNsaWNrPXsoKSA9PiAoZGVwdGggLT0gMSl9Pi08L2J1dHRvblxyXG4gICAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRyZWUtaXRlbS1mbGFpclwiPntkZXB0aH08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJCQy1kZXB0aC1idXR0b25cIlxyXG4gICAgICAgICAgZGlzYWJsZWQ9e2RlcHRoID09PSBtYXhMZW5ndGh9XHJcbiAgICAgICAgICBvbjpjbGljaz17KCkgPT4gKGRlcHRoICs9IDEpfT4rPC9idXR0b25cclxuICAgICAgICA+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgZGl2LkJDLWdyaWQtd3JhcHBlciB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgfVxyXG5cclxuICBkaXYuQkMtdHJhaWwtZ3JpZCB7XHJcbiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XHJcbiAgICB3aWR0aDogYXV0bztcclxuICAgIGhlaWdodDogYXV0bztcclxuICB9XHJcblxyXG4gIC5CQy1ncmlkLW9wdGlvbnMge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiAwcHg7XHJcbiAgICByaWdodDogMHB4O1xyXG4gICAgaGVpZ2h0OiAzNXB4O1xyXG4gICAgd2lkdGg6IDMycHg7XHJcblxyXG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuXHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblxyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcztcclxuICAgIG92ZXJmbG93LXdyYXA6IG5vcm1hbDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG4gIGRpdi5CQy1ncmlkLW9wdGlvbnM6aG92ZXIge1xyXG4gICAgcGFkZGluZzogNXB4O1xyXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xyXG4gIH1cclxuICBkaXYuQkMtZ3JpZC1vcHRpb25zOmhvdmVyIC5CQy1ncmlkLW9wdGlvbnMtaWNvbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxuXHJcbiAgLkJDLWdyaWQtb3B0aW9ucy1vcHRpb25zIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG4gIGRpdi5CQy1ncmlkLW9wdGlvbnM6aG92ZXIgLkJDLWdyaWQtb3B0aW9ucy1vcHRpb25zIHtcclxuICAgIGRpc3BsYXk6IHVuc2V0O1xyXG4gIH1cclxuXHJcbiAgLkJDLWRlcHRoLWJ1dHRvbiB7XHJcbiAgICBwYWRkaW5nOiAzcHggNXB4O1xyXG4gIH1cclxuXHJcbiAgZGl2LkJDLXRyYWlsLWdyaWQtaXRlbSB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIHBhZGRpbmc6IDJweDtcclxuICAgIGZvbnQtc2l6ZTogc21hbGxlcjtcclxuICB9XHJcblxyXG4gIGRpdi5CQy10cmFpbC1ncmlkLWl0ZW0uQkMtZmlsbGVyIHtcclxuICAgIG9wYWNpdHk6IDAuNztcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7XHJcbiAgICBob3ZlclByZXZpZXcsXHJcbiAgICBvcGVuT3JTd2l0Y2gsXHJcbiAgfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYi9kaXN0L3V0aWxzXCI7XHJcbiAgaW1wb3J0IHsgZ2V0VHJhaWxMZW5ndGggfSBmcm9tIFwiLi4vVmlld3MvVHJhaWxWaWV3XCI7XHJcbiAgaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuICBpbXBvcnQgeyBkcm9wRGVuZHJvbiB9IGZyb20gXCIuLi9VdGlscy9nZW5lcmFsVXRpbHNcIjtcclxuICBpbXBvcnQgeyBnZXRBbHQgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuICBleHBvcnQgbGV0IHNvcnRlZFRyYWlsczogc3RyaW5nW11bXTtcclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHZpZXcgfSA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuICBsZXQgeyBzaG93QWxsLCBub1BhdGhNZXNzYWdlLCB0cmFpbFNlcGVyYXRvciB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGxldCB0cmFpbF9sZW5ndGggPSBzaG93QWxsO1xyXG5cclxuICAkOiB0cmFpbHNUb1Nob3cgPVxyXG4gICAgdHJhaWxfbGVuZ3RoID09IFwiQWxsXCJcclxuICAgICAgPyBzb3J0ZWRUcmFpbHNcclxuICAgICAgOiB0cmFpbF9sZW5ndGggPT0gXCJTaG9ydGVzdFwiXHJcbiAgICAgID8gW3NvcnRlZFRyYWlsc1swXV1cclxuICAgICAgOiBbc29ydGVkVHJhaWxzLmxhc3QoKV07XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNwYW4gY2xhc3M9XCJCQy10cmFpbC1wYXRoLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0cmFpbHMtZGl2XCI+XHJcbiAgICB7I2VhY2ggdHJhaWxzVG9TaG93IGFzIHRyYWlsfVxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIHsjaWYgIXRyYWlsLmxlbmd0aH1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiQkMtZW1wdHktdHJhaWxcIj57bm9QYXRoTWVzc2FnZX08L3NwYW4+XHJcbiAgICAgICAgezplbHNlfVxyXG4gICAgICAgICAgeyNlYWNoIHRyYWlsIGFzIGNydW1iLCBpfVxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJuYWwtbGluayBCQy1MaW5rXCJcclxuICAgICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChjcnVtYiwgZSl9XHJcbiAgICAgICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIHZpZXcsIGNydW1iKX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHtnZXRBbHQoY3J1bWIsIHBsdWdpbikgPz8gZHJvcERlbmRyb24oY3J1bWIsIHNldHRpbmdzKX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICB7I2lmIGkgPCB0cmFpbC5sZW5ndGggLSAxfVxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiQkMtdHJhaWwtc2VwXCI+e1wiIFwiICsgdHJhaWxTZXBlcmF0b3IgKyBcIiBcIn08L3NwYW4+XHJcbiAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICB7L2VhY2h9XHJcbiAgICAgICAgey9pZn1cclxuICAgICAgPC9kaXY+XHJcbiAgICB7L2VhY2h9XHJcbiAgPC9kaXY+XHJcblxyXG4gIHsjaWYgc29ydGVkVHJhaWxzLmxlbmd0aCA+IDF9XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidXR0b24tZGl2XCJcclxuICAgICAgICBvbjpjbGljaz17KCkgPT4gKHRyYWlsX2xlbmd0aCA9IGdldFRyYWlsTGVuZ3RoKHRyYWlsX2xlbmd0aCkpfVxyXG4gICAgICAgIG9uOmNvbnRleHRtZW51PXsoZSkgPT4ge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdHJhaWxfbGVuZ3RoID0gZ2V0VHJhaWxMZW5ndGgodHJhaWxfbGVuZ3RoLCAtMSk7XHJcbiAgICAgICAgfX1cclxuICAgICAgPlxyXG4gICAgICAgIHt0cmFpbF9sZW5ndGh9XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgey9pZn1cclxuPC9zcGFuPlxyXG5cclxuPHN0eWxlPlxyXG4gIHNwYW4uQkMtdHJhaWwtcGF0aC1jb250YWluZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgdHlwZSB7IEVkZ2VEZWZpbml0aW9uLCBOb2RlU2luZ3VsYXIgfSBmcm9tIFwiY3l0b3NjYXBlXCI7XHJcbmltcG9ydCB0eXBlIHsgTXVsdGlHcmFwaCB9IGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7XHJcbiAgRGF0YVN0b3JlRXZlbnRzLFxyXG4gIGdldFBsdWdpbixcclxuICBJQ29yZURhdGFTdG9yZSxcclxuICBJSnVnZ2wsXHJcbiAgSUp1Z2dsU2V0dGluZ3MsXHJcbiAgSUp1Z2dsU3RvcmVzLFxyXG4gIG5vZGVEYW5nbGluZyxcclxuICBub2RlRnJvbUZpbGUsXHJcbiAgVml6SWQsXHJcbn0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5pbXBvcnQgeyBpbmZvLCB3YXJuIH0gZnJvbSBcImxvZ2xldmVsXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRzLCBNZXRhZGF0YUNhY2hlLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBjcmVhdGVJbmRleCB9IGZyb20gXCIuLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG5pbXBvcnQgSnVnZ2xCdXR0b24gZnJvbSBcIi4uL0NvbXBvbmVudHMvSnVnZ2xCdXR0b24uc3ZlbHRlXCI7XHJcbmltcG9ydCBKdWdnbERlcHRoIGZyb20gXCIuLi9Db21wb25lbnRzL0p1Z2dsRGVwdGguc3ZlbHRlXCI7XHJcbmltcG9ydCB7IEpVR0dMX0NCX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIGRmc0FsbFBhdGhzLFxyXG4gIGdldFJlZmxleGl2ZUNsb3N1cmUsXHJcbiAgZ2V0U3ViSW5EaXJzLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmNvbnN0IFNUT1JFX0lEID0gXCJjb3JlXCI7XHJcblxyXG5jbGFzcyBCQ1N0b3JlRXZlbnRzIGV4dGVuZHMgRXZlbnRzIGltcGxlbWVudHMgRGF0YVN0b3JlRXZlbnRzIHsgfVxyXG5cclxuZXhwb3J0IGNsYXNzIEJDU3RvcmUgZXh0ZW5kcyBDb21wb25lbnQgaW1wbGVtZW50cyBJQ29yZURhdGFTdG9yZSB7XHJcbiAgZ3JhcGg6IE11bHRpR3JhcGg7XHJcbiAgY2FjaGU6IE1ldGFkYXRhQ2FjaGU7XHJcbiAgZGVwdGhNYXA6IHsgW3ZhbHVlOiBzdHJpbmddOiBudW1iZXIgfTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGdyYXBoOiBNdWx0aUdyYXBoLFxyXG4gICAgbWV0YWRhdGE6IE1ldGFkYXRhQ2FjaGUsXHJcbiAgICBkZXB0aE1hcD86IHsgW3ZhbHVlOiBzdHJpbmddOiBudW1iZXIgfVxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcclxuICAgIHRoaXMuY2FjaGUgPSBtZXRhZGF0YTtcclxuICAgIHRoaXMuZGVwdGhNYXAgPSBkZXB0aE1hcDtcclxuICB9XHJcblxyXG4gIGFzU3RyaW5nKG5vZGU6IE5vZGVTaW5ndWxhcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBpZCA9IFZpeklkLmZyb21Ob2RlKG5vZGUpO1xyXG4gICAgcmV0dXJuIGlkLmlkLnNsaWNlKDAsIC0zKTtcclxuICB9XHJcblxyXG4gIGdldEZpbGUobm9kZUlkOiBWaXpJZCk6IFRGaWxlIHtcclxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KG5vZGVJZC5pZCwgXCJcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25uZWN0Tm9kZXMoXHJcbiAgICBhbGxOb2RlczogY3l0b3NjYXBlLk5vZGVDb2xsZWN0aW9uLFxyXG4gICAgbmV3Tm9kZXM6IGN5dG9zY2FwZS5Ob2RlQ29sbGVjdGlvbixcclxuICAgIGdyYXBoOiBJSnVnZ2xcclxuICApOiBQcm9taXNlPGN5dG9zY2FwZS5FZGdlRGVmaW5pdGlvbltdPiB7XHJcbiAgICBjb25zdCBlZGdlczogRWRnZURlZmluaXRpb25bXSA9IFtdO1xyXG4gICAgY29uc3Qgbm9kZXNMaXN0UyA9IG5ldyBTZXQoXHJcbiAgICAgIGFsbE5vZGVzLm1hcCgobm9kZSkgPT4gdGhpcy5hc1N0cmluZyhub2RlKSkuZmlsdGVyKChzKSA9PiBzKVxyXG4gICAgKTtcclxuICAgIG5ld05vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuYXNTdHJpbmcobm9kZSk7XHJcbiAgICAgIGlmICghdGhpcy5ncmFwaC5oYXNOb2RlKG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZ3JhcGguZm9yRWFjaE91dEVkZ2UoXHJcbiAgICAgICAgdGhpcy5hc1N0cmluZyhub2RlKSxcclxuICAgICAgICAoa2V5LCBhdHRyLCBzb3VyY2UsIHRhcmdldCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG5vZGVzTGlzdFMuaGFzKHRhcmdldCkpIHtcclxuICAgICAgICAgICAgZWRnZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGBCQzoke3NvdXJjZX0tPiR7dGFyZ2V0fWAsXHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFZpeklkLnRvSWQoc291cmNlLCBTVE9SRV9JRCkgKyBcIi5tZFwiLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBWaXpJZC50b0lkKHRhcmdldCwgU1RPUkVfSUQpICsgXCIubWRcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IGF0dHIuZmllbGQsXHJcbiAgICAgICAgICAgICAgICBkaXI6IGF0dHIuZGlyLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgY2xhc3NlczogYHR5cGUtJHthdHRyLmZpZWxkfSBkaXItJHthdHRyLmRpcn0gYnJlYWRjcnVtYnMkYCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVkZ2VzKTtcclxuICB9XHJcblxyXG4gIGdldEV2ZW50cyh2aWV3OiBJSnVnZ2wpOiBEYXRhU3RvcmVFdmVudHMge1xyXG4gICAgcmV0dXJuIG5ldyBCQ1N0b3JlRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXROZWlnaGJvdXJob29kKFxyXG4gICAgbm9kZUlkczogVml6SWRbXSxcclxuICAgIHZpZXc6IElKdWdnbFxyXG4gICk6IFByb21pc2U8Y3l0b3NjYXBlLk5vZGVEZWZpbml0aW9uW10+IHtcclxuICAgIGNvbnN0IG5ld19ub2RlcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBub2RlSWQgb2Ygbm9kZUlkcykge1xyXG4gICAgICBjb25zdCBuYW1lID0gbm9kZUlkLmlkLnNsaWNlKDAsIC0zKTtcclxuICAgICAgaWYgKCF0aGlzLmdyYXBoLmhhc05vZGUobmFtZSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGNvbnN0IG5ld19ub2RlIG9mIHRoaXMuZ3JhcGgubmVpZ2hib3JzKG5hbWUpKSB7XHJcbiAgICAgICAgbmV3X25vZGVzLnB1c2goXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldChuZXcgVml6SWQobmV3X25vZGUgKyBcIi5tZFwiLCBTVE9SRV9JRCksIHZpZXcpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld19ub2RlcztcclxuICB9XHJcblxyXG4gIHJlZnJlc2hOb2RlKGlkOiBWaXpJZCwgdmlldzogSUp1Z2dsKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFNUT1JFX0lEO1xyXG4gIH1cclxuXHJcbiAgZ2V0KG5vZGVJZDogVml6SWQsIHZpZXc6IElKdWdnbCk6IFByb21pc2U8Y3l0b3NjYXBlLk5vZGVEZWZpbml0aW9uPiB7XHJcbiAgICBjb25zdCBmaWxlID0gdGhpcy5nZXRGaWxlKG5vZGVJZCk7XHJcbiAgICBsZXQgZGVwdGggPSAwO1xyXG4gICAgaWYgKHRoaXMuZGVwdGhNYXAgJiYgbm9kZUlkLmlkIGluIHRoaXMuZGVwdGhNYXApIHtcclxuICAgICAgZGVwdGggPSB0aGlzLmRlcHRoTWFwW25vZGVJZC5pZF07XHJcbiAgICB9XHJcbiAgICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBkYW5nbGluZyA9IG5vZGVEYW5nbGluZyhub2RlSWQuaWQpO1xyXG4gICAgICBkYW5nbGluZy5kYXRhLmRlcHRoID0gZGVwdGg7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGFuZ2xpbmcpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlLmdldEZpbGVDYWNoZShmaWxlKTtcclxuICAgIGlmIChjYWNoZSA9PT0gbnVsbCkge1xyXG4gICAgICBpbmZvKFwicmV0dXJuaW5nIGVtcHR5IGNhY2hlXCIsIG5vZGVJZCk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZURhbmdsaW5nKG5vZGVJZC5pZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBub2RlRnJvbUZpbGUoZmlsZSwgdmlldy5wbHVnaW4sIHZpZXcuc2V0dGluZ3MsIG5vZGVJZC50b0lkKCkpLnRoZW4oXHJcbiAgICAgIChub2RlKSA9PiB7XHJcbiAgICAgICAgbm9kZS5kYXRhLmRlcHRoID0gZGVwdGg7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnVnZ2woXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxyXG4gIGluaXRpYWxOb2Rlczogc3RyaW5nW10sXHJcbiAgYXJnczogSUp1Z2dsU2V0dGluZ3MsXHJcbiAgZGVwdGhNYXA6IHsgW3ZhbHVlOiBzdHJpbmddOiBudW1iZXIgfSA9IG51bGxcclxuKTogSUp1Z2dsIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QganVnZ2xQbHVnaW4gPSBnZXRQbHVnaW4oYXBwKTtcclxuICAgIGlmICghanVnZ2xQbHVnaW4pIHtcclxuICAgICAgLy8gVE9ETzogRXJyb3IgaGFuZGxpbmdcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChsZXQga2V5IGluIEpVR0dMX0NCX0RFRkFVTFRTKSB7XHJcbiAgICAgIGlmIChrZXkgaW4gYXJncyAmJiBhcmdzW2tleV0gPT09IHVuZGVmaW5lZClcclxuICAgICAgICBhcmdzW2tleV0gPSBKVUdHTF9DQl9ERUZBVUxUU1trZXldO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJjU3RvcmUgPSBuZXcgQkNTdG9yZShcclxuICAgICAgcGx1Z2luLm1haW5HLFxyXG4gICAgICBhcHAubWV0YWRhdGFDYWNoZSxcclxuICAgICAgZGVwdGhNYXBcclxuICAgICk7XHJcbiAgICBjb25zdCBzdG9yZXM6IElKdWdnbFN0b3JlcyA9IHtcclxuICAgICAgY29yZVN0b3JlOiBiY1N0b3JlLFxyXG4gICAgICBkYXRhU3RvcmVzOiBbYmNTdG9yZV0sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGp1Z2dsID0ganVnZ2xQbHVnaW4uY3JlYXRlSnVnZ2wodGFyZ2V0LCBhcmdzLCBzdG9yZXMsIGluaXRpYWxOb2Rlcyk7XHJcbiAgICBwbHVnaW4uYWRkQ2hpbGQoanVnZ2wpO1xyXG4gICAgaW5mbyh7IGp1Z2dsIH0pO1xyXG4gICAgcmV0dXJuIGp1Z2dsO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICB3YXJuKHsgZXJyb3IgfSk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21Ub1NvdXJjZShqdWdnbDogSUp1Z2dsLCBzb3VyY2U6IHN0cmluZykge1xyXG4gIGlmICghanVnZ2wpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAganVnZ2wub24oXCJ2aXpSZWFkeVwiLCAodml6KSA9PiB7XHJcbiAgICAvLyBBZnRlciBsYXlvdXQgaXMgZG9uZSwgY2VudGVyIG9uIHNvdXJjZSBub2RlXHJcbiAgICB2aXoub25lKFwibGF5b3V0c3RvcFwiLCAoZSkgPT4ge1xyXG4gICAgICBjb25zdCB2aXogPSBlLmN5O1xyXG4gICAgICBjb25zdCBub2RlID0gdml6LiRpZChWaXpJZC50b0lkKHNvdXJjZSArIFwiLm1kXCIsIFNUT1JFX0lEKSk7XHJcbiAgICAgIHZpei5hbmltYXRlKHtcclxuICAgICAgICBjZW50ZXI6IHtcclxuICAgICAgICAgIGVsZXM6IG5vZGUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkdXJhdGlvbjogMjUwLFxyXG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcclxuICAgICAgICB6b29tOiAxLjcsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21Ub0dyYXBoKGp1Z2dsOiBJSnVnZ2wpIHtcclxuICBqdWdnbC5vbihcInZpelJlYWR5XCIsICh2aXopID0+IHtcclxuICAgIHZpei5maXQodml6Lm5vZGVzKCkpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVEZXB0aE1hcChcclxuICBwYXRoczogc3RyaW5nW11bXSxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICBvZmZzZXQgPSAwXHJcbik6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9IHtcclxuICAvLyBUT0RPOiBJcyB0aGVyZSBhIEJDIGZ1bmN0aW9uIGZvciB0aGlzIGFscmVhZHk/XHJcbiAgbGV0IGRlcHRoTWFwOiB7IFt2YWx1ZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcclxuICBkZXB0aE1hcFtzb3VyY2UgKyBcIi5tZFwiXSA9IDA7XHJcbiAgcGF0aHMuZm9yRWFjaCgocGF0aCkgPT4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSBwYXRoW2ldICsgXCIubWRcIjtcclxuICAgICAgY29uc3QgZGVwdGggPSBwYXRoLmxlbmd0aCAtIGkgLSAxICsgb2Zmc2V0O1xyXG4gICAgICBpZiAobmFtZSBpbiBkZXB0aE1hcCkge1xyXG4gICAgICAgIGRlcHRoTWFwW25hbWVdID0gTWF0aC5taW4oZGVwdGhNYXBbbmFtZV0sIGRlcHRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZXB0aE1hcFtuYW1lXSA9IGRlcHRoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGRlcHRoTWFwO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVEZXB0aChqdWdnbDogSUp1Z2dsLCBkZXB0aDogbnVtYmVyKSB7XHJcbiAganVnZ2wudml6LiQoYFtkZXB0aD4ke2RlcHRofV1gKS5hZGRDbGFzcyhcImZpbHRlcmVkXCIpO1xyXG4gIGp1Z2dsLnZpei4kKGBbZGVwdGg8PSR7ZGVwdGh9XWApLnJlbW92ZUNsYXNzKFwiZmlsdGVyZWRcIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKdWdnbFRyYWlsKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcclxuICBwYXRoczogc3RyaW5nW11bXSxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICBhcmdzOiBJSnVnZ2xTZXR0aW5nc1xyXG4pIHtcclxuICBjb25zdCB0b29sYmFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICB0b29sYmFyRGl2LmFkZENsYXNzKFwiY3ktdG9vbGJhclwiKTtcclxuICB0YXJnZXQuYXBwZW5kQ2hpbGQodG9vbGJhckRpdik7XHJcblxyXG4gIGNvbnN0IHNlY3REaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIHNlY3REaXYuYWRkQ2xhc3MoXCJjeS10b29sYmFyLXNlY3Rpb25cIik7XHJcbiAgdG9vbGJhckRpdi5hcHBlbmRDaGlsZChzZWN0RGl2KTtcclxuXHJcbiAgY29uc3QgYW10Q2hpbGRyZW4gPSB0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoO1xyXG5cclxuICBsZXQganVnZ2xVcDogSUp1Z2dsID0gbnVsbDtcclxuICBsZXQganVnZ2xEb3duOiBJSnVnZ2wgPSBudWxsO1xyXG5cclxuICBuZXcgSnVnZ2xCdXR0b24oe1xyXG4gICAgdGFyZ2V0OiBzZWN0RGl2LFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgaWNvbjogXCJcdTIxOTFcIixcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGlmIChqdWdnbFVwKSB7XHJcbiAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bYW10Q2hpbGRyZW5dLmNsYXNzTGlzdC5yZW1vdmUoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhVcC4kc2V0KHsgdmlzaWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGp1Z2dsRG93bikge1xyXG4gICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuICsgMV0uY2xhc3NMaXN0LmFkZChcImp1Z2dsLWhpZGVcIik7XHJcbiAgICAgICAgICBkZXB0aERvd24uJHNldCh7IHZpc2libGU6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgICB0aXRsZTogXCJTaG93IHVwIGdyYXBoXCIsXHJcbiAgICB9LFxyXG4gIH0pO1xyXG5cclxuICBuZXcgSnVnZ2xCdXR0b24oe1xyXG4gICAgdGFyZ2V0OiBzZWN0RGl2LFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgaWNvbjogXCJcdTIxOTNcIixcclxuICAgICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgIGlmIChqdWdnbERvd24pIHtcclxuICAgICAgICAgIHRhcmdldC5jaGlsZHJlblthbXRDaGlsZHJlbiArIDFdLmNsYXNzTGlzdC5yZW1vdmUoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgZGVwdGhVcC4kc2V0KHsgdmlzaWJsZTogZmFsc2UgfSk7XHJcbiAgICAgICAgICBpZiAoanVnZ2xVcCkge1xyXG4gICAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bYW10Q2hpbGRyZW5dLmNsYXNzTGlzdC5hZGQoXCJqdWdnbC1oaWRlXCIpO1xyXG4gICAgICAgICAgICBkZXB0aERvd24uJHNldCh7IHZpc2libGU6IHRydWUgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YiA9IGdldFN1YkluRGlycyhwbHVnaW4ubWFpbkcsIFwiZG93blwiLCBcInVwXCIpO1xyXG4gICAgICAgIGNvbnN0IGNsb3NlZCA9IGdldFJlZmxleGl2ZUNsb3N1cmUoc3ViLCBwbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzKTtcclxuICAgICAgICBjb25zdCBzdWJDbG9zZWQgPSBnZXRTdWJJbkRpcnMoY2xvc2VkLCBcImRvd25cIik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCB7IGNyZWF0ZUluZGV4SW5kZW50IH0gPSBwbHVnaW4uc2V0dGluZ3NcclxuICAgICAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKHN1YkNsb3NlZCwgc291cmNlKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUluZGV4KGFsbFBhdGhzLCBmYWxzZSwgY3JlYXRlSW5kZXhJbmRlbnQpO1xyXG4gICAgICAgIGNvbnN0IGxpbmVzID0gaW5kZXhcclxuICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxyXG4gICAgICAgICAgLm1hcCgobGluZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBbaW5kZW50LCAuLi5jb250ZW50XSA9IGxpbmUuc3BsaXQoXCItIFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQuam9pbihcIi0gXCIpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maWx0ZXIoKHBhaXIpID0+IHBhaXIpO1xyXG4gICAgICAgIGxldCBkZXB0aE1hcERvd24gPSBjcmVhdGVEZXB0aE1hcChhbGxQYXRocywgc291cmNlKTtcclxuICAgICAgICBjb25zdCBtYXhEZXB0aERvd24gPSBNYXRoLm1heCguLi5PYmplY3QudmFsdWVzKGRlcHRoTWFwRG93bikpO1xyXG5cclxuICAgICAgICBkZXB0aERvd24gPSBuZXcgSnVnZ2xEZXB0aCh7XHJcbiAgICAgICAgICB0YXJnZXQ6IHRvb2xiYXJEaXYsXHJcbiAgICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgICBtYXhEZXB0aDogbWF4RGVwdGhEb3duLFxyXG4gICAgICAgICAgICBvblVwZGF0ZURlcHRoOiAoZCkgPT4ge1xyXG4gICAgICAgICAgICAgIHVwZGF0ZURlcHRoKGp1Z2dsRG93biwgZCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBub2Rlc1MgPSBuZXcgU2V0KGxpbmVzKTtcclxuICAgICAgICBub2Rlc1MuYWRkKHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGVzUykubWFwKChzKSA9PiBzICsgXCIubWRcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGFyZ3NEb3duID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gcGx1Z2luLnNldHRpbmdzLmp1Z2dsTGF5b3V0O1xyXG4gICAgICAgIGlmIChsYXlvdXQgPT09IFwiaGllcmFyY2h5XCIpIHtcclxuICAgICAgICAgIGFyZ3NEb3duLmxheW91dCA9IHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBuYW1lOiBcImRhZ3JlXCIsXHJcbiAgICAgICAgICAgIGFuaW1hdGU6IGZhbHNlLFxyXG4gICAgICAgICAgICByYW5rZXI6IChncmFwaCkgPT4ge1xyXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGdyYXBoLl9ub2RlcykuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBWaXpJZC5mcm9tSWQoaWQpLmlkO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gZGVwdGhNYXBEb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgIGdyYXBoLl9ub2Rlc1tpZF0ucmFuayA9IGRlcHRoTWFwRG93bltuYW1lXSArIDE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBncmFwaC5fbm9kZXNbaWRdLnJhbmsgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXJnc0Rvd24ubGF5b3V0ID0gbGF5b3V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc0ZkZ2QgPSBsYXlvdXQgPT09IFwiY29sYVwiIHx8IGxheW91dCA9PT0gXCJkMy1mb3JjZVwiO1xyXG4gICAgICAgIGlmIChpc0ZkZ2QpIHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGFyZ3NEb3duLmZkZ2RMYXlvdXQgPSBsYXlvdXQ7XHJcbiAgICAgICAgICBhcmdzRG93bi5sYXlvdXQgPSBcImZvcmNlLWRpcmVjdGVkXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFyZ3NEb3duLmF1dG9ab29tID0gdHJ1ZTtcclxuICAgICAgICAgIGFyZ3NEb3duLmFuaW1hdGVMYXlvdXQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGp1Z2dsRG93biA9IGNyZWF0ZUp1Z2dsKHBsdWdpbiwgdGFyZ2V0LCBub2RlcywgYXJnc0Rvd24sIGRlcHRoTWFwRG93bik7XHJcblxyXG4gICAgICAgIGlmIChpc0ZkZ2QpIHtcclxuICAgICAgICAgIHpvb21Ub1NvdXJjZShqdWdnbERvd24sIHNvdXJjZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHpvb21Ub0dyYXBoKGp1Z2dsRG93bik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoanVnZ2xVcCkge1xyXG4gICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuW2FtdENoaWxkcmVuXS5hZGRDbGFzcyhcImp1Z2dsLWhpZGVcIik7XHJcbiAgICAgICAgICBkZXB0aFVwLiRzZXQoeyB2aXNpYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgdGl0bGU6IFwiU2hvdyBkb3duIGdyYXBoXCIsXHJcbiAgICB9LFxyXG4gIH0pO1xyXG4gIGNvbnN0IGRlcHRoTWFwVXAgPSBjcmVhdGVEZXB0aE1hcChwYXRocywgc291cmNlLCAxKTtcclxuICBjb25zdCBtYXhEZXB0aFVwID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhkZXB0aE1hcFVwKSk7XHJcblxyXG4gIGxldCBkZXB0aERvd246IEp1Z2dsRGVwdGg7XHJcbiAgY29uc3QgZGVwdGhVcCA9IG5ldyBKdWdnbERlcHRoKHtcclxuICAgIHRhcmdldDogdG9vbGJhckRpdixcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIG1heERlcHRoOiBtYXhEZXB0aFVwLFxyXG4gICAgICBvblVwZGF0ZURlcHRoOiAoZCkgPT4ge1xyXG4gICAgICAgIHVwZGF0ZURlcHRoKGp1Z2dsVXAsIGQpO1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgLy8gbmV3IEp1Z2dsQnV0dG9uKHtcclxuICAvLyAgICAgdGFyZ2V0OiBzZWN0RGl2LFxyXG4gIC8vICAgICBwcm9wczoge1xyXG4gIC8vICAgICAgICAgaWNvbjogXCJcdTI2RjZcIixcclxuICAvLyAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhlcmVcIilcclxuICAvLyAgICAgICAgICAgICB0YXJnZXQuY2hpbGRyZW5bMV0uYWRkQ2xhc3MoXCJqdWdnbC1mdWxsLXNjcmVlblwiKVxyXG4gIC8vICAgICAgICAgICAgIHRhcmdldC5jaGlsZHJlblsxXS5zZXRBdHRyKFwic3R5bGVcIiwgXCJcIik7XHJcbiAgLy8gICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gIC8vICAgICAgICAgdGl0bGU6IFwiRnVsbCBoZWlnaHRcIlxyXG4gIC8vICAgICB9XHJcbiAgLy8gfSk7XHJcbiAgbGV0IG5vZGVzID0gQXJyYXkuZnJvbShcclxuICAgIG5ldyBTZXQocGF0aHMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2LmNvbmNhdChjdXJyKSwgW10pKVxyXG4gICk7XHJcblxyXG4gIG5vZGVzLnB1c2goc291cmNlKTtcclxuICBub2RlcyA9IG5vZGVzLm1hcCgocykgPT4gcyArIFwiLm1kXCIpO1xyXG5cclxuICBjb25zdCBhcmdzVXA6IElKdWdnbFNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgYXJncyk7XHJcblxyXG4gIGNvbnN0IGxheW91dCA9IHBsdWdpbi5zZXR0aW5ncy5qdWdnbExheW91dDtcclxuICBpZiAobGF5b3V0ID09PSBcImhpZXJhcmNoeVwiKSB7XHJcbiAgICBhcmdzVXAubGF5b3V0ID0ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIG5hbWU6IFwiZGFncmVcIixcclxuICAgICAgYW5pbWF0ZTogZmFsc2UsXHJcbiAgICAgIHJhbmtlcjogKGdyYXBoKSA9PiB7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JhcGguX25vZGVzKS5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmFtZSA9IFZpeklkLmZyb21JZChpZCkuaWQ7XHJcbiAgICAgICAgICBpZiAobmFtZSBpbiBkZXB0aE1hcFVwKSB7XHJcbiAgICAgICAgICAgIGdyYXBoLl9ub2Rlc1tpZF0ucmFuayA9IG1heERlcHRoVXAgLSBkZXB0aE1hcFVwW25hbWVdICsgMTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdyYXBoLl9ub2Rlc1tpZF0ucmFuayA9IG1heERlcHRoVXAgKyAyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgYXJnc1VwLmxheW91dCA9IGxheW91dDtcclxuICB9XHJcbiAgY29uc3QgaXNGZGdkID0gbGF5b3V0ID09PSBcImNvbGFcIiB8fCBsYXlvdXQgPT09IFwiZDMtZm9yY2VcIjtcclxuICBpZiAoaXNGZGdkKSB7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBhcmdzVXAuZmRnZExheW91dCA9IGxheW91dDtcclxuICAgIGFyZ3NVcC5sYXlvdXQgPSBcImZvcmNlLWRpcmVjdGVkXCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIGFyZ3NVcC5hdXRvWm9vbSA9IHRydWU7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBhcmdzVXAuYW5pbWF0ZUxheW91dCA9IGZhbHNlO1xyXG4gIH1cclxuICBqdWdnbFVwID0gY3JlYXRlSnVnZ2wocGx1Z2luLCB0YXJnZXQsIG5vZGVzLCBhcmdzVXAsIGRlcHRoTWFwVXApO1xyXG4gIGlmIChpc0ZkZ2QpIHtcclxuICAgIHpvb21Ub1NvdXJjZShqdWdnbFVwLCBzb3VyY2UpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB6b29tVG9HcmFwaChqdWdnbFVwKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBjb3B5IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBkZnNBbGxQYXRocywgZ2V0U2lua3MsIGdldFN1YkluRGlycyB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEN1cnJGaWxlLCBtYWtlV2lraSB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGNvcHkgb2YgYGluZGV4YCwgZG9lc24ndCBtdXRhdGUuXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5kZXhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGlhc2VzVG9JbmRleChwbHVnaW46IEJDUGx1Z2luLCBpbmRleDogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBhbGlhc2VzSW5JbmRleCB9ID0gcGx1Z2luLnNldHRpbmdzO1xyXG5cclxuICBjb25zdCBsaW5lcyA9IGluZGV4LnNsaWNlKCkuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gIGlmIChhbGlhc2VzSW5JbmRleCkge1xyXG4gICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xyXG4gICAgICBjb25zdCBbaW5kZW50LCAuLi5jb250ZW50XSA9IGxpbmUuc3BsaXQoXCItIFwiKTtcclxuICAgICAgY29uc3Qgbm90ZSA9IGNvbnRlbnQuam9pbihcIi0gXCIpO1xyXG4gICAgICBpZiAoIW5vdGUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgY3VyckZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChub3RlLCBcIlwiKTtcclxuXHJcbiAgICAgIGlmIChjdXJyRmlsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGN1cnJGaWxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgYWxpYXM6IHN0cmluZ1tdID0gY2FjaGU/LmZyb250bWF0dGVyPy5hbGlhcyA/PyBbXTtcclxuICAgICAgICBjb25zdCBhbGlhc2VzOiBzdHJpbmdbXSA9IGNhY2hlPy5mcm9udG1hdHRlcj8uYWxpYXNlcyA/PyBbXTtcclxuXHJcbiAgICAgICAgY29uc3QgYWxsQWxpYXNlczogc3RyaW5nW10gPSBbLi4uW2FsaWFzXS5mbGF0KDMpLCAuLi5bYWxpYXNlc10uZmxhdCgzKV07XHJcbiAgICAgICAgaWYgKGFsbEFsaWFzZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBsaW5lICs9IGAgKCR7YWxsQWxpYXNlcy5qb2luKFwiLCBcIil9KWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGluZGV4IG9mIGFsbCB0aGUgcGF0aHMgaW4gdGhlIGdyYXBoLlxyXG4gKiBAcGFyYW0gYWxsUGF0aHMgLSBBIGxpc3Qgb2YgYWxsIHBhdGhzIGZyb20gdGhlIHJvb3QgdG8gdGhlIGxlYXZlcy5cclxuICogQHBhcmFtIHtib29sZWFufSBhc1dpa2lsaW5rcyAtIFdoZXRoZXIgdG8gdXNlIHdpa2lsaW5rcyBpbnN0ZWFkIG9mIHBsYWluIHRleHQuXHJcbiAqIEByZXR1cm5zIEEgc3RyaW5nLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluZGV4KFxyXG4gIGFsbFBhdGhzOiBzdHJpbmdbXVtdLFxyXG4gIGFzV2lraWxpbmtzOiBib29sZWFuLFxyXG4gIGluZGVudCA9IFwiICBcIlxyXG4pOiBzdHJpbmcge1xyXG4gIGxldCBpbmRleCA9IFwiXCI7XHJcbiAgY29uc3QgY29weSA9IGNsb25lRGVlcChhbGxQYXRocyk7XHJcbiAgY29uc3QgcmV2ZXJzZWQgPSBjb3B5Lm1hcCgocGF0aCkgPT4gcGF0aC5yZXZlcnNlKCkpO1xyXG4gIHJldmVyc2VkLmZvckVhY2goKHBhdGgpID0+IHBhdGguc2hpZnQoKSk7XHJcblxyXG4gIGNvbnN0IHJlYWxJbmRlbnQgPSBpbmRlbnQgPT09ICdcXFxcdCcgPyAnXFx0JyA6IGluZGVudDtcclxuXHJcbiAgY29uc3QgdmlzaXRlZDoge1xyXG4gICAgW25vZGU6IHN0cmluZ106IC8qKiBUaGUgZGVwdGhzIGF0IHdoaWNoIGBub2RlYCB3YXMgdmlzaXRlZCAqLyBudW1iZXJbXTtcclxuICB9ID0ge307XHJcblxyXG4gIHJldmVyc2VkLmZvckVhY2goKHBhdGgpID0+IHtcclxuICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCBwYXRoLmxlbmd0aDsgZGVwdGgrKykge1xyXG4gICAgICBjb25zdCBjdXJyTm9kZSA9IHBhdGhbZGVwdGhdO1xyXG5cclxuICAgICAgLy8gSWYgdGhhdCBub2RlIGhhcyBiZWVuIHZpc2l0ZWQgYmVmb3JlIGF0IHRoZSBjdXJyZW50IGRlcHRoXHJcbiAgICAgIGlmIChcclxuICAgICAgICB2aXNpdGVkLmhhc093blByb3BlcnR5KGN1cnJOb2RlKSAmJlxyXG4gICAgICAgIHZpc2l0ZWRbY3Vyck5vZGVdLmluY2x1ZGVzKGRlcHRoKVxyXG4gICAgICApIGNvbnRpbnVlXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGluZGV4ICs9IGAke3JlYWxJbmRlbnQucmVwZWF0KGRlcHRoKX0tICR7YXNXaWtpbGlua3MgPyBtYWtlV2lraShjdXJyTm9kZSkgOiBjdXJyTm9kZVxyXG4gICAgICAgICAgfVxcbmA7XHJcblxyXG4gICAgICAgIGlmICghdmlzaXRlZC5oYXNPd25Qcm9wZXJ0eShjdXJyTm9kZSkpIHZpc2l0ZWRbY3Vyck5vZGVdID0gW107XHJcbiAgICAgICAgdmlzaXRlZFtjdXJyTm9kZV0ucHVzaChkZXB0aCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gaW5kZXg7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5TG9jYWxJbmRleChwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncywgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgd2lraWxpbmtJbmRleCwgY3JlYXRlSW5kZXhJbmRlbnQgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IHsgYmFzZW5hbWUgfSA9IGdldEN1cnJGaWxlKClcclxuXHJcbiAgY29uc3Qgb25seURvd25zID0gZ2V0U3ViSW5EaXJzKGNsb3NlZEcsIFwiZG93blwiKTtcclxuICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKG9ubHlEb3ducywgYmFzZW5hbWUpO1xyXG4gIGNvbnN0IGluZGV4ID0gYWRkQWxpYXNlc1RvSW5kZXgocGx1Z2luLCBjcmVhdGVJbmRleChhbGxQYXRocywgd2lraWxpbmtJbmRleCwgY3JlYXRlSW5kZXhJbmRlbnQpKTtcclxuXHJcbiAgaW5mbyh7IGluZGV4IH0pO1xyXG4gIGF3YWl0IGNvcHkoaW5kZXgpO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weUdsb2JhbEluZGV4KHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzLCBjbG9zZWRHIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB3aWtpbGlua0luZGV4LCBjcmVhdGVJbmRleEluZGVudCB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IG9ubHlEb3ducyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBcImRvd25cIik7XHJcbiAgY29uc3Qgb25seVVwcyA9IGdldFN1YkluRGlycyhjbG9zZWRHLCBcInVwXCIpO1xyXG5cclxuICBjb25zdCBzaW5rcyA9IGdldFNpbmtzKG9ubHlVcHMpO1xyXG5cclxuICBsZXQgZ2xvYmFsSW5kZXggPSBcIlwiO1xyXG4gIHNpbmtzLmZvckVhY2goKHRlcm1pbmFsKSA9PiB7XHJcbiAgICBnbG9iYWxJbmRleCArPSB0ZXJtaW5hbCArIFwiXFxuXCI7XHJcbiAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKG9ubHlEb3ducywgdGVybWluYWwpO1xyXG4gICAgZ2xvYmFsSW5kZXggKz1cclxuICAgICAgYWRkQWxpYXNlc1RvSW5kZXgocGx1Z2luLCBjcmVhdGVJbmRleChhbGxQYXRocywgd2lraWxpbmtJbmRleCwgY3JlYXRlSW5kZXhJbmRlbnQpKSArIFwiXFxuXCI7XHJcbiAgfSk7XHJcblxyXG4gIGluZm8oeyBnbG9iYWxJbmRleCB9KTtcclxuICBhd2FpdCBjb3B5KGdsb2JhbEluZGV4KTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGluZGV4VG9MaW5lUGFpcnMgPSAoXHJcbiAgaW5kZXg6IHN0cmluZyxcclxuICBmbGF0ID0gZmFsc2VcclxuKTogW3N0cmluZywgc3RyaW5nXVtdID0+XHJcbiAgaW5kZXhcclxuICAgIC5zcGxpdChcIlxcblwiKVxyXG4gICAgLm1hcCgobGluZSkgPT4ge1xyXG4gICAgICBjb25zdCBbaW5kZW50LCAuLi5jb250ZW50XSA9IGxpbmUuc3BsaXQoXCItIFwiKTtcclxuICAgICAgcmV0dXJuIFtmbGF0ID8gXCJcIiA6IGluZGVudCwgY29udGVudC5qb2luKFwiLSBcIildIGFzIFtcclxuICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgc3RyaW5nXHJcbiAgICAgIF07XHJcbiAgICB9KVxyXG4gICAgLmZpbHRlcigocGFpcikgPT4gcGFpclsxXSAhPT0gXCJcIik7XHJcbiIsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGV4cG9ydCBsZXQgaWNvbjtcclxuICBleHBvcnQgbGV0IG9uQ2xpY2s6ICgpID0+IHZvaWQ7XHJcbiAgZXhwb3J0IGxldCBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIGV4cG9ydCBsZXQgdGl0bGUgPSBcIlwiO1xyXG5cclxuICAkOiByZW5kZXJlZEljb24gPSBpY29uO1xyXG48L3NjcmlwdD5cclxuXHJcbjxidXR0b25cclxuICB0eXBlPVwiYnV0dG9uXCJcclxuICBjbGFzcz1cImp1Z2dsLWJ1dHRvblwiXHJcbiAgb246Y2xpY2s9e29uQ2xpY2t9XHJcbiAgYXJpYS1sYWJlbD17dGl0bGV9XHJcbiAge2Rpc2FibGVkfVxyXG4+XHJcbiAge3JlbmRlcmVkSWNvbn1cclxuPC9idXR0b24+XHJcbiIsIG51bGwsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCBKdWdnbEJ1dHRvbiBmcm9tIFwiLi9KdWdnbEJ1dHRvbi5zdmVsdGVcIjtcclxuXHJcbiAgZXhwb3J0IGxldCB2aXNpYmxlID0gdHJ1ZTtcclxuICBleHBvcnQgbGV0IG1heERlcHRoOiBudW1iZXI7XHJcbiAgZXhwb3J0IGxldCBvblVwZGF0ZURlcHRoOiAoZGVwdGg6IG51bWJlcikgPT4gdm9pZDtcclxuXHJcbiAgbGV0IGRlcHRoID0gbWF4RGVwdGg7XHJcbjwvc2NyaXB0PlxyXG5cclxueyNpZiB2aXNpYmxlfVxyXG4gIDxkaXYgY2xhc3M9XCJjeS10b29sYmFyLXNlY3Rpb25cIj5cclxuICAgIDxKdWdnbEJ1dHRvblxyXG4gICAgICBpY29uPVwiLVwiXHJcbiAgICAgIGRpc2FibGVkPXtkZXB0aCA8PSAwfVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgZGVwdGggLT0gMTtcclxuICAgICAgICBvblVwZGF0ZURlcHRoKGRlcHRoKTtcclxuICAgICAgfX1cclxuICAgIC8+XHJcblxyXG4gICAgPEp1Z2dsQnV0dG9uIGljb249e2RlcHRofSBkaXNhYmxlZD17dHJ1ZX0gb25DbGljaz17bnVsbH0gLz5cclxuXHJcbiAgICA8SnVnZ2xCdXR0b25cclxuICAgICAgaWNvbj1cIitcIlxyXG4gICAgICBkaXNhYmxlZD17ZGVwdGggPj0gbWF4RGVwdGh9XHJcbiAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICBkZXB0aCArPSAxO1xyXG4gICAgICAgIG9uVXBkYXRlRGVwdGgoZGVwdGgpO1xyXG4gICAgICB9fVxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuey9pZn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG4gIGltcG9ydCB0eXBlIE1hdHJpeFZpZXcgZnJvbSBcIi4uL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBtYXRyaXhWaWV3OiBNYXRyaXhWaWV3O1xyXG5cclxuICBjb25zdCB7IHBsdWdpbiB9ID0gbWF0cml4VmlldztcclxuICBjb25zdCB7IGFscGhhU29ydEFzYywgZW5hYmxlQWxwaGFTb3J0IH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGJ1dHRvblxyXG4gIGNsYXNzPVwiQkMtcmVmcmVzaC1idXR0b25cIlxyXG4gIGFyaWEtbGFiZWw9XCJSZWZyZXNoIEluZGV4XCJcclxuICBvbjpjbGljaz17YXN5bmMgKCkgPT4gYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbil9XHJcbj5cclxuICBcdTIxQkJcclxuPC9idXR0b24+XHJcblxyXG57I2lmIGVuYWJsZUFscGhhU29ydH1cclxuICA8YnV0dG9uXHJcbiAgICBjbGFzcz1cIkJDLXNvcnQtYnV0dG9uXCJcclxuICAgIGFyaWEtbGFiZWw9XCJBbHBoYWJldGljYWwgU29ydGluZyBPcmRlclwiXHJcbiAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICBwbHVnaW4uc2V0dGluZ3MuYWxwaGFTb3J0QXNjID0gIWFscGhhU29ydEFzYztcclxuICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICBhd2FpdCBtYXRyaXhWaWV3LmRyYXcoKTtcclxuICAgIH19XHJcbiAgPlxyXG4gICAge2FscGhhU29ydEFzYyA/IFwiXHUyMTk3XCIgOiBcIlx1MjE5OFwifVxyXG4gIDwvYnV0dG9uPlxyXG57L2lmfVxyXG5cclxuPHN0eWxlPlxyXG4gIGJ1dHRvbiB7XHJcbiAgICBwYWRkaW5nOiAxcHggNnB4IDJweCA2cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDZweDtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuICBpbXBvcnQgeyBob3ZlclByZXZpZXcsIG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbiAgaW1wb3J0IE1hdHJpeEJ1dHRvbnMgZnJvbSBcIi4vTWF0cml4QnV0dG9ucy5zdmVsdGVcIjtcclxuICBpbXBvcnQgdHlwZSB7IFNxdWFyZVByb3BzIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgeyBkcm9wUGF0aE5EZW5kcm9uIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG4gIGltcG9ydCB0eXBlIE1hdHJpeFZpZXcgZnJvbSBcIi4uL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBoaWVyU3F1YXJlczogU3F1YXJlUHJvcHNbXVtdO1xyXG4gIGV4cG9ydCBsZXQgY3VyckZpbGU6IFRGaWxlO1xyXG4gIGV4cG9ydCBsZXQgbWF0cml4VmlldzogTWF0cml4VmlldztcclxuXHJcbiAgY29uc3QgeyBwbHVnaW4gfSA9IG1hdHJpeFZpZXc7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG5cclxuICBjb25zdCB7XHJcbiAgICBzaG93SW1wbGllZFJlbGF0aW9ucyxcclxuICAgIHJsTGVhZixcclxuICAgIHRyZWF0Q3Vyck5vZGVBc0ltcGxpZWRTaWJsaW5nLFxyXG4gICAgc2hvd1JlbGF0aW9uVHlwZSxcclxuICB9ID0gc2V0dGluZ3M7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIkJDLW1hdHJpeC1idXR0b25zXCI+XHJcbiAgPE1hdHJpeEJ1dHRvbnMge21hdHJpeFZpZXd9IC8+XHJcbjwvZGl2PlxyXG5cclxuPGRpdlxyXG4gIGNsYXNzPVwiQkMtTWF0cml4ICBtYXJrZG93bi1wcmV2aWV3LXZpZXcge2hpZXJTcXVhcmVzLmxlbmd0aFxyXG4gICAgPyAnJ1xyXG4gICAgOiAnQkMtZW1wdHktdmlldyd9XCJcclxuPlxyXG4gIHsjZWFjaCBoaWVyU3F1YXJlcyBhcyBzcXVhcmVzfVxyXG4gICAgPGRpdiBjbGFzcz1cIkJDLW1hdHJpeC1oaWVyXCI+XHJcbiAgICAgIHsjZWFjaCBzcXVhcmVzIGFzIHsgZmllbGQsIGltcGxpZWRJdGVtcywgcmVhbEl0ZW1zIH19XHJcbiAgICAgICAgeyNpZiByZWFsSXRlbXMubGVuZ3RoIHx8IChzaG93SW1wbGllZFJlbGF0aW9ucyAmJiBpbXBsaWVkSXRlbXMubGVuZ3RoKX1cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJCQy1NYXRyaXgtc3F1YXJlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyc1wiPlxyXG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cIkJDLU1hdHJpeC1oZWFkZXJcIj57ZmllbGR9PC9oND5cclxuXHJcbiAgICAgICAgICAgICAgeyNpZiBzaG93UmVsYXRpb25UeXBlfVxyXG4gICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiQkMtTWF0cml4LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICB7cmVhbEl0ZW1zLmxlbmd0aCA/IFwiUmVhbFwiIDogXCJJbXBsaWVkXCJ9XHJcbiAgICAgICAgICAgICAgICA8L2g2PlxyXG4gICAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7I2lmIHJlYWxJdGVtcy5sZW5ndGh9XHJcbiAgICAgICAgICAgICAgPG9sPlxyXG4gICAgICAgICAgICAgICAgeyNlYWNoIHJlYWxJdGVtcyBhcyB7IGFsdCwgY2xzLCBpbXBsaWVkLCB0byB9fVxyXG4gICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktdW5rbm93bi1hcmlhLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie2Nsc30ge2ltcGxpZWQgPz8gJyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKHRvLCBlKX1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGV2ZW50KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBob3ZlclByZXZpZXcoZXZlbnQsIG1hdHJpeFZpZXcsIHRvKX1cclxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2FsdCA/IHRvIDogXCJcIn1cclxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWwtcG9zaXRpb249e3JsTGVhZiA/IFwibGVmdFwiIDogXCJyaWdodFwifVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHthbHQgPz8gZHJvcFBhdGhORGVuZHJvbih0bywgc2V0dGluZ3MpfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgey9lYWNofVxyXG4gICAgICAgICAgICAgIDwvb2w+XHJcbiAgICAgICAgICAgIHsvaWZ9XHJcblxyXG4gICAgICAgICAgICB7I2lmIHNob3dJbXBsaWVkUmVsYXRpb25zICYmIGltcGxpZWRJdGVtcy5sZW5ndGh9XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkJDLU1hdHJpeC1oZWFkZXJzXCI+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJCQy1NYXRyaXgtaGVhZGVyXCI+e1wiIFwifTwvaDQ+XHJcbiAgICAgICAgICAgICAgICB7I2lmIGltcGxpZWRJdGVtcy5sZW5ndGh9XHJcbiAgICAgICAgICAgICAgICAgIHsjaWYgc2hvd1JlbGF0aW9uVHlwZSAmJiByZWFsSXRlbXMubGVuZ3RofVxyXG4gICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIkJDLU1hdHJpeC1oZWFkZXJcIj5JbXBsaWVkPC9oNj5cclxuICAgICAgICAgICAgICAgICAgey9pZn1cclxuICAgICAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG9sIHN0YXJ0PXtyZWFsSXRlbXMubGVuZ3RoICsgMX0+XHJcbiAgICAgICAgICAgICAgICB7I2VhY2ggaW1wbGllZEl0ZW1zIGFzIHsgYWx0LCBjbHMsIGltcGxpZWQsIHRvLCBwYXJlbnQgfX1cclxuICAgICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJCQy1JbXBsaWVkIHt0cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRvID09PSBjdXJyRmlsZS5iYXNlbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnQkMtYWN0aXZlLW5vdGUnXHJcbiAgICAgICAgICAgICAgICAgICAgICA6ICcnfVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS11bmtub3duLWFyaWEtYXR0cmlidXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1vdXNlLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7Y2xzfSB7aW1wbGllZCA/PyAnJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2godG8sIGUpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIG1hdHJpeFZpZXcsIHRvKX1cclxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9eyhhbHQgPyBgJHt0b31cXG5gIDogXCJcIikgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50ID8gXCJcdTIxOTEgXCIgKyBwYXJlbnQgOiBcIlwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWwtcG9zaXRpb249e3JsTGVhZiA/IFwibGVmdFwiIDogXCJyaWdodFwifVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHthbHQgPz8gZHJvcFBhdGhORGVuZHJvbih0bywgc2V0dGluZ3MpfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgey9lYWNofVxyXG4gICAgICAgICAgICAgIDwvb2w+XHJcbiAgICAgICAgICAgIHsvaWZ9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB7L2lmfVxyXG4gICAgICB7L2VhY2h9XHJcbiAgICA8L2Rpdj5cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIC5CQy1NYXRyaXgge1xyXG4gICAgcGFkZGluZzogNXB4O1xyXG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjU7XHJcbiAgfVxyXG4gIC5CQy1NYXRyaXggPiBkaXYge1xyXG4gICAgYm9yZGVyOiAzcHggc29saWQgdmFyKC0tYmFja2dyb3VuZC1tb2RpZmllci1ib3JkZXIpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgLyogdGV4dC1hbGlnbjogY2VudGVyOyAqL1xyXG4gICAgbWFyZ2luOiAzcHg7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBoZWlnaHQ6IGZpdC1jb250ZW50O1xyXG4gIH1cclxuXHJcbiAgLyogLkJDLW1hdHJpeCBkaXYge1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICB9ICovXHJcblxyXG4gIC5CQy1NYXRyaXgtc3F1YXJlIHtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKTtcclxuICB9XHJcblxyXG4gIC5CQy1NYXRyaXgtaGVhZGVycyB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICB9XHJcbiAgLkJDLU1hdHJpeC1oZWFkZXIge1xyXG4gICAgbWFyZ2luOiAycHg7XHJcbiAgICBwYWRkaW5nOiAwcHggMTBweDtcclxuICB9XHJcbiAgaDQuQkMtTWF0cml4LWhlYWRlcjpmaXJzdC1sZXR0ZXIge1xyXG4gICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XHJcbiAgfVxyXG5cclxuICBvbCB7XHJcbiAgICBtYXJnaW46IDNweDtcclxuICAgIHBhZGRpbmctbGVmdDogMzBweDtcclxuICB9XHJcblxyXG4gIC5CQy1NYXRyaXggbGkge1xyXG4gICAgbWFyZ2luOiAwLjFlbTtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgdHlwZSB7IE11bHRpR3JhcGggfSBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBBUlJPV19ESVJFQ1RJT05TLCBESVJFQ1RJT05TIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNBUElJLCBEaXJlY3Rpb25zLCBVc2VySGllciB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5pbXBvcnQgeyBnZXRNYXRyaXhOZWlnaGJvdXJzIH0gZnJvbSBcIi4vVmlld3MvTWF0cml4Vmlld1wiO1xyXG5pbXBvcnQge1xyXG4gIGJ1aWxkT2JzR3JhcGgsXHJcbiAgZGZzQWxsUGF0aHMsXHJcbiAgZ2V0U3ViRm9yRmllbGRzLFxyXG4gIGdldFN1YkluRGlycyxcclxufSBmcm9tIFwiLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgZ2V0RmllbGRJbmZvLFxyXG4gIGdldEZpZWxkcyxcclxuICBnZXRPcHBEaXIsXHJcbiAgZ2V0T3BwRmllbGRzLFxyXG4gIGl0ZXJhdGVIaWVycyxcclxufSBmcm9tIFwiLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSW5kZXggfSBmcm9tIFwiLi9Db21tYW5kcy9DcmVhdGVJbmRleFwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0Q3VyckZpbGUgfSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQkNBUEkgaW1wbGVtZW50cyBCQ0FQSUkge1xyXG5cclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIG1haW5HOiBNdWx0aUdyYXBoO1xyXG4gIGNsb3NlZEc6IE11bHRpR3JhcGg7XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcblxyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLm1haW5HID0gdGhpcy5wbHVnaW4ubWFpbkc7XHJcbiAgICB0aGlzLmNsb3NlZEcgPSB0aGlzLnBsdWdpbi5jbG9zZWRHO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIERJUkVDVElPTlMgPSBESVJFQ1RJT05TO1xyXG4gIHB1YmxpYyBBUlJPV19ESVJFQ1RJT05TID0gQVJST1dfRElSRUNUSU9OUztcclxuXHJcbiAgcHVibGljIGJ1aWxkT2JzR3JhcGggPSBidWlsZE9ic0dyYXBoO1xyXG5cclxuICBwdWJsaWMgcmVmcmVzaEluZGV4ID0gYXN5bmMgKCkgPT4gYXdhaXQgcmVmcmVzaEluZGV4KHRoaXMucGx1Z2luKVxyXG5cclxuICBwdWJsaWMgZ2V0U3ViSW5EaXJzID0gKGRpcnM6IERpcmVjdGlvbnNbXSwgZyA9IHRoaXMubWFpbkcpID0+XHJcbiAgICBnZXRTdWJJbkRpcnMoZywgLi4uZGlycyk7XHJcblxyXG4gIHB1YmxpYyBnZXRTdWJGb3JGaWVsZHMgPSAoZmllbGRzOiBzdHJpbmdbXSwgZyA9IHRoaXMubWFpbkcpID0+XHJcbiAgICBnZXRTdWJGb3JGaWVsZHMoZywgZmllbGRzKTtcclxuXHJcbiAgcHVibGljIGRmc0FsbFBhdGhzID0gKFxyXG4gICAgZnJvbU5vZGUgPSBnZXRDdXJyRmlsZSgpPy5iYXNlbmFtZSxcclxuICAgIGcgPSB0aGlzLm1haW5HXHJcbiAgKSA9PiBkZnNBbGxQYXRocyhnLCBmcm9tTm9kZSk7XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVJbmRleCA9IChhbGxQYXRoczogc3RyaW5nW11bXSwgd2lraWxpbmtzID0gZmFsc2UsIGluZGVudCA9ICcgICcpID0+XHJcbiAgICBjcmVhdGVJbmRleChhbGxQYXRocywgd2lraWxpbmtzLCBpbmRlbnQpO1xyXG5cclxuICBwdWJsaWMgZ2V0TWF0cml4TmVpZ2hib3VycyA9IChcclxuICAgIGZyb21Ob2RlID0gZ2V0Q3VyckZpbGUoKT8uYmFzZW5hbWVcclxuICApID0+IGdldE1hdHJpeE5laWdoYm91cnModGhpcy5wbHVnaW4sIGZyb21Ob2RlKTtcclxuXHJcbiAgcHVibGljIGdldE9wcERpciA9IChkaXI6IERpcmVjdGlvbnMpID0+IGdldE9wcERpcihkaXIpO1xyXG5cclxuICBwdWJsaWMgZ2V0T3BwRmllbGRzID0gKGZpZWxkOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IHsgZmllbGREaXIgfSA9IGdldEZpZWxkSW5mbyh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VySGllcnMsIGZpZWxkKTtcclxuICAgIHJldHVybiBnZXRPcHBGaWVsZHModGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBmaWVsZCwgZmllbGREaXIpO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBnZXRGaWVsZEluZm8gPSAoZmllbGQ6IHN0cmluZykgPT5cclxuICAgIGdldEZpZWxkSW5mbyh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VySGllcnMsIGZpZWxkKTtcclxuICBwdWJsaWMgZ2V0RmllbGRzID0gKGRpcj86IERpcmVjdGlvbnMpID0+XHJcbiAgICBnZXRGaWVsZHModGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzLCBkaXIgPz8gXCJhbGxcIik7XHJcblxyXG4gIHB1YmxpYyBpdGVyYXRlSGllcnMoXHJcbiAgICBjYjogKGhpZXI6IFVzZXJIaWVyLCBkaXI6IERpcmVjdGlvbnMsIGZpZWxkOiBzdHJpbmcpID0+IHZvaWRcclxuICApIHtcclxuICAgIGl0ZXJhdGVIaWVycyh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VySGllcnMsIGNiKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IEZ1enp5TWF0Y2gsIEZ1enp5U3VnZ2VzdE1vZGFsLCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5Tm90ZU1hbmlwdWxhdG9yIH0gZnJvbSBcIi4vSGllcmFyY2h5Tm90ZU1hbmlwdWxhdG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgQkNTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi8uLi9tYWluXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSGllcmFyY2h5Tm90ZVNlbGVjdG9yTW9kYWwgZXh0ZW5kcyBGdXp6eVN1Z2dlc3RNb2RhbDxzdHJpbmc+IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHNldHRpbmdzOiBCQ1NldHRpbmdzO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKFwiSE4gQ2hvb3NlclwiKTtcclxuICAgIGNvbnN0IHsgaGllcmFyY2h5Tm90ZXMgfSA9IHRoaXMuc2V0dGluZ3M7XHJcbiAgICBpZiAoaGllcmFyY2h5Tm90ZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgbmV3IE5vdGljZShcIk5vIGhpZXJhcmNoeSBub3RlcyBmb3VuZFwiKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGhpZXJhcmNoeU5vdGVzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAhaGllcmFyY2h5Tm90ZXNbMF0uZW5kc1dpdGgoXCIvXCIpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICBuZXcgSGllcmFyY2h5Tm90ZU1hbmlwdWxhdG9yKFxyXG4gICAgICAgIHRoaXMucGx1Z2luLFxyXG4gICAgICAgIGhpZXJhcmNoeU5vdGVzWzBdXHJcbiAgICAgICkub3BlbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3VwZXIub25PcGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtcygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCB7IGhpZXJhcmNoeU5vdGVzIH0gPSB0aGlzLnNldHRpbmdzO1xyXG4gICAgaWYgKGhpZXJhcmNoeU5vdGVzLmxlbmd0aCA9PSAxICYmIGhpZXJhcmNoeU5vdGVzWzBdLmVuZHNXaXRoKFwiL1wiKSkge1xyXG4gICAgICAvLyB0aGlzIGlzIGEgZm9sZGVyXHJcbiAgICAgIGxldCBmb2xkZXIgPSBoaWVyYXJjaHlOb3Rlc1swXS5zbGljZSgwLCAtMSk7XHJcbiAgICAgIGlmIChhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGxldCBwYWdlcyA9IGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcuYXBpLnBhZ2VzKFxyXG4gICAgICAgICAgYFwiJHtmb2xkZXJ9XCJgXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gcGFnZXMudmFsdWVzLm1hcCgocGFnZSkgPT4gcGFnZS5maWxlLnBhdGgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoXCJtYWtlIHN1cmUgeW91IGhhdmUgZGF0YXZpZXcgZW5hYmxlZFwiKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHJldHVybiBoaWVyYXJjaHlOb3RlcztcclxuICB9XHJcblxyXG4gIGdldEl0ZW1UZXh0KGl0ZW06IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7aXRlbX1gO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPHN0cmluZz4sIGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgc3VwZXIucmVuZGVyU3VnZ2VzdGlvbihpdGVtLCBlbCk7XHJcbiAgfVxyXG5cclxuICBvbkNob29zZUl0ZW0oaXRlbTogc3RyaW5nLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBuZXcgSGllcmFyY2h5Tm90ZU1hbmlwdWxhdG9yKHRoaXMucGx1Z2luLCBpdGVtKS5vcGVuKCk7XHJcbiAgICB0aGlzLmNsb3NlKCk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQgeyBlcnJvciwgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQge1xyXG4gIEZ1enp5TWF0Y2gsXHJcbiAgRnV6enlTdWdnZXN0TW9kYWwsXHJcbiAgTGlzdEl0ZW1DYWNoZSxcclxuICBNYXJrZG93blZpZXcsXHJcbiAgTm90aWNlLFxyXG4gIFRGaWxlLFxyXG59IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBkcm9wV2lraWxpbmtzIH0gZnJvbSBcIi4uLy4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuaW1wb3J0IHsgTW9kaWZ5SGllckl0ZW1Nb2RhbCB9IGZyb20gXCIuL01vZGlmeUhpZXJJdGVtTW9kYWxcIjtcclxuXHJcbmludGVyZmFjZSBITkl0ZW0ge1xyXG4gIGRlcHRoOiBudW1iZXI7XHJcbiAgbGluZTogc3RyaW5nO1xyXG4gIGxpbmVObzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSGllcmFyY2h5Tm90ZU1hbmlwdWxhdG9yIGV4dGVuZHMgRnV6enlTdWdnZXN0TW9kYWw8SE5JdGVtPiB7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBzZXR0aW5nczogQkNTZXR0aW5ncztcclxuICBoaWVyTm90ZU5hbWU6IHN0cmluZztcclxuICBsaW5lczogc3RyaW5nW107XHJcbiAgbGlzdEl0ZW1zOiBMaXN0SXRlbUNhY2hlW107XHJcbiAgZmlsZTogVEZpbGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQkNQbHVnaW4sIGhpZXJOb3RlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3M7XHJcbiAgICB0aGlzLmhpZXJOb3RlTmFtZSA9IGhpZXJOb3RlTmFtZTtcclxuXHJcbiAgICBjb25zdCBjaG9vc2VPdmVycmlkZSA9IChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLmNob29zZXIudXNlU2VsZWN0ZWRJdGVtKGV2dCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtdLCBcIkRlbGV0ZVwiLCBjaG9vc2VPdmVycmlkZSk7XHJcbiAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIlNoaWZ0XCJdLCBcIkFycm93VXBcIiwgY2hvb3NlT3ZlcnJpZGUpO1xyXG4gICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJTaGlmdFwiXSwgXCJBcnJvd1JpZ2h0XCIsIGNob29zZU92ZXJyaWRlKTtcclxuICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiU2hpZnRcIl0sIFwiQXJyb3dEb3duXCIsIGNob29zZU92ZXJyaWRlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoXCJITiBNYW5pcHVsYXRvclwiKTtcclxuICAgIHRoaXMuc2V0SW5zdHJ1Y3Rpb25zKFtcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgRW50ZXJcIiwgcHVycG9zZTogXCJKdW1wIHRvIGl0ZW1cIiB9LFxyXG4gICAgICB7IGNvbW1hbmQ6IFwiU2hpZnQgKyBcdTIxOTFcIiwgcHVycG9zZTogXCJBZGQgcGFyZW50XCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIlNoaWZ0ICsgXHUyMTkyXCIsIHB1cnBvc2U6IFwiQWRkIHNpYmxpbmdcIiB9LFxyXG4gICAgICB7IGNvbW1hbmQ6IFwiU2hpZnQgKyBcdTIxOTMgLyBFbnRlciAvIENsaWNrXCIsIHB1cnBvc2U6IFwiQWRkIGNoaWxkXCIgfSxcclxuICAgICAgeyBjb21tYW5kOiBcIkRlbGV0ZVwiLCBwdXJwb3NlOiBcIkRlbGV0ZSBpdGVtXCIgfSxcclxuICAgIF0pO1xyXG5cclxuICAgIHRoaXMuZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KHRoaXMuaGllck5vdGVOYW1lLCBcIlwiKTtcclxuICAgIGlmICghdGhpcy5maWxlKSB0aGlzLmxpbmVzID0gW107XHJcblxyXG4gICAgY29uc29sZS5sb2codGhpcyk7XHJcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQodGhpcy5maWxlKTtcclxuICAgIHRoaXMubGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgIHRoaXMubGlzdEl0ZW1zID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKHRoaXMuZmlsZSkubGlzdEl0ZW1zO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKHRoaXMpO1xyXG4gICAgc3VwZXIub25PcGVuKCk7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtcygpOiBITkl0ZW1bXSB7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMubGlzdEl0ZW1zXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBpID0gaXRlbS5wb3NpdGlvbi5zdGFydC5saW5lO1xyXG4gICAgICAgIHJldHVybiB7IGksIGxpbmU6IHRoaXMubGluZXNbaV0gfTtcclxuICAgICAgfSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGl0ZW0ubGluZS5zcGxpdChcIi0gXCIpO1xyXG4gICAgICAgIGNvbnN0IGRlcHRoID0gc3BsaXRzWzBdLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBsaW5lID0gc3BsaXRzLnNsaWNlKDEpLmpvaW4oXCItIFwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgZGVwdGgsIGxpbmUsIGxpbmVObzogaXRlbS5pIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGluZm8oaXRlbXMpO1xyXG4gICAgcmV0dXJuIGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbVRleHQoaXRlbTogSE5JdGVtKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtcIiBcIi5yZXBlYXQoaXRlbS5kZXB0aCl9LSAke2Ryb3BXaWtpbGlua3MoaXRlbS5saW5lKX1gO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPEhOSXRlbT4sIGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgc3VwZXIucmVuZGVyU3VnZ2VzdGlvbihpdGVtLCBlbCk7XHJcbiAgICBlbC5pbm5lclRleHQgPSBgJHtcIiBcIi5yZXBlYXQoaXRlbS5pdGVtLmRlcHRoKX0tICR7ZHJvcFdpa2lsaW5rcyhcclxuICAgICAgaXRlbS5pdGVtLmxpbmVcclxuICAgICl9YDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRlbGV0ZUl0ZW0oaXRlbTogSE5JdGVtKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxpbmVzLnNwbGljZShpdGVtLmxpbmVObywgMSk7XHJcbiAgICAgIHRoaXMubGlzdEl0ZW1zLnNwbGljZShpdGVtLmxpbmVObywgMSk7XHJcbiAgICAgIGF3YWl0IGFwcC52YXVsdC5tb2RpZnkodGhpcy5maWxlLCB0aGlzLmxpbmVzLmpvaW4oXCJcXG5cIikpO1xyXG4gICAgICBuZXcgTm90aWNlKFwiSXRlbSBkZWxldGVkIFN1Y2Nlc2Z1bGx5XCIpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGVycm9yKGVycik7XHJcbiAgICAgIG5ldyBOb3RpY2UoXCJBbiBlcnJvciBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGVcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNob29zZUl0ZW0oaXRlbTogSE5JdGVtLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZ0IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCAmJiBldnQua2V5ID09PSBcIkRlbGV0ZVwiKSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlSXRlbShpdGVtKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiZcclxuICAgICAgZXZ0LmtleSA9PSBcIkVudGVyXCIgJiZcclxuICAgICAgZXZ0LnNoaWZ0S2V5XHJcbiAgICApIHtcclxuICAgICAgY29uc3QgdmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG4gICAgICBjb25zdCB7IGVkaXRvciB9ID0gdmlldyA/PyB7fTtcclxuICAgICAgaWYgKCFlZGl0b3IpIHJldHVybjtcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIHZpZXcubGVhZi5vcGVuRmlsZSh0aGlzLmZpbGUsIHsgYWN0aXZlOiB0cnVlLCBtb2RlOiBcInNvdXJjZVwiIH0pO1xyXG4gICAgICBlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogaXRlbS5saW5lTm8sIGNoOiBpdGVtLmRlcHRoICsgMiB9KTtcclxuICAgIH0gZWxzZSBpZiAoZXZ0IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCB8fCBldnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgIGxldCByZWw6IFwidXBcIiB8IFwiZG93blwiIHwgXCJzYW1lXCI7XHJcbiAgICAgIGlmIChldnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIGV2dC50eXBlID09IFwiY2xpY2tcIikgcmVsID0gXCJkb3duXCI7XHJcbiAgICAgIGlmIChldnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50KSBpZiAoZXZ0LmtleSA9PT0gXCJFbnRlclwiKSByZWwgPSBcImRvd25cIjtcclxuICAgICAgaWYgKGV2dCBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgJiYgZXZ0LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgaWYgKGV2dC5rZXkgPT09IFwiQXJyb3dVcFwiKSByZWwgPSBcInVwXCI7XHJcbiAgICAgICAgaWYgKGV2dC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHJlbCA9IFwiZG93blwiO1xyXG4gICAgICAgIGlmIChldnQua2V5ID09PSBcIkFycm93UmlnaHRcIikgcmVsID0gXCJzYW1lXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG5ldyBNb2RpZnlIaWVySXRlbU1vZGFsKFxyXG4gICAgICAgIHRoaXMucGx1Z2luLFxyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgICAgdGhpcy5maWxlLFxyXG4gICAgICAgIHJlbFxyXG4gICAgICApLm9wZW4oKTtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgTW9kYWwsIFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBNb2RpZnlITkl0ZW1Db21wIGZyb20gXCIuLi8uLi9Db21wb25lbnRzL01vZGlmeUhOSXRlbUNvbXAuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi8uLi9tYWluXCI7XHJcblxyXG5pbnRlcmZhY2UgSE5JdGVtIHtcclxuICBkZXB0aDogbnVtYmVyO1xyXG4gIGxpbmU6IHN0cmluZztcclxuICBsaW5lTm86IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZGlmeUhpZXJJdGVtTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgbW91bnQ6IE1vZGlmeUhOSXRlbUNvbXA7XHJcbiAgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBtb2RhbDogTW9kaWZ5SGllckl0ZW1Nb2RhbDtcclxuICBobkl0ZW06IEhOSXRlbTtcclxuICBmaWxlOiBURmlsZTtcclxuICByZWw6IFwidXBcIiB8IFwic2FtZVwiIHwgXCJkb3duXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICAgIGhuSXRlbTogSE5JdGVtLFxyXG4gICAgZmlsZTogVEZpbGUsXHJcbiAgICByZWw6IFwidXBcIiB8IFwic2FtZVwiIHwgXCJkb3duXCJcclxuICApIHtcclxuICAgIHN1cGVyKGFwcCk7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIHRoaXMubW9kYWwgPSB0aGlzO1xyXG4gICAgdGhpcy5obkl0ZW0gPSBobkl0ZW07XHJcbiAgICB0aGlzLmZpbGUgPSBmaWxlO1xyXG4gICAgdGhpcy5yZWwgPSByZWw7XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKSB7XHJcbiAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuICAgIHRoaXMubW91bnQgPSBuZXcgTW9kaWZ5SE5JdGVtQ29tcCh7XHJcbiAgICAgIHRhcmdldDogY29udGVudEVsLFxyXG4gICAgICBwcm9wczoge1xyXG4gICAgICAgIG1vZGFsOiB0aGlzLFxyXG4gICAgICAgIHNldHRpbmdzOiB0aGlzLnBsdWdpbi5zZXR0aW5ncyxcclxuICAgICAgICBobkl0ZW06IHRoaXMuaG5JdGVtLFxyXG4gICAgICAgIGZpbGU6IHRoaXMuZmlsZSxcclxuICAgICAgICByZWw6IHRoaXMucmVsLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsb3NlKCkge1xyXG4gICAgdGhpcy5tb3VudC4kZGVzdHJveSgpO1xyXG4gICAgdGhpcy5jb250ZW50RWwuZW1wdHkoKTtcclxuICB9XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgZXJyb3IgfSBmcm9tIFwiY29uc29sZVwiO1xyXG4gIGltcG9ydCB7IE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuICBpbXBvcnQgdHlwZSB7IE1vZGlmeUhpZXJJdGVtTW9kYWwgfSBmcm9tIFwiLi4vQWx0ZXJuYXRpdmVIaWVyYXJjaGllcy9IaWVyYXJjaHlOb3Rlcy9Nb2RpZnlIaWVySXRlbU1vZGFsXCI7XHJcbiAgaW1wb3J0IHsgQVJST1dfRElSRUNUSU9OUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuICBpbXBvcnQgdHlwZSB7IEJDU2V0dGluZ3MgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB7IGRyb3BXaWtpbGlua3MsIG1ha2VXaWtpIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBtb2RhbDogTW9kaWZ5SGllckl0ZW1Nb2RhbDtcclxuICBleHBvcnQgbGV0IHNldHRpbmdzOiBCQ1NldHRpbmdzO1xyXG4gIGV4cG9ydCBsZXQgaG5JdGVtOiBITkl0ZW07XHJcbiAgZXhwb3J0IGxldCBmaWxlOiBURmlsZTtcclxuICBleHBvcnQgbGV0IHJlbDogXCJ1cFwiIHwgXCJzYW1lXCIgfCBcImRvd25cIjtcclxuXHJcbiAgaW50ZXJmYWNlIEhOSXRlbSB7XHJcbiAgICBkZXB0aDogbnVtYmVyO1xyXG4gICAgbGluZTogc3RyaW5nO1xyXG4gICAgbGluZU5vOiBudW1iZXI7XHJcbiAgfVxyXG4gIGxldCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAvL0B0cy1pZ25vcmVcclxuICBsZXQgbmV3SXRlbSA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3LmZpbGUuYmFzZW5hbWU7XHJcblxyXG4gIGNvbnN0IGJ1aWxkTmV3SXRlbSA9IChcclxuICAgIG5ld0l0ZW06IHN0cmluZyxcclxuICAgIGRlcHRoID0gaG5JdGVtLmRlcHRoLFxyXG4gICAgcHJldmlldyA9IGZhbHNlXHJcbiAgKSA9PlxyXG4gICAgYCR7XCIgXCIucmVwZWF0KE1hdGgucm91bmQoZGVwdGggLyAocHJldmlldyA/IDIgOiAxKSkpfS0gJHtcclxuICAgICAgcHJldmlldyA/IG5ld0l0ZW0gfHwgXCI8RW1wdHk+XCIgOiBtYWtlV2lraShuZXdJdGVtKVxyXG4gICAgfWA7XHJcblxyXG4gIC8vIG9uTW91bnQoaW5wdXRFbC5mb2N1cyk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGg1PkFkZCBhbiB7QVJST1dfRElSRUNUSU9OU1tyZWxdfSB0byB7ZHJvcFdpa2lsaW5rcyhobkl0ZW0ubGluZSl9PC9oNT5cclxuPGRpdj5cclxuICB7I2lmIHJlbCA9PT0gXCJ1cFwifVxyXG4gICAgeyNpZiBobkl0ZW0uZGVwdGggPT09IDB9XHJcbiAgICAgIDxkaXY+Q2FuJ3QgYWRkIHBhcmVudCB0byB0b3AgbGV2ZWwgaXRlbSwgY2hvb3NlIGFub3RoZXIgZGlyZWN0aW9uPC9kaXY+XHJcbiAgICB7OmVsc2V9XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPHByZT5cclxuICAgICAgICAgIHtidWlsZE5ld0l0ZW0obmV3SXRlbSwgaG5JdGVtLmRlcHRoIC0gNCwgdHJ1ZSl9XHJcbiAgICAgICAgPC9wcmU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgey9pZn1cclxuICB7L2lmfVxyXG4gIDxkaXY+XHJcbiAgICA8cHJlPlxyXG4gICAgICAgIDxzdHJvbmdcclxuICAgICAgICA+e2J1aWxkTmV3SXRlbShkcm9wV2lraWxpbmtzKGhuSXRlbS5saW5lKSwgaG5JdGVtLmRlcHRoLCB0cnVlKX08L3N0cm9uZ1xyXG4gICAgICA+XHJcbiAgICA8L3ByZT5cclxuICA8L2Rpdj5cclxuICB7I2lmIHJlbCA9PT0gXCJzYW1lXCJ9XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8cHJlPlxyXG4gICAgICAgIHtidWlsZE5ld0l0ZW0obmV3SXRlbSwgaG5JdGVtLmRlcHRoLCB0cnVlKX1cclxuICAgIDwvcHJlPlxyXG4gICAgPC9kaXY+XHJcbiAgezplbHNlIGlmIHJlbCA9PT0gXCJkb3duXCJ9XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8cHJlPlxyXG4gICAgICAgIHtidWlsZE5ld0l0ZW0obmV3SXRlbSwgaG5JdGVtLmRlcHRoICsgNCwgdHJ1ZSl9XHJcbiAgICA8L3ByZT5cclxuICAgIDwvZGl2PlxyXG4gIHsvaWZ9XHJcblxyXG4gIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW5vLW9uY2hhbmdlIC0tPlxyXG4gIDxzZWxlY3QgY2xhc3M9XCJkcm9wZG93blwiIHdpZHRoPVwiMVwiIGJpbmQ6dmFsdWU9e3JlbH0+XHJcbiAgICA8b3B0aW9uIHZhbHVlPVwidXBcIj51cDwvb3B0aW9uPlxyXG4gICAgPG9wdGlvbiB2YWx1ZT1cInNhbWVcIj5zYW1lPC9vcHRpb24+XHJcbiAgICA8b3B0aW9uIHZhbHVlPVwiZG93blwiPmRvd248L29wdGlvbj5cclxuICA8L3NlbGVjdD5cclxuXHJcbiAgPGlucHV0XHJcbiAgICB0eXBlPVwidGV4dFwiXHJcbiAgICBwbGFjZWhvbGRlcj1cIk5ldyBpdGVtXCJcclxuICAgIGJpbmQ6dGhpcz17aW5wdXRFbH1cclxuICAgIGJpbmQ6dmFsdWU9e25ld0l0ZW19XHJcbiAgLz5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiB7XHJcbiAgICAgIGlmIChyZWwgPT09IFwidXBcIiAmJiBobkl0ZW0uZGVwdGggPT09IDApIHtcclxuICAgICAgICBuZXcgTm90aWNlKFxyXG4gICAgICAgICAgXCJDYW4ndCBhZGQgcGFyZW50IHRvIHRvcCBsZXZlbCBpdGVtLCBjaG9vc2UgYW5vdGhlciBkaXJlY3Rpb25cIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XHJcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XHJcbiAgICAgICAgICBjb25zdCBsaW5lTm8gPSByZWwgPT09IFwidXBcIiA/IGhuSXRlbS5saW5lTm8gOiBobkl0ZW0ubGluZU5vICsgMTtcclxuXHJcbiAgICAgICAgICBjb25zdCBkZXB0aCA9XHJcbiAgICAgICAgICAgIHJlbCA9PT0gXCJ1cFwiXHJcbiAgICAgICAgICAgICAgPyBobkl0ZW0uZGVwdGggLSA0XHJcbiAgICAgICAgICAgICAgOiByZWwgPT09IFwiZG93blwiXHJcbiAgICAgICAgICAgICAgPyBobkl0ZW0uZGVwdGggKyA0XHJcbiAgICAgICAgICAgICAgOiBobkl0ZW0uZGVwdGg7XHJcblxyXG4gICAgICAgICAgbGluZXMuc3BsaWNlKGxpbmVObywgMCwgYnVpbGROZXdJdGVtKG5ld0l0ZW0sIGRlcHRoKSk7XHJcbiAgICAgICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xyXG4gICAgICAgICAgbW9kYWwuY2xvc2UoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIGVycm9yKGVycik7XHJcbiAgICAgICAgICBuZXcgTm90aWNlKFwiQW4gZXJyb3Igb2NjdXJlZCwgcGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfX0+QWRkPC9idXR0b25cclxuICA+XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIHByZSB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmU7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IHsgaW5mbyB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZ2V0RFZBcGkgfSBmcm9tIFwiLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZUluZGV4LCBpbmRleFRvTGluZVBhaXJzIH0gZnJvbSBcIi4vQ29tbWFuZHMvQ3JlYXRlSW5kZXhcIjtcclxuaW1wb3J0IENCVHJlZSBmcm9tIFwiLi9Db21wb25lbnRzL0NCVHJlZS5zdmVsdGVcIjtcclxuaW1wb3J0IHsgQ09ERUJMT0NLX0ZJRUxEUywgQ09ERUJMT0NLX1RZUEVTLCBESVJFQ1RJT05TIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIHsgQ29kZWJsb2NrRmllbGRzLCBQYXJzZWRDb2RlYmxvY2sgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuL21haW5cIjtcclxuaW1wb3J0IHsgZHJvcEZvbGRlciwgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7XHJcbiAgZGZzQWxsUGF0aHMsXHJcbiAgZ2V0UmVmbGV4aXZlQ2xvc3VyZSxcclxuICBnZXRTdWJGb3JGaWVsZHMsXHJcbiAgZ2V0U3ViSW5EaXJzLFxyXG59IGZyb20gXCIuL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRJbmZvLCBnZXRGaWVsZHMsIGdldE9wcERpciB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBjcmVhdGVKdWdnbCB9IGZyb20gXCIuL1Zpc3VhbGlzYXRpb25zL0p1Z2dsXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29kZWJsb2NrQ0IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGRiIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMsIGNyZWF0ZUluZGV4SW5kZW50IH0gPSBzZXR0aW5ncztcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIHNvdXJjZTogc3RyaW5nLFxyXG4gICAgZWw6IEhUTUxFbGVtZW50LFxyXG4gICAgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0XHJcbiAgKSA9PiB7XHJcbiAgICBkYi5zdGFydDJHKFwiQ29kZWJsb2NrXCIpO1xyXG4gICAgY29uc3QgcGFyc2VkU291cmNlID0gcGFyc2VDb2RlQmxvY2tTb3VyY2Uoc291cmNlKTtcclxuICAgIGNvbnN0IGVyciA9IGNvZGVibG9ja0Vycm9yKHBsdWdpbiwgcGFyc2VkU291cmNlKTtcclxuXHJcbiAgICBpZiAoZXJyICE9PSBcIlwiKSB7XHJcbiAgICAgIGVsLmlubmVySFRNTCA9IGVycjtcclxuICAgICAgZGIuZW5kMkcoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtaW4gPSAwLFxyXG4gICAgICBtYXggPSBJbmZpbml0eTtcclxuICAgIGxldCB7IGRlcHRoLCBkaXIsIGZpZWxkcywgZnJvbSwgaW1wbGllZCwgZmxhdCB9ID0gcGFyc2VkU291cmNlO1xyXG4gICAgaWYgKGRlcHRoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgbWluTnVtID0gcGFyc2VJbnQoZGVwdGhbMF0pO1xyXG4gICAgICBpZiAoIWlzTmFOKG1pbk51bSkpIG1pbiA9IG1pbk51bTtcclxuICAgICAgY29uc3QgbWF4TnVtID0gcGFyc2VJbnQoZGVwdGhbMV0pO1xyXG4gICAgICBpZiAoIWlzTmFOKG1heE51bSkpIG1heCA9IG1heE51bTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3QgY3VyckZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChcclxuICAgICAgY3R4LnNvdXJjZVBhdGgsXHJcbiAgICAgIFwiXCJcclxuICAgICk7XHJcbiAgICBjb25zdCB7IGJhc2VuYW1lIH0gPSBjdXJyRmlsZTtcclxuXHJcbiAgICBsZXQgZnJvbXMgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgYXBpID0gZ2V0RFZBcGkocGx1Z2luKTtcclxuICAgICAgICBpZiAoYXBpKSB7XHJcbiAgICAgICAgICBjb25zdCBwYWdlcyA9IGFwaS5wYWdlUGF0aHMoZnJvbSk/LnZhbHVlcztcclxuICAgICAgICAgIGZyb21zID0gcGFnZXMubWFwKGRyb3BGb2xkZXIpO1xyXG4gICAgICAgIH0gZWxzZSBuZXcgTm90aWNlKFwiRGF0YXZpZXcgbXVzdCBiZSBlbmFibGVkIGZvciBgZnJvbWAgdG8gd29yay5cIik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBuZXcgTm90aWNlKGBUaGUgcXVlcnkgXCIke2Zyb219XCIgZmFpbGVkLmApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3BwRGlyID0gZ2V0T3BwRGlyKGRpcik7XHJcbiAgICBjb25zdCBzdWIgPVxyXG4gICAgICBpbXBsaWVkID09PSBmYWxzZVxyXG4gICAgICAgID8gZ2V0U3ViSW5EaXJzKHBsdWdpbi5tYWluRywgZGlyKVxyXG4gICAgICAgIDogZ2V0U3ViSW5EaXJzKHBsdWdpbi5tYWluRywgZGlyLCBvcHBEaXIpO1xyXG4gICAgY29uc3QgY2xvc2VkID0gZ2V0UmVmbGV4aXZlQ2xvc3VyZShzdWIsIHVzZXJIaWVycyk7XHJcblxyXG4gICAgY29uc3Qgc3ViRmllbGRzID0gZmllbGRzID8/IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gICAgY29uc3Qgc3ViQ2xvc2VkID0gZ2V0U3ViRm9yRmllbGRzKGdldFN1YkluRGlycyhjbG9zZWQsIGRpciksIHN1YkZpZWxkcyk7XHJcblxyXG5cclxuICAgIGNvbnN0IGFsbFBhdGhzID0gZGZzQWxsUGF0aHMoc3ViQ2xvc2VkLCBiYXNlbmFtZSk7XHJcbiAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUluZGV4KGFsbFBhdGhzLCBmYWxzZSwgY3JlYXRlSW5kZXhJbmRlbnQpO1xyXG4gICAgaW5mbyh7IGFsbFBhdGhzLCBpbmRleCB9KTtcclxuXHJcbiAgICBjb25zdCBsaW5lcyA9IGluZGV4VG9MaW5lUGFpcnMoaW5kZXgsIGZsYXQpO1xyXG5cclxuICAgIHN3aXRjaCAocGFyc2VkU291cmNlLnR5cGUpIHtcclxuICAgICAgY2FzZSBcInRyZWVcIjpcclxuICAgICAgICBuZXcgQ0JUcmVlKHtcclxuICAgICAgICAgIHRhcmdldDogZWwsXHJcbiAgICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgICBwbHVnaW4sXHJcbiAgICAgICAgICAgIGVsLFxyXG4gICAgICAgICAgICBtaW4sXHJcbiAgICAgICAgICAgIG1heCxcclxuICAgICAgICAgICAgbGluZXMsXHJcbiAgICAgICAgICAgIGZyb21zLFxyXG4gICAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgICAgcGFyc2VkU291cmNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImp1Z2dsXCI6XHJcbiAgICAgICAgY3JlYXRlZEp1Z2dsQ0IoXHJcbiAgICAgICAgICBwbHVnaW4sXHJcbiAgICAgICAgICBlbCxcclxuICAgICAgICAgIHBhcnNlZFNvdXJjZSxcclxuICAgICAgICAgIGxpbmVzLFxyXG4gICAgICAgICAgZnJvbXMsXHJcbiAgICAgICAgICBiYXNlbmFtZSxcclxuICAgICAgICAgIG1pbixcclxuICAgICAgICAgIG1heFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgZGIuZW5kMkcoKTtcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogUGFyc2UgYSBzdHJpbmcgYXMgYSBib29sZWFuIHZhbHVlLiBJZiBub3QgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLCByZXR1cm4gYHZhbHVlYC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBib29sZWFufVxyXG4gKi9cclxuY29uc3QgcGFyc2VBc0Jvb2wgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IGJvb2xlYW4gPT5cclxuICB2YWx1ZSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogdmFsdWUgPT09IFwiZmFsc2VcIiA/IGZhbHNlIDogdmFsdWU7XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNvZGVCbG9ja1NvdXJjZShzb3VyY2U6IHN0cmluZyk6IFBhcnNlZENvZGVibG9jayB7XHJcbiAgY29uc3QgbGluZXMgPSBzb3VyY2Uuc3BsaXQoXCJcXG5cIik7XHJcbiAgY29uc3QgZ2V0VmFsdWUgPSAodHlwZTogc3RyaW5nKSA9PlxyXG4gICAgbGluZXNcclxuICAgICAgLmZpbmQoKGwpID0+IGwuc3RhcnRzV2l0aChgJHt0eXBlfTpgKSlcclxuICAgICAgPy5zcGxpdChcIjpcIik/LlsxXVxyXG4gICAgICA/LnRyaW0oKTtcclxuXHJcbiAgY29uc3QgcmVzdWx0czogeyBbZmllbGQgaW4gQ29kZWJsb2NrRmllbGRzXTogc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdIH0gPVxyXG4gICAge307XHJcblxyXG4gIENPREVCTE9DS19GSUVMRFMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgIGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoZmllbGQpO1xyXG4gICAgcmVzdWx0c1tmaWVsZF0gPSBwYXJzZUFzQm9vbCh2YWx1ZSk7XHJcbiAgfSk7XHJcblxyXG4gIHJlc3VsdHMuZmllbGRzID0gcmVzdWx0cy5maWVsZHNcclxuICAgID8gc3BsaXRBbmRUcmltKHJlc3VsdHMuZmllbGRzIGFzIHN0cmluZylcclxuICAgIDogdW5kZWZpbmVkO1xyXG5cclxuICBpZiAocmVzdWx0cy5kZXB0aCkge1xyXG4gICAgY29uc3QgbWF0Y2ggPSAocmVzdWx0cy5kZXB0aCBhcyBzdHJpbmcpLm1hdGNoKC8oXFxkKiktPyhcXGQqKS8pO1xyXG4gICAgcmVzdWx0cy5kZXB0aCA9IFttYXRjaFsxXSwgbWF0Y2hbMl1dO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdHMgYXMgdW5rbm93biBhcyBQYXJzZWRDb2RlYmxvY2s7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvZGVibG9ja0Vycm9yKHBsdWdpbjogQkNQbHVnaW4sIHBhcnNlZFNvdXJjZTogUGFyc2VkQ29kZWJsb2NrKSB7XHJcbiAgY29uc3QgeyBkaXIsIGZpZWxkcywgdHlwZSwgdGl0bGUsIGRlcHRoLCBmbGF0LCBjb250ZW50LCBmcm9tLCBpbXBsaWVkIH0gPVxyXG4gICAgcGFyc2VkU291cmNlO1xyXG4gIGNvbnN0IHsgdXNlckhpZXJzIH0gPSBwbHVnaW4uc2V0dGluZ3M7XHJcbiAgbGV0IGVyciA9IFwiXCI7XHJcblxyXG4gIGlmICghQ09ERUJMT0NLX1RZUEVTLmluY2x1ZGVzKHR5cGUpKVxyXG4gICAgZXJyICs9IGA8Y29kZT50eXBlOiAke3R5cGV9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB0eXBlLiBJdCBtdXN0IGJlIG9uZSBvZjogJHtDT0RFQkxPQ0tfVFlQRVMubWFwKFxyXG4gICAgICAodHlwZSkgPT4gYDxjb2RlPiR7dHlwZX08L2NvZGU+YFxyXG4gICAgKS5qb2luKFwiLCBcIil9LjwvYnI+YDtcclxuXHJcbiAgY29uc3QgdmFsaWREaXIgPSBESVJFQ1RJT05TLmluY2x1ZGVzKGRpcik7XHJcbiAgaWYgKCF2YWxpZERpcilcclxuICAgIGVyciArPSBgPGNvZGU+ZGlyOiAke2Rpcn08L2NvZGU+IGlzIG5vdCBhIHZhbGlkIGRpcmVjdGlvbi48L2JyPmA7XHJcblxyXG4gIGNvbnN0IGFsbEZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gIFtmaWVsZHNdLmZsYXQoKT8uZm9yRWFjaCgoZikgPT4ge1xyXG4gICAgaWYgKGYgIT09IHVuZGVmaW5lZCAmJiAhYWxsRmllbGRzLmluY2x1ZGVzKGYpKVxyXG4gICAgICBlcnIgKz0gYDxjb2RlPmZpZWxkczogJHtmfTwvY29kZT4gaXMgbm90IGEgZmllbGQgaW4geW91ciBoaWVyYXJjaGllcy48L2JyPmA7XHJcbiAgfSk7XHJcblxyXG4gIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkICYmIHRpdGxlICE9PSBmYWxzZSlcclxuICAgIGVyciArPSBgPGNvZGU+dGl0bGU6ICR7dGl0bGV9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3IgbGVhdmUgdGhlIGVudGlyZSBsaW5lIG91dC48L2JyPmA7XHJcblxyXG4gIGlmIChkZXB0aCAhPT0gdW5kZWZpbmVkICYmIGRlcHRoLmV2ZXJ5KChudW0pID0+IGlzTmFOKHBhcnNlSW50KG51bSkpKSlcclxuICAgIGVyciArPSBgPGNvZGU+ZGVwdGg6ICR7ZGVwdGh9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIGEgbnVtYmVyLjwvYnI+YDtcclxuXHJcbiAgaWYgKGZsYXQgIT09IHVuZGVmaW5lZCAmJiBmbGF0ICE9PSB0cnVlKVxyXG4gICAgZXJyICs9IGA8Y29kZT5mbGF0OiAke2ZsYXR9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIDxjb2RlPnRydWU8L2NvZGU+LCBvciBsZWF2ZSB0aGUgZW50aXJlIGxpbmUgb3V0LjwvYnI+YDtcclxuXHJcbiAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBjb250ZW50ICE9PSBcIm9wZW5cIiAmJiBjb250ZW50ICE9PSBcImNsb3NlZFwiKVxyXG4gICAgZXJyICs9IGA8Y29kZT5jb250ZW50OiAke2NvbnRlbnR9PC9jb2RlPiBpcyBub3QgYSB2YWxpZCB2YWx1ZS4gSXQgaGFzIHRvIGJlIDxjb2RlPm9wZW48L2NvZGU+IG9yIDxjb2RlPmNsb3NlZDwvY29kZT4sIG9yIGxlYXZlIHRoZSBlbnRpcmUgbGluZSBvdXQuPC9icj5gO1xyXG5cclxuICBpZiAoXHJcbiAgICBmcm9tICE9PSB1bmRlZmluZWQgJiZcclxuICAgICFhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMoXCJkYXRhdmlld1wiKVxyXG4gICkge1xyXG4gICAgZXJyICs9IGBEYXRhdmlldyBtdXN0IGJlIGVuYWJsZWQgdG8gdXNlIDxjb2RlPmZyb208L2NvZGU+LjwvYnI+YDtcclxuICB9XHJcblxyXG4gIGlmIChpbXBsaWVkICE9PSB1bmRlZmluZWQgJiYgaW1wbGllZCAhPT0gZmFsc2UpXHJcbiAgICBlcnIgKz0gYDxjb2RlPmltcGxpZWQ6ICR7aW1wbGllZH08L2NvZGU+IGlzIG5vdCBhIHZhbGlkIHZhbHVlLiBJdCBoYXMgdG8gYmUgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciBsZWF2ZSB0aGUgZW50aXJlIGxpbmUgb3V0LjwvYnI+YDtcclxuXHJcbiAgcmV0dXJuIGVyciA9PT0gXCJcIlxyXG4gICAgPyBcIlwiXHJcbiAgICA6IGAke2Vycn08L2JyPlxyXG4gICAgQSB2YWxpZCBleGFtcGxlIHdvdWxkIGJlOlxyXG4gICAgPHByZT48Y29kZT5cclxuICAgICAgdHlwZTogdHJlZVxyXG4gICAgICBkaXI6ICR7dmFsaWREaXIgPyBkaXIgOiBcImRvd25cIn1cclxuICAgICAgZmllbGRzOiAke2FsbEZpZWxkc1xyXG4gICAgICAubWFwKChmKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgZiwgZGlyOiBnZXRGaWVsZEluZm8odXNlckhpZXJzLCBmKS5maWVsZERpciB9O1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKChpbmZvKSA9PiBpbmZvLmRpciA9PT0gZGlyKVxyXG4gICAgICAubWFwKChpbmZvKSA9PiBpbmZvLmYpXHJcbiAgICAgIC5qb2luKFwiLCBcIikgfHwgXCJjaGlsZFwiXHJcbiAgICB9XHJcbiAgICAgIGRlcHRoOiAzXHJcbiAgICAgIDwvY29kZT48L3ByZT5gO1xyXG59XHJcblxyXG5jb25zdCBpbmRlbnRUb0RlcHRoID0gKGluZGVudDogc3RyaW5nKSA9PiBpbmRlbnQubGVuZ3RoIC8gMiArIDE7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWVldHNDb25kaXRpb25zKFxyXG4gIGluZGVudDogc3RyaW5nLFxyXG4gIG5vZGU6IHN0cmluZyxcclxuICBmcm9tczogc3RyaW5nW10sXHJcbiAgbWluOiBudW1iZXIsXHJcbiAgbWF4OiBudW1iZXJcclxuKSB7XHJcbiAgY29uc3QgZGVwdGggPSBpbmRlbnRUb0RlcHRoKGluZGVudCk7XHJcbiAgcmV0dXJuIChcclxuICAgIGRlcHRoID49IG1pbiAmJlxyXG4gICAgZGVwdGggPD0gbWF4ICYmXHJcbiAgICAoZnJvbXMgPT09IHVuZGVmaW5lZCB8fCBmcm9tcy5pbmNsdWRlcyhub2RlKSlcclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlZEp1Z2dsQ0IoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxyXG4gIGFyZ3M6IFBhcnNlZENvZGVibG9jayxcclxuICBsaW5lczogW3N0cmluZywgc3RyaW5nXVtdLFxyXG4gIGZyb21zOiBzdHJpbmdbXSxcclxuICBzb3VyY2U6IHN0cmluZyxcclxuICBtaW46IG51bWJlcixcclxuICBtYXg6IG51bWJlclxyXG4pIHtcclxuICBjb25zdCBub2RlcyA9IGxpbmVzXHJcbiAgICAuZmlsdGVyKChbaW5kZW50LCBub2RlXSkgPT4gbWVldHNDb25kaXRpb25zKGluZGVudCwgbm9kZSwgZnJvbXMsIG1pbiwgbWF4KSlcclxuICAgIC5tYXAoKFtfLCBub2RlXSkgPT4gbm9kZSArIFwiLm1kXCIpO1xyXG4gIGlmIChtaW4gPD0gMCkgbm9kZXMucHVzaChzb3VyY2UgKyBcIi5tZFwiKTtcclxuXHJcbiAgY3JlYXRlSnVnZ2wocGx1Z2luLCB0YXJnZXQsIG5vZGVzLCBhcmdzKTtcclxufVxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyBNYXJrZG93blJlbmRlcmVyIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IHsgb25Nb3VudCB9IGZyb20gXCJzdmVsdGVcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwYXRoOiBzdHJpbmc7XHJcblxyXG4gIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRlbnQobm90ZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3Qobm90ZSwgXCJcIik7XHJcbiAgICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XHJcbiAgfVxyXG5cclxuICBsZXQgZWw6IEhUTUxFbGVtZW50O1xyXG4gIG9uTW91bnQoYXN5bmMgKCkgPT4ge1xyXG4gICAgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihhd2FpdCBnZXRDb250ZW50KHBhdGgpLCBlbCwgcGF0aCwgbnVsbCk7XHJcbiAgfSk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIkJDLW5vdGUtY29udGVudFwiIGJpbmQ6dGhpcz17ZWx9IC8+XHJcblxyXG48c3R5bGU+XHJcbiAgZGl2LkJDLW5vdGUtY29udGVudCB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQge1xyXG4gICAgaXNJblZhdWx0LFxyXG4gICAgb3Blbk9yU3dpdGNoLFxyXG4gICAgaG92ZXJQcmV2aWV3LFxyXG4gIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG4gIGltcG9ydCB7IG1lZXRzQ29uZGl0aW9ucyB9IGZyb20gXCIuLi9Db2RlYmxvY2tzXCI7XHJcbiAgaW1wb3J0IHR5cGUgeyBQYXJzZWRDb2RlYmxvY2sgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgZHJvcERlbmRyb24gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbiAgaW1wb3J0IFJlbmRlck1hcmtkb3duIGZyb20gXCIuL1JlbmRlck1hcmtkb3duLnN2ZWx0ZVwiO1xyXG5cclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcbiAgZXhwb3J0IGxldCBlbDogSFRNTEVsZW1lbnQ7XHJcbiAgZXhwb3J0IGxldCBsaW5lczogW3N0cmluZywgc3RyaW5nXVtdO1xyXG4gIGV4cG9ydCBsZXQgZnJvbXM6IHN0cmluZ1tdO1xyXG4gIGV4cG9ydCBsZXQgbWluOiBudW1iZXI7XHJcbiAgZXhwb3J0IGxldCBtYXg6IG51bWJlcjtcclxuICBleHBvcnQgbGV0IGJhc2VuYW1lOiBzdHJpbmc7XHJcbiAgZXhwb3J0IGxldCBwYXJzZWRTb3VyY2U6IFBhcnNlZENvZGVibG9jaztcclxuXHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGRpciB9ID0gcGFyc2VkU291cmNlO1xyXG5cclxuICBjb25zdCBhY3RpdmVMZWFmVmlldyA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3O1xyXG48L3NjcmlwdD5cclxuXHJcbnsjaWYgdGl0bGUgIT09IGZhbHNlfVxyXG4gIDxoMz57ZGlyfSBvZiB7YmFzZW5hbWV9PC9oMz5cclxuey9pZn1cclxuPGRpdiBjbGFzcz1cIkJDLXRyZWVcIj5cclxuICB7I2VhY2ggbGluZXMgYXMgW2luZGVudCwgbGlua119XHJcbiAgICB7I2lmIG1lZXRzQ29uZGl0aW9ucyhpbmRlbnQsIGxpbmssIGZyb21zLCBtaW4sIG1heCl9XHJcbiAgICAgIHsjaWYgY29udGVudCA9PT0gXCJvcGVuXCIgfHwgY29udGVudCA9PT0gXCJjbG9zZWRcIn1cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHByZSBjbGFzcz1cImluZGVudFwiPntpbmRlbnR9PC9wcmU+XHJcbiAgICAgICAgICA8ZGV0YWlscyBvcGVuPXtjb250ZW50ID09PSBcIm9wZW5cIn0+XHJcbiAgICAgICAgICAgIDxzdW1tYXJ5PlxyXG4gICAgICAgICAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1vdXNlLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgLS0+XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiXHJcbiAgICAgICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChsaW5rLCBlKX1cclxuICAgICAgICAgICAgICAgIG9uOm1vdXNlb3Zlcj17KGUpID0+IGhvdmVyUHJldmlldyhlLCBhY3RpdmVMZWFmVmlldywgbGluayl9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbWlzc2luZy1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmsge2lzSW5WYXVsdChsaW5rKSA/ICcnIDogJ2lzLXVucmVzb2x2ZWQnfVwiXHJcbiAgICAgICAgICAgICAgICAgID57ZHJvcERlbmRyb24obGluaywgc2V0dGluZ3MpfTwvYVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zdW1tYXJ5PlxyXG4gICAgICAgICAgICA8UmVuZGVyTWFya2Rvd24gcGF0aD17bGlua30gLz5cclxuICAgICAgICAgIDwvZGV0YWlscz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgezplbHNlfVxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8cHJlIGNsYXNzPVwiaW5kZW50XCI+e2luZGVudCArIFwiLVwifTwvcHJlPlxyXG4gICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbW91c2UtZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiXHJcbiAgICAgICAgICAgIG9uOmNsaWNrPXthc3luYyAoZSkgPT4gYXdhaXQgb3Blbk9yU3dpdGNoKGxpbmssIGUpfVxyXG4gICAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgYWN0aXZlTGVhZlZpZXcsIGxpbmspfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS1taXNzaW5nLWF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJpbnRlcm5hbC1saW5rIHtpc0luVmF1bHQobGluaykgPyAnJyA6ICdpcy11bnJlc29sdmVkJ31cIj5cclxuICAgICAgICAgICAgICB7ZHJvcERlbmRyb24obGluaywgc2V0dGluZ3MpfVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvaWZ9XHJcbiAgICB7L2lmfVxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgLkJDLXRyZWUge1xyXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XHJcbiAgfVxyXG4gIC8qIC5CQy10cmVlID4gZGl2IHtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgfSAqL1xyXG4gIHByZS5pbmRlbnQge1xyXG4gICAgZGlzcGxheTogaW5saW5lO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbiAgICBwb3NpdGlvbjogdG9wO1xyXG4gIH1cclxuICBkZXRhaWxzIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB9XHJcblxyXG4gIC5pcy11bnJlc29sdmVkIHtcclxuICAgIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgeyBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0UmVhbG5JbXBsaWVkIH0gZnJvbSBcIi4uL1V0aWxzL2dyYXBoVXRpbHNcIjtcclxuaW1wb3J0IHtnZXRDdXJyRmlsZX0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBqdW1wVG9GaXJzdERpcihwbHVnaW46IEJDUGx1Z2luLCBkaXI6IERpcmVjdGlvbnMpIHtcclxuICBjb25zdCB7IGxpbWl0SnVtcFRvRmlyc3RGaWVsZHMgfSA9IHBsdWdpbi5zZXR0aW5ncztcclxuICBjb25zdCBmaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICBpZiAoIWZpbGUpIHtcclxuICAgIG5ldyBOb3RpY2UoXCJZb3UgbmVlZCB0byBiZSBmb2N1c3NlZCBvbiBhIE1hcmtkb3duIGZpbGVcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGNvbnN0IHsgYmFzZW5hbWUgfSA9IGZpbGU7XHJcblxyXG4gIGNvbnN0IHJlYWxzTkltcGxpZWRzID0gZ2V0UmVhbG5JbXBsaWVkKHBsdWdpbiwgYmFzZW5hbWUsIGRpcilbZGlyXTtcclxuICBjb25zdCBhbGxCQ3MgPSBbLi4ucmVhbHNOSW1wbGllZHMucmVhbHMsIC4uLnJlYWxzTkltcGxpZWRzLmltcGxpZWRzXTtcclxuICBpZiAoYWxsQkNzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgbmV3IE5vdGljZShgTm8gJHtkaXJ9IGZvdW5kYCk7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCB0b05vZGUgPSBhbGxCQ3MuZmluZCgoYmMpID0+XHJcbiAgICBsaW1pdEp1bXBUb0ZpcnN0RmllbGRzLmluY2x1ZGVzKGJjLmZpZWxkKVxyXG4gICk/LnRvO1xyXG5cclxuICBpZiAoIXRvTm9kZSkge1xyXG4gICAgbmV3IE5vdGljZShcclxuICAgICAgYE5vIG5vdGUgd2FzIGZvdW5kIGluICR7ZGlyfSBnaXZlbiB0aGUgbGltaXRlZCBmaWVsZHMgYWxsb3dlZDogJHtsaW1pdEp1bXBUb0ZpcnN0RmllbGRzLmpvaW4oXHJcbiAgICAgICAgXCIsIFwiXHJcbiAgICAgICl9YFxyXG4gICAgKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbnN0IHRvRmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KHRvTm9kZSwgXCJcIik7XHJcbiAgYXdhaXQgYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLm9wZW5GaWxlKHRvRmlsZSk7XHJcbn1cclxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZVBhdGgsIE5vdGljZSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRJbmZvLCBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGNyZWF0ZU9yVXBkYXRlWWFtbCwgZ2V0Q3VyckZpbGUsIHNwbGl0QXRZYW1sIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbmNvbnN0IHJlc29sdmVUaHJlYWRpbmdOYW1lVGVtcGxhdGUgPSAoXHJcbiAgdGVtcGxhdGU6IHN0cmluZyxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgZmllbGQ6IHN0cmluZyxcclxuICBkaXI6IERpcmVjdGlvbnMsXHJcbiAgZGF0ZUZvcm1hdDogc3RyaW5nXHJcbikgPT5cclxuICB0ZW1wbGF0ZVxyXG4gICAgPyB0ZW1wbGF0ZVxyXG4gICAgICAucmVwbGFjZShcInt7Y3VycmVudH19XCIsIGN1cnJGaWxlLmJhc2VuYW1lKVxyXG4gICAgICAucmVwbGFjZShcInt7ZmllbGR9fVwiLCBmaWVsZClcclxuICAgICAgLnJlcGxhY2UoXCJ7e2Rpcn19XCIsIGRpcilcclxuICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgIC5yZXBsYWNlKFwie3tkYXRlfX1cIiwgbW9tZW50KCkuZm9ybWF0KGRhdGVGb3JtYXQpKVxyXG4gICAgOiBcIlVudGl0bGVkXCI7XHJcblxyXG5mdW5jdGlvbiBtYWtlRmlsZW5hbWVVbmlxdWUoZmlsZW5hbWU6IHN0cmluZykge1xyXG4gIGxldCBpID0gMSxcclxuICAgIG5ld05hbWUgPSBmaWxlbmFtZTtcclxuICB3aGlsZSAoYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobmV3TmFtZSwgXCJcIikpIHtcclxuICAgIGlmIChpID09PSAxKSBuZXdOYW1lICs9IGAgJHtpfWA7XHJcbiAgICBlbHNlIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKDAsIC0yKSArIGAgJHtpfWA7XHJcbiAgICBpKys7XHJcbiAgfVxyXG4gIHJldHVybiBuZXdOYW1lO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlVGhyZWFkaW5nQ29udGVudFRlbXBsYXRlKFxyXG4gIHdyaXRlQkNzSW5saW5lOiBib29sZWFuLFxyXG4gIHRlbXBsYXRlUGF0aDogc3RyaW5nLFxyXG4gIG9wcEZpZWxkOiBzdHJpbmcsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIGNydW1iOiBzdHJpbmdcclxuKSB7XHJcbiAgbGV0IG5ld0NvbnRlbnQgPSBjcnVtYjtcclxuXHJcbiAgaWYgKHRlbXBsYXRlUGF0aCkge1xyXG4gICAgY29uc3QgdGVtcGxhdGVGaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoXHJcbiAgICAgIHRlbXBsYXRlUGF0aCxcclxuICAgICAgXCJcIlxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKHRlbXBsYXRlRmlsZSk7XHJcbiAgICBuZXdDb250ZW50ID0gdGVtcGxhdGUucmVwbGFjZShcclxuICAgICAgL1xce1xce0JDLXRocmVhZC1jcnVtYlxcfVxcfS9pLFxyXG4gICAgICB3cml0ZUJDc0lubGluZVxyXG4gICAgICAgID8gYCR7b3BwRmllbGR9OjogW1ske2N1cnJGaWxlLmJhc2VuYW1lfV1dYFxyXG4gICAgICAgIDogYCR7b3BwRmllbGR9OiBbJyR7Y3VyckZpbGUuYmFzZW5hbWV9J11gXHJcbiAgICApO1xyXG4gIH1cclxuICByZXR1cm4gbmV3Q29udGVudDtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRocmVhZChwbHVnaW46IEJDUGx1Z2luLCBmaWVsZDogc3RyaW5nKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHtcclxuICAgIHVzZXJIaWVycyxcclxuICAgIHRocmVhZGluZ1RlbXBsYXRlLFxyXG4gICAgZGF0ZUZvcm1hdCxcclxuICAgIHRocmVhZEludG9OZXdQYW5lLFxyXG4gICAgdGhyZWFkaW5nRGlyVGVtcGxhdGVzLFxyXG4gICAgdGhyZWFkVW5kZXJDdXJzb3IsXHJcbiAgICB3cml0ZUJDc0lubGluZSxcclxuICB9ID0gc2V0dGluZ3M7XHJcblxyXG4gIGNvbnN0IGN1cnJGaWxlID0gZ2V0Q3VyckZpbGUoKTtcclxuICBpZiAoIWN1cnJGaWxlKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IG5ld0ZpbGVQYXJlbnQgPSBhcHAuZmlsZU1hbmFnZXIuZ2V0TmV3RmlsZVBhcmVudChjdXJyRmlsZS5wYXRoKTtcclxuXHJcbiAgY29uc3QgZGlyID0gZ2V0RmllbGRJbmZvKHVzZXJIaWVycywgZmllbGQpLmZpZWxkRGlyO1xyXG4gIGNvbnN0IG9wcEZpZWxkID0gZ2V0T3BwRmllbGRzKHVzZXJIaWVycywgZmllbGQsIGRpcilbMF07XHJcblxyXG4gIGxldCBuZXdCYXNlbmFtZSA9IHJlc29sdmVUaHJlYWRpbmdOYW1lVGVtcGxhdGUoXHJcbiAgICB0aHJlYWRpbmdUZW1wbGF0ZSxcclxuICAgIGN1cnJGaWxlLFxyXG4gICAgZmllbGQsXHJcbiAgICBkaXIsXHJcbiAgICBkYXRlRm9ybWF0XHJcbiAgKTtcclxuICBuZXdCYXNlbmFtZSA9IG1ha2VGaWxlbmFtZVVuaXF1ZShuZXdCYXNlbmFtZSk7XHJcblxyXG4gIGNvbnN0IG9wcENydW1iID0gd3JpdGVCQ3NJbmxpbmVcclxuICAgID8gYCR7b3BwRmllbGR9OjogW1ske2N1cnJGaWxlLmJhc2VuYW1lfV1dYFxyXG4gICAgOiBgLS0tXFxuJHtvcHBGaWVsZH06IFsnJHtjdXJyRmlsZS5iYXNlbmFtZX0nXVxcbi0tLWA7XHJcblxyXG4gIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHRocmVhZGluZ0RpclRlbXBsYXRlc1tkaXJdO1xyXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZXNvbHZlVGhyZWFkaW5nQ29udGVudFRlbXBsYXRlKFxyXG4gICAgd3JpdGVCQ3NJbmxpbmUsXHJcbiAgICB0ZW1wbGF0ZVBhdGgsXHJcbiAgICBvcHBGaWVsZCxcclxuICAgIGN1cnJGaWxlLFxyXG4gICAgb3BwQ3J1bWJcclxuICApO1xyXG5cclxuICBjb25zdCBuZXdGaWxlID0gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShcclxuICAgIG5vcm1hbGl6ZVBhdGgoYCR7bmV3RmlsZVBhcmVudC5wYXRofS8ke25ld0Jhc2VuYW1lfS5tZGApLFxyXG4gICAgbmV3Q29udGVudFxyXG4gICk7XHJcblxyXG4gIGlmICghd3JpdGVCQ3NJbmxpbmUpIHtcclxuICAgIGNvbnN0IHsgYXBpIH0gPSBhcHAucGx1Z2lucy5wbHVnaW5zLm1ldGFlZGl0ID8/IHt9O1xyXG4gICAgaWYgKCFhcGkpIHtcclxuICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICBcIk1ldGFlZGl0IG11c3QgYmUgZW5hYmxlZCB0byB3cml0ZSB0byB5YW1sLiBBbHRlcm5hdGl2ZWx5LCB0b2dnbGUgdGhlIHNldHRpbmcgYFdyaXRlIEJyZWFkY3J1bWJzIElubGluZWAgdG8gdXNlIERhdGF2aWV3IGlubGluZSBmaWVsZHMgaW5zdGVhZC5cIlxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCBjcmVhdGVPclVwZGF0ZVlhbWwoXHJcbiAgICAgIGZpZWxkLFxyXG4gICAgICBuZXdGaWxlLmJhc2VuYW1lLFxyXG4gICAgICBjdXJyRmlsZSxcclxuICAgICAgYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGN1cnJGaWxlKS5mcm9udG1hdHRlcixcclxuICAgICAgYXBpXHJcbiAgICApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBjcnVtYiA9IGAke2ZpZWxkfTo6IFtbJHtuZXdGaWxlLmJhc2VuYW1lfV1dYDtcclxuICAgIGNvbnN0IHsgZWRpdG9yIH0gPSBhcHAud29ya3NwYWNlLmFjdGl2ZUxlYWYudmlldztcclxuICAgIGlmICh0aHJlYWRVbmRlckN1cnNvciB8fCAhZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5yZXBsYWNlUmFuZ2UoY3J1bWIsIGVkaXRvci5nZXRDdXJzb3IoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUT0RPIENoZWNrIGlmIHRoaXMgbm90ZSBhbHJlYWR5IGhhcyB0aGlzIGZpZWxkXHJcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoY3VyckZpbGUpO1xyXG4gICAgICBjb25zdCBzcGxpdHMgPSBzcGxpdEF0WWFtbChjb250ZW50KTtcclxuICAgICAgY29udGVudCA9XHJcbiAgICAgICAgc3BsaXRzWzBdICtcclxuICAgICAgICAoc3BsaXRzWzBdLmxlbmd0aCA/IFwiXFxuXCIgOiBcIlwiKSArXHJcbiAgICAgICAgY3J1bWIgK1xyXG4gICAgICAgIChzcGxpdHNbMV0ubGVuZ3RoID8gXCJcXG5cIiA6IFwiXCIpICtcclxuICAgICAgICBzcGxpdHNbMV07XHJcblxyXG4gICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGN1cnJGaWxlLCBjb250ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGxlYWYgPSB0aHJlYWRJbnRvTmV3UGFuZVxyXG4gICAgPyBhcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSlcclxuICAgIDogYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xyXG5cclxuICBhd2FpdCBsZWFmLm9wZW5GaWxlKG5ld0ZpbGUsIHsgYWN0aXZlOiB0cnVlLCBtb2RlOiBcInNvdXJjZVwiIH0pO1xyXG5cclxuICBpZiAodGVtcGxhdGVQYXRoKSB7XHJcbiAgICBpZiAoYXBwLnBsdWdpbnMucGx1Z2luc1tcInRlbXBsYXRlci1vYnNpZGlhblwiXSkge1xyXG4gICAgICBhcHAuY29tbWFuZHMuZXhlY3V0ZUNvbW1hbmRCeUlkKFxyXG4gICAgICAgIFwidGVtcGxhdGVyLW9ic2lkaWFuOnJlcGxhY2UtaW4tZmlsZS10ZW1wbGF0ZXJcIlxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICBcIlRoZSBUZW1wbGF0ZXIgcGx1Z2luIG11c3QgYmUgZW5hYmxlZCB0byByZXNvbHZlIHRoZSB0ZW1wbGF0ZXMgaW4gdGhlIG5ldyBub3RlXCJcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmICh0aHJlYWRpbmdUZW1wbGF0ZSkge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgY29uc3QgZWRpdG9yID0gbGVhZi52aWV3LmVkaXRvciBhcyBFZGl0b3I7XHJcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKGVkaXRvci5nZXRWYWx1ZSgpLmxlbmd0aCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IG5vdGVOYW1lSW5wdXRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInZpZXctaGVhZGVyLXRpdGxlXCIpO1xyXG5cclxuICAgIGNvbnN0IG5ld05vdGVJbnB1dEVsID0gQXJyYXkuZnJvbShub3RlTmFtZUlucHV0cykuZmluZChcclxuICAgICAgKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSA9PiBpbnB1dC5pbm5lclRleHQgPT09IG5ld0Jhc2VuYW1lXHJcbiAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBuZXdOb3RlSW5wdXRFbC5pbm5lclRleHQgPSBcIlwiO1xyXG4gICAgbmV3Tm90ZUlucHV0RWwuZm9jdXMoKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuaW1wb3J0IHsgTm90aWNlLCBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBnZXRPcHBGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGNoYW5nZVlhbWwsIGdldEN1cnJGaWxlLCBzcGxpdEF0WWFtbCB9IGZyb20gXCIuLi9VdGlscy9PYnNpZGlhblV0aWxzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCQ1RvRmlsZShwbHVnaW46IEJDUGx1Z2luLCBjdXJyRmlsZT86IFRGaWxlKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncywgbWFpbkcgfSA9IHBsdWdpbjtcclxuICBjb25zdCBmaWxlID0gY3VyckZpbGUgPz8gZ2V0Q3VyckZpbGUoKTtcclxuXHJcbiAgY29uc3QgeyBsaW1pdFdyaXRlQkNDaGVja2JveGVzLCB3cml0ZUJDc0lubGluZSwgdXNlckhpZXJzIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgY29uc3Qgc3VjY0luZm8gPSBtYWluRy5tYXBJbkVkZ2VzKGZpbGUuYmFzZW5hbWUsIChrLCBhLCBzLCB0KSA9PiB7XHJcbiAgICBjb25zdCB7IGZpZWxkLCBkaXIgfSA9IGE7XHJcbiAgICBjb25zdCBvcHBGaWVsZCA9IGdldE9wcEZpZWxkcyh1c2VySGllcnMsIGZpZWxkLCBkaXIpWzBdO1xyXG4gICAgcmV0dXJuIHsgc3VjYzogcywgZmllbGQ6IG9wcEZpZWxkIH07XHJcbiAgfSk7XHJcblxyXG4gIGZvciAoY29uc3QgeyBzdWNjLCBmaWVsZCB9IG9mIHN1Y2NJbmZvKSB7XHJcbiAgICBpZiAoIWxpbWl0V3JpdGVCQ0NoZWNrYm94ZXMuaW5jbHVkZXMoZmllbGQpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG4gICAgY29uc3QgW3lhbWwsIGFmdGVyWWFtbF0gPSBzcGxpdEF0WWFtbChjb250ZW50KTtcclxuXHJcbiAgICBpZiAoIXdyaXRlQkNzSW5saW5lKSB7XHJcbiAgICAgIGNvbnN0IGlubmVyID0geWFtbCA9PT0gXCJcIiA/IHlhbWwgOiB5YW1sLnNsaWNlKDQsIC00KTtcclxuICAgICAgY29uc3QgbmV3WWFtbCA9IGNoYW5nZVlhbWwoaW5uZXIsIGZpZWxkLCBzdWNjKTtcclxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAtLS1cXG4ke25ld1lhbWx9XFxuLS0tJHthZnRlcllhbWx9YDtcclxuICAgICAgYXdhaXQgYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRPRE8gQ2hlY2sgaWYgdGhpcyBub3RlIGFscmVhZHkgaGFzIHRoaXMgZmllbGRcclxuICAgICAgY29uc3QgbmV3Q29udGVudCA9XHJcbiAgICAgICAgeWFtbCArXHJcbiAgICAgICAgKHlhbWwubGVuZ3RoID8gXCJcXG5cIiA6IFwiXCIpICtcclxuICAgICAgICBgJHtmaWVsZH06OiBbWyR7c3VjY31dXWAgK1xyXG4gICAgICAgIChhZnRlcllhbWwubGVuZ3RoID8gXCJcXG5cIiA6IFwiXCIpICtcclxuICAgICAgICBhZnRlcllhbWw7XHJcblxyXG4gICAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG5ld0NvbnRlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlQkNzVG9BbGxGaWxlcyhwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgaWYgKCFwbHVnaW4uc2V0dGluZ3Muc2hvd1dyaXRlQWxsQkNzQ21kKSB7XHJcbiAgICBuZXcgTm90aWNlKFxyXG4gICAgICBcIllvdSBmaXJzdCBuZWVkIHRvIGVuYWJsZSB0aGlzIGNvbW1hbmQgaW4gQnJlYWRjcnVtYnMnIHNldHRpbmdzLlwiXHJcbiAgICApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBpZiAoXHJcbiAgICB3aW5kb3cuY29uZmlybShcclxuICAgICAgXCJUaGlzIGFjdGlvbiB3aWxsIHdyaXRlIHRoZSBpbXBsaWVkIEJyZWFkY3J1bWJzIG9mIGVhY2ggZmlsZSB0byB0aGF0IGZpbGUuXFxuSXQgdXNlcyB0aGUgTWV0YUVkaXQgcGx1Z2lucyBBUEkgdG8gdXBkYXRlIHRoZSBZQU1MLCBzbyBpdCBzaG91bGQgb25seSBhZmZlY3QgdGhhdCBmcm9udG1hdHRlciBvZiB5b3VyIG5vdGUuXFxuSSBjYW4ndCBwcm9taXNlIHRoYXQgbm90aGluZyBiYWQgd2lsbCBoYXBwZW4uICoqVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZSoqLlwiXHJcbiAgICApXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHdpbmRvdy5jb25maXJtKFxyXG4gICAgICAgIFwiQXJlIHlvdSBzdXJlPyBZb3UgaGF2ZSBiZWVuIHdhcm5lZCB0aGF0IHRoaXMgb3BlcmF0aW9uIHdpbGwgYXR0ZW1wdCB0byB1cGRhdGUgYWxsIGZpbGVzIHdpdGggaW1wbGllZCBicmVhZGNydW1icy5cIlxyXG4gICAgICApXHJcbiAgICApIHtcclxuICAgICAgaWYgKHdpbmRvdy5jb25maXJtKFwiRm9yIHJlYWwsIHBsZWFzZSBtYWtlIGEgYmFjayB1cCBiZWZvcmUuXCIpKSB7XHJcbiAgICAgICAgY29uc3Qgbm90aWNlID0gbmV3IE5vdGljZShcIk9wZXJhdGlvbiBTdGFydGVkXCIpO1xyXG4gICAgICAgIGNvbnN0IHByb2JsZW1GaWxlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUJDVG9GaWxlKHBsdWdpbiwgZmlsZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHByb2JsZW1GaWxlcy5wdXNoKGZpbGUucGF0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vdGljZS5zZXRNZXNzYWdlKFwiT3BlcmF0aW9uIENvbXBsZXRlXCIpO1xyXG4gICAgICAgIGlmIChwcm9ibGVtRmlsZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBuZXcgTm90aWNlKFxyXG4gICAgICAgICAgICBcIlNvbWUgZmlsZXMgd2VyZSBub3QgdXBkYXRlZCBkdWUgdG8gZXJyb3JzLiBDaGVjayB0aGUgY29uc29sZSB0byBzZWUgd2hpY2ggb25lcy5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHdhcm4oeyBwcm9ibGVtRmlsZXMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQge1xyXG4gIEVkaXRvcixcclxuICBFZGl0b3JQb3NpdGlvbixcclxuICBFZGl0b3JTdWdnZXN0LFxyXG4gIEVkaXRvclN1Z2dlc3RDb250ZXh0LFxyXG4gIEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgaXNJbnNpZGVZYW1sIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgeyBCQ19GSUVMRFNfSU5GTyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmllbGRTdWdnZXN0b3IgZXh0ZW5kcyBFZGl0b3JTdWdnZXN0PHN0cmluZz4ge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGFwcCk7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICB9XHJcblxyXG4gIG9uVHJpZ2dlcihcclxuICAgIGN1cnNvcjogRWRpdG9yUG9zaXRpb24sXHJcbiAgICBlZGl0b3I6IEVkaXRvcixcclxuICAgIF86IFRGaWxlXHJcbiAgKTogRWRpdG9yU3VnZ2VzdFRyaWdnZXJJbmZvIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzdWIgPSBlZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSkuc3Vic3RyaW5nKDAsIGN1cnNvci5jaCk7XHJcbiAgICBjb25zdCBtYXRjaCA9IHN1Yi5tYXRjaCgvXkJDLSguKikkLyk/LlsxXTtcclxuICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZW5kOiBjdXJzb3IsXHJcbiAgICAgICAgc3RhcnQ6IHtcclxuICAgICAgICAgIGNoOiBzdWIubGFzdEluZGV4T2YobWF0Y2gpLFxyXG4gICAgICAgICAgbGluZTogY3Vyc29yLmxpbmUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBxdWVyeTogbWF0Y2gsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRTdWdnZXN0aW9ucyA9IChjb250ZXh0OiBFZGl0b3JTdWdnZXN0Q29udGV4dCkgPT4ge1xyXG4gICAgY29uc3QgeyBxdWVyeSB9ID0gY29udGV4dDtcclxuICAgIHJldHVybiBCQ19GSUVMRFNfSU5GTy5tYXAoKHN1ZykgPT4gc3VnLmZpZWxkKS5maWx0ZXIoKHN1ZykgPT5cclxuICAgICAgc3VnLmluY2x1ZGVzKHF1ZXJ5KVxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICByZW5kZXJTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IHN0cmluZywgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBlbC5jcmVhdGVEaXYoe1xyXG4gICAgICB0ZXh0OiBzdWdnZXN0aW9uLnJlcGxhY2UoXCJCQy1cIiwgXCJcIiksXHJcbiAgICAgIGNsczogXCJCQy1zdWdnZXN0ZXItY29udGFpbmVyXCIsXHJcbiAgICAgIGF0dHI6IHtcclxuICAgICAgICBcImFyaWEtbGFiZWxcIjogQkNfRklFTERTX0lORk8uZmluZCgoZikgPT4gZi5maWVsZCA9PT0gc3VnZ2VzdGlvbik/LmRlc2MsXHJcbiAgICAgICAgXCJhcmlhLWxhYmVsLXBvc2l0aW9uXCI6IFwicmlnaHRcIixcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgY29udGV4dCwgcGx1Z2luIH0gPSB0aGlzO1xyXG4gICAgaWYgKCFjb250ZXh0KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZmllbGQgPSBCQ19GSUVMRFNfSU5GTy5maW5kKChmKSA9PiBmLmZpZWxkID09PSBzdWdnZXN0aW9uKTtcclxuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gYCR7c3VnZ2VzdGlvbn0ke2ZpZWxkPy5baXNJbnNpZGVZYW1sKGFwcCkgPyBcImFmdGVyWWFtbFwiIDogXCJhZnRlcklubGluZVwiXVxyXG4gICAgICB9YDtcclxuXHJcbiAgICBjb250ZXh0LmVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcbiAgICAgIHJlcGxhY2VtZW50LFxyXG4gICAgICB7IGNoOiAwLCBsaW5lOiBjb250ZXh0LnN0YXJ0LmxpbmUgfSxcclxuICAgICAgY29udGV4dC5lbmRcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiIsICJpbXBvcnQge1xyXG4gIEVkaXRvcixcclxuICBFZGl0b3JQb3NpdGlvbixcclxuICBFZGl0b3JTdWdnZXN0LFxyXG4gIEVkaXRvclN1Z2dlc3RDb250ZXh0LFxyXG4gIEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyxcclxuICBURmlsZSxcclxufSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgaXNJbnNpZGVZYW1sIH0gZnJvbSBcIi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XHJcbmltcG9ydCB7IGVzY2FwZVJlZ2V4IH0gZnJvbSBcIi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlbGF0aW9uU3VnZ2VzdG9yIGV4dGVuZHMgRWRpdG9yU3VnZ2VzdDxzdHJpbmc+IHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwbHVnaW46IEJDUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHApO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBvblRyaWdnZXIoXHJcbiAgICBjdXJzb3I6IEVkaXRvclBvc2l0aW9uLFxyXG4gICAgZWRpdG9yOiBFZGl0b3IsXHJcbiAgICBfOiBURmlsZVxyXG4gICk6IEVkaXRvclN1Z2dlc3RUcmlnZ2VySW5mbyB8IG51bGwge1xyXG4gICAgY29uc3QgdHJpZyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnJlbFN1Z2dlc3RvclRyaWdnZXI7XHJcbiAgICBjb25zdCBzdWIgPSBlZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSkuc3Vic3RyaW5nKDAsIGN1cnNvci5jaCk7XHJcblxyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAuKj8ke2VzY2FwZVJlZ2V4KHRyaWcpfSguKikkYCk7XHJcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3ViKT8uWzFdO1xyXG5cclxuICAgIGlmIChtYXRjaCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXJ0OiB7XHJcbiAgICAgICAgY2g6IHN1Yi5sYXN0SW5kZXhPZih0cmlnKSxcclxuICAgICAgICBsaW5lOiBjdXJzb3IubGluZSxcclxuICAgICAgfSxcclxuICAgICAgZW5kOiBjdXJzb3IsXHJcbiAgICAgIHF1ZXJ5OiBtYXRjaCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRTdWdnZXN0aW9ucyA9IChjb250ZXh0OiBFZGl0b3JTdWdnZXN0Q29udGV4dCkgPT4ge1xyXG4gICAgY29uc3QgeyBxdWVyeSB9ID0gY29udGV4dDtcclxuICAgIGNvbnN0IHsgdXNlckhpZXJzIH0gPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcclxuICAgIHJldHVybiBnZXRGaWVsZHModXNlckhpZXJzKS5maWx0ZXIoKHN1ZykgPT4gc3VnLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgfTtcclxuXHJcbiAgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgZWwuY3JlYXRlRGl2KHtcclxuICAgICAgdGV4dDogc3VnZ2VzdGlvbixcclxuICAgICAgY2xzOiBcImNvZGVibG9jay1zdWdnZXN0aW9uXCIsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGNvbnRleHQsIHBsdWdpbiB9ID0gdGhpcztcclxuICAgIGlmICghY29udGV4dCkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgdHJpZyA9IHBsdWdpbi5zZXR0aW5ncy5yZWxTdWdnZXN0b3JUcmlnZ2VyO1xyXG4gICAgY29uc3QgeyBzdGFydCwgZW5kLCBlZGl0b3IgfSA9IGNvbnRleHQ7XHJcblxyXG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBzdWdnZXN0aW9uICsgKGlzSW5zaWRlWWFtbChhcHApID8gXCI6IFwiIDogXCI6OiBcIikgKyAnW1snO1xyXG4gICAgZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuICAgICAgcmVwbGFjZW1lbnQsXHJcbiAgICAgIHsgY2g6IHN0YXJ0LmNoICsgMSAtIHRyaWcubGVuZ3RoLCBsaW5lOiBzdGFydC5saW5lIH0sXHJcbiAgICAgIGVuZFxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIiwgImltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZHJhd1RyYWlsIH0gZnJvbSBcInNyYy9WaWV3cy9UcmFpbFZpZXdcIjtcclxuaW1wb3J0IEtvRmkgZnJvbSBcIi4uL0NvbXBvbmVudHMvS29GaS5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgYWRkQ3JlYXRlSW5kZXhTZXR0aW5ncyB9IGZyb20gXCIuL0NyZWF0ZUluZGV4U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkQ1NWU2V0dGluZ3MgfSBmcm9tIFwiLi9DU1ZTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGREYXRhdmlld1NldHRpbmdzIH0gZnJvbSBcIi4vRGF0YXZpZXdOb3RlU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkRGF0ZU5vdGVTZXR0aW5ncyB9IGZyb20gXCIuL0RhdGVOb3RlU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkRGVidWdnaW5nc1NldHRpbmdzIH0gZnJvbSBcIi4vRGVidWdnaW5nU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkRGVuZHJvblNldHRpbmdzIH0gZnJvbSBcIi4vRGVuZHJvblNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZEdlbmVyYWxTZXR0aW5ncyB9IGZyb20gXCIuL0dlbmVyYWxTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRIaWVyYXJjaHlOb3RlU2V0dGluZ3MgfSBmcm9tIFwiLi9IaWVyYXJjaHlOb3RlU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkSGllcmFyY2h5U2V0dGluZ3MgfSBmcm9tIFwiLi9IaWVyYXJjaHlTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBhZGRKdW1wVG9OZXh0U2V0dGluZ3MgfSBmcm9tIFwiLi9KdW1wVG9OZXh0U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkTWF0cml4Vmlld1NldHRpbmdzIH0gZnJvbSBcIi4vTWF0cml4Vmlld1NldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZE5vU3lzdGVtU2V0dGluZ3MgfSBmcm9tIFwiLi9Ob1N5c3RlbVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFJlZ2V4Tm90ZVNldHRpbmdzIH0gZnJvbSBcIi4vUmVnZXhOb3RlU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkUmVsYXRpb25TZXR0aW5ncyB9IGZyb20gXCIuL1JlbGF0aW9uU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkVGFnTm90ZVNldHRpbmdzIH0gZnJvbSBcIi4vVGFnTm90ZVNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFRocmVhZGluZ1NldHRpbmdzIH0gZnJvbSBcIi4vVGhyZWFkaW5nU2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgYWRkVHJhaWxWaWV3U2V0dGluZ3MgfSBmcm9tIFwiLi9UcmFpbFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFZpc01vZGFsU2V0dGluZ3MgfSBmcm9tIFwiLi9WaXNNb2RhbFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IGFkZFdyaXRlQkNzU2V0dGluZ3MgfSBmcm9tIFwiLi9Xcml0ZUJDc1NldHRpbmdzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZnJhZ1dpdGhIVE1MID0gKGh0bWw6IHN0cmluZykgPT5cclxuICBjcmVhdGVGcmFnbWVudCgoZnJhZykgPT4gKGZyYWcuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gaHRtbCkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGRldGFpbHMgPSAodGV4dDogc3RyaW5nLCBwYXJlbnQ6IEhUTUxFbGVtZW50KSA9PlxyXG4gIHBhcmVudC5jcmVhdGVFbChcImRldGFpbHNcIiwge30sIChkKSA9PiBkLmNyZWF0ZUVsKFwic3VtbWFyeVwiLCB7IHRleHQgfSkpO1xyXG5cclxuZXhwb3J0IGNvbnN0IHN1YkRldGFpbHMgPSAodGV4dDogc3RyaW5nLCBwYXJlbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCkgPT5cclxuICBwYXJlbnQuY3JlYXRlRGl2KHtcclxuICAgIGF0dHI6IHsgc3R5bGU6IFwicGFkZGluZy1sZWZ0OiAxMHB4O1wiIH0sXHJcbiAgfSlcclxuICAgIC5jcmVhdGVFbChcImRldGFpbHNcIiwge30sIChkKSA9PiBkLmNyZWF0ZUVsKFwic3VtbWFyeVwiLCB7IHRleHQgfSkpO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJDU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG4gIHBsdWdpbjogQkNQbHVnaW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGlzcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHsgcGx1Z2luLCBjb250YWluZXJFbCB9ID0gdGhpcztcclxuICAgIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpblxyXG5cclxuICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJCcmVhZGNydW1icyBTZXR0aW5nc1wiIH0pO1xyXG4gICAgY29udGFpbmVyRWwuYWRkQ2xhc3MoXCJCQy1zZXR0aW5ncy10YWJcIik7XHJcblxyXG4gICAgYWRkSGllcmFyY2h5U2V0dGluZ3MocGx1Z2luLCBjb250YWluZXJFbCk7XHJcbiAgICBhZGRSZWxhdGlvblNldHRpbmdzKHBsdWdpbiwgY29udGFpbmVyRWwpO1xyXG4gICAgYWRkR2VuZXJhbFNldHRpbmdzKHBsdWdpbiwgY29udGFpbmVyRWwpO1xyXG5cclxuICAgIGNvbnN0IHZpZXdEZXRhaWxzID0gZGV0YWlscyhcIlZpZXdzXCIsIGNvbnRhaW5lckVsKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyh2aWV3RGV0YWlscylcclxuICAgICAgLnNldE5hbWUoXCJPcGVuIFZpZXdzIGJ5IERlZmF1bHRcIilcclxuICAgICAgLnNldERlc2MoZnJhZ1dpdGhIVE1MKFwiQ2hvb3NlIHdoaWNoIG9mIHRoZSB2aWV3cyB0byBvcGVuIG9ubG9hZDxici8+T3JkZXIgaXM6IFRyYWlsL0dyaWQvSnVnZ2wsIE1hdHJpeCwgRHVja3MsIFRyZWVcIikpXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICB0b2dnbGVcclxuICAgICAgICAgIC5zZXRUb29sdGlwKFwiVHJhaWwvR3JpZC9KdWdnbFwiKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnNob3dCQ3MpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLnNob3dCQ3MgPSB2YWx1ZTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgdG9nZ2xlXHJcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIk1hdHJpeCBWaWV3XCIpXHJcbiAgICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Mub3Blbk1hdHJpeE9uTG9hZClcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgc2V0dGluZ3Mub3Blbk1hdHJpeE9uTG9hZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgICAgdG9nZ2xlXHJcbiAgICAgICAgICAuc2V0VG9vbHRpcChcIkR1Y2tzIFZpZXdcIilcclxuICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5vcGVuRHVja09uTG9hZClcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgc2V0dGluZ3Mub3BlbkR1Y2tPbkxvYWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICAgIHRvZ2dsZVxyXG4gICAgICAgICAgLnNldFRvb2x0aXAoXCJUcmVlIFZpZXdcIilcclxuICAgICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5vcGVuRG93bk9uTG9hZClcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgc2V0dGluZ3Mub3BlbkRvd25PbkxvYWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHZpZXdEZXRhaWxzLmNyZWF0ZUVsKCdocicpXHJcblxyXG4gICAgYWRkTWF0cml4Vmlld1NldHRpbmdzKHBsdWdpbiwgdmlld0RldGFpbHMpO1xyXG4gICAgYWRkVHJhaWxWaWV3U2V0dGluZ3MocGx1Z2luLCB2aWV3RGV0YWlscyk7XHJcbiAgICBhZGRWaXNNb2RhbFNldHRpbmdzKHBsdWdpbiwgdmlld0RldGFpbHMpO1xyXG4gICAgLy8gYWRkVHJlZVZpZXdTZXR0aW5ncyhwbHVnaW4sIHZpZXdEZXRhaWxzKTtcclxuXHJcbiAgICBjb25zdCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMgPSBkZXRhaWxzKFxyXG4gICAgICBcIkFsdGVybmF0aXZlIEhpZXJhcmNoaWVzXCIsXHJcbiAgICAgIGNvbnRhaW5lckVsXHJcbiAgICApO1xyXG5cclxuICAgIGFkZFRhZ05vdGVTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGRSZWdleE5vdGVTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGROb1N5c3RlbVNldHRpbmdzKHBsdWdpbiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuICAgIGFkZEhpZXJhcmNoeU5vdGVTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGRDU1ZTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGREZW5kcm9uU2V0dGluZ3MocGx1Z2luLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG4gICAgYWRkRGF0YXZpZXdTZXR0aW5ncyhwbHVnaW4sIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcbiAgICBhZGREYXRlTm90ZVNldHRpbmdzKHBsdWdpbiwgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzKTtcclxuXHJcbiAgICBjb25zdCBjbWRzRGV0YWlscyA9IGRldGFpbHMoXCJDb21tYW5kc1wiLCBjb250YWluZXJFbCk7XHJcbiAgICBhZGRXcml0ZUJDc1NldHRpbmdzKHBsdWdpbiwgY21kc0RldGFpbHMpO1xyXG4gICAgYWRkQ3JlYXRlSW5kZXhTZXR0aW5ncyhwbHVnaW4sIGNtZHNEZXRhaWxzKTtcclxuICAgIGFkZFRocmVhZGluZ1NldHRpbmdzKHBsdWdpbiwgY21kc0RldGFpbHMpO1xyXG4gICAgYWRkSnVtcFRvTmV4dFNldHRpbmdzKHBsdWdpbiwgY21kc0RldGFpbHMpO1xyXG5cclxuICAgIGFkZERlYnVnZ2luZ3NTZXR0aW5ncyhwbHVnaW4sIGNvbnRhaW5lckVsKTtcclxuXHJcbiAgICBuZXcgS29GaSh7IHRhcmdldDogY29udGFpbmVyRWwgfSk7XHJcbiAgfVxyXG59XHJcbiIsICI8IS0tIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL0hFbWlsZS9qdWdnbC9ibG9iL21haW4vanVnZ2wvdWkvS29GaS5zdmVsdGUgLS0+XHJcbjxzY3JpcHQ+XHJcbiAgbGV0IGJ1dHRvbjtcclxuICBjb25zdCBpbml0aWFsaXplS29maSA9ICgpID0+IHtcclxuICAgIGtvZml3aWRnZXQyLmluaXQoXHJcbiAgICAgIFwiU3VwcG9ydCBCcmVhZGNydW1icyBkZXZlbG9wbWVudCFcIixcclxuICAgICAgXCIjMjlhYmUwXCIsXHJcbiAgICAgIFwiRzJHNDU0VFpGXCJcclxuICAgICk7XHJcbiAgICBidXR0b24uaW5uZXJIVE1MID0ga29maXdpZGdldDIuZ2V0SFRNTCgpO1xyXG4gIH07XHJcbjwvc2NyaXB0PlxyXG5cclxuPHN2ZWx0ZTpoZWFkPlxyXG4gIDxzY3JpcHRcclxuICAgIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIlxyXG4gICAgc3JjPVwiaHR0cHM6Ly9rby1maS5jb20vd2lkZ2V0cy93aWRnZXRfMi5qc1wiXHJcbiAgICBvbjpsb2FkPXtpbml0aWFsaXplS29maX0+XHJcbiAgPC9zY3JpcHQ+XHJcbjwvc3ZlbHRlOmhlYWQ+XHJcbjxkaXYgY2xhc3M9XCJCQy1Lb2ZpLWJ1dHRvblwiIGJpbmQ6dGhpcz17YnV0dG9ufSAvPlxyXG5cclxuPHN0eWxlPlxyXG4gIC5CQy1Lb2ZpLWJ1dHRvbiB7XHJcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gIH1cclxuPC9zdHlsZT5cclxuIiwgImltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ3JlYXRlSW5kZXhTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNtZHNEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGNyZWF0ZUluZGV4RGV0YWlscyA9IHN1YkRldGFpbHMoXCJDcmVhdGUgSW5kZXhcIiwgY21kc0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhjcmVhdGVJbmRleERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkFkZCB3aWtsaW5rIGJyYWNrZXRzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiV2hlbiBjcmVhdGluZyBhbiBpbmRleCwgc2hvdWxkIGl0IHdyYXAgdGhlIG5vdGUgbmFtZSBpbiB3aWtpbGlua3MgPGNvZGU+W1tdXTwvY29kZT4gb3Igbm90Llxcblx1MjcwNSA9IHllcywgXHUyNzRDID0gbm8uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Mud2lraWxpbmtJbmRleCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Mud2lraWxpbmtJbmRleCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGNyZWF0ZUluZGV4RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiSW5kZW50IENoYXJhY3RlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICAnVGhlIGNoYXJhY3RlcihzKSB1c2VkIHRvIGluZGVudCB0aGUgaW5kZXguIFRoZXNlIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudCwgYnV0IHdpbGwgdXN1YWxseSBiZSBlaXRoZXIgc3BhY2VzIG9yIHRhYnMuIEVudGVyIDxjb2RlPlxcXFx0PC9jb2RlPiB0byB1c2UgdGFicy4nXHJcbiAgICAgICkpXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmNyZWF0ZUluZGV4SW5kZW50KVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmNyZWF0ZUluZGV4SW5kZW50ID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcblxyXG4gIG5ldyBTZXR0aW5nKGNyZWF0ZUluZGV4RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBhbGlhc2VzIG9mIG5vdGVzIGluIGluZGV4XCIpXHJcbiAgICAuc2V0RGVzYyhcIlNob3cgdGhlIGFsaWFzZXMgb2YgZWFjaCBub3RlIGluIGJyYWNrZXRzLlxcblx1MjcwNSA9IHllcywgXHUyNzRDID0gbm8uXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5hbGlhc2VzSW5JbmRleCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuYWxpYXNlc0luSW5kZXggPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG59XHJcbiIsICJpbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRDU1ZTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCBjc3ZEZXRhaWxzID0gc3ViRGV0YWlscyhcIkNTViBOb3Rlc1wiLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhjc3ZEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJDU1YgQnJlYWRjcnVtYiBQYXRoc1wiKVxyXG4gICAgLnNldERlc2MoXCJUaGUgZmlsZSBwYXRoIG9mIGEgY3N2IGZpbGVzIHdpdGggYnJlYWRjcnVtYnMgaW5mb3JtYXRpb24uXCIpXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLkNTVlBhdGhzKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5DU1ZQYXRocyA9IHRleHQuaW5wdXRFbC52YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZERhdGF2aWV3U2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gIGNvbnN0IGR2RGV0YWlscyA9IHN1YkRldGFpbHMoXCJEYXRhdmlldyBOb3Rlc1wiLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhkdkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgRGF0YXZpZXcgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIERhdGF2aWV3IG5vdGVzIHVzZSB0aGUgZmlyc3QgZmllbGQgaW4geW91ciBoaWVyYXJjaGllcyAodXN1YWxseSBhbiA8Y29kZT5cdTIxOTE8L2NvZGU+IGZpZWxkKS4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdCwgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSA8Y29kZT5CQy1kYXRhdmlldy1ub3RlLWZpZWxkOiB7ZmllbGR9PC9jb2RlPi48L2JyPklmIHlvdSBkb24ndCB3YW50IHRvIGNob29zZSBhIGRlZmF1bHQsIHNlbGVjdCB0aGUgYmxhbmsgb3B0aW9uIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiBkZC5hZGRPcHRpb24oZmllbGQsIGZpZWxkKSk7XHJcbiAgICAgIGRkLmFkZE9wdGlvbihcIlwiLCBcIlwiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kYXRhdmlld05vdGVGaWVsZClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5kYXRhdmlld05vdGVGaWVsZCA9IGZpZWxkO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZERhdGVOb3RlU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB1c2VySGllcnMgfSA9IHNldHRpbmdzO1xyXG4gIGNvbnN0IGZpZWxkcyA9IGdldEZpZWxkcyh1c2VySGllcnMpO1xyXG4gIGNvbnN0IGZpZWxkT3B0aW9ucyA9IHsgXCJcIjogXCJcIiB9O1xyXG4gIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gKGZpZWxkT3B0aW9uc1tmaWVsZF0gPSBmaWVsZCkpO1xyXG5cclxuICBjb25zdCBkYXRlTm90ZURldGFpbHMgPSBzdWJEZXRhaWxzKFwiRGF0ZSBOb3Rlc1wiLCBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyhkYXRlTm90ZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkFkZCBEYXRlIE5vdGVzIHRvIEdyYXBoXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJCcmVhZGNydW1icyB3aWxsIHRyeSB0byBsaW5rIGVhY2ggZGFpbHkgbm90ZSB0byB0aGUgbmV4dCBvbmUgdXNpbmcgdGhlIGRhdGUgZm9ybWF0IHlvdSBwcm92aWRlIGluIHRoZSBzZXR0aW5ncyBiZWxvdy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5hZGREYXRlTm90ZXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLmFkZERhdGVOb3RlcyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGF0ZU5vdGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEYWlseSBOb3RlIEZvcm1hdFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBgVGhlIEx1eG9uIGRhdGUgZm9ybWF0IG9mIHlvdXIgZGFpbHkgbm90ZXMuPC9icj48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEx1eG9uIHVzZXMgZGlmZmVyZW50IGZvcm1hdHMgdG8gTW9tZW50LCBzbyB5b3VyIGZvcm1hdCBmb3IgdGhlIERhaWx5IE5vdGVzIHBsdWdpbiBtYXkgbm90IHdvcmsgaGVyZS4gQmUgc3VyZSB0byBjaGVjayBvdXQgPGEgaHJlZj1cImh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi8jL2Zvcm1hdHRpbmc/aWQ9dGFibGUtb2YtdG9rZW5zXCI+dGhlIGRvY3M8L2E+IHRvIGZpbmQgdGhlIHJpZ2h0IGZvcm1hdC48YnI+WW91IGNhbiBlc2NhcGUgY2hhcmFjdGVycyBieSB3cmFwcGluZyB0aGVtIGluIHNpbmdsZSBxdW90ZXMgKGUuZy4gPGNvZGU+eXl5eS1NTS1kZCAnRGFpbHkgTm90ZSc8L2NvZGU+KWBcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+IHtcclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5kYXRlTm90ZUZvcm1hdCk7XHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZGF0ZU5vdGVGb3JtYXQgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGF0ZSBOb3RlIEZpZWxkXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiU2VsZWN0IGEgZmllbGQgdG8gcG9pbnQgdG8gdG9tb3Jyb3cncyBub3RlIGZyb20gdGhlIGN1cnJlbnQgbm90ZS4gVGhlIG9wcG9zaXRlIGZpZWxkIHdpbGwgYmUgdXNlZCB0byBwb2ludCB0byB5ZXN0ZXJkYXkncyBub3RlLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGRkLmFkZE9wdGlvbnMoZmllbGRPcHRpb25zKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5kYXRlTm90ZUZpZWxkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmRhdGVOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIC8vIG5ldyBTZXR0aW5nKGRhdGVOb3RlRGV0YWlscylcclxuICAvLyAgIC5zZXROYW1lKFwiUG9pbnQgdXAgdG8gTW9udGhcIilcclxuICAvLyAgIC5zZXREZXNjKFxyXG4gIC8vICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgLy8gICAgICAgXCJTZWxlY3QgYSBmaWVsZCB0byBwb2ludCB1cHdhcmRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1vbnRoIChUaGlzIHdpbGwgc3RpbGwgd29yayBpZiBhIG5vdGUgZG9lc24ndCBleGlzdCBmb3IgdGhhdCBtb250aCkuPGJyPkxlYXZlIHRoZSBkcm9wZG93biBibGFuayB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cIlxyXG4gIC8vICAgICApXHJcbiAgLy8gICApXHJcbiAgLy8gICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gIC8vICAgICBkZC5hZGRPcHRpb25zKGZpZWxkT3B0aW9ucyk7XHJcbiAgLy8gICAgIGRkLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gIC8vICAgICAgIHNldHRpbmdzLmRhdGVOb3RlQWRkTW9udGggPSBmaWVsZDtcclxuICAvLyAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgLy8gICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gbmV3IFNldHRpbmcoZGF0ZU5vdGVEZXRhaWxzKVxyXG4gIC8vICAgLnNldE5hbWUoXCJQb2ludCB1cCB0byBZZWFyXCIpXHJcbiAgLy8gICAuc2V0RGVzYyhcclxuICAvLyAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gIC8vICAgICAgIFwiU2VsZWN0IGEgZmllbGQgdG8gcG9pbnQgdXB3YXJkcyB0byB0aGUgY29ycmVzcG9uZGluZyB5ZWFyIChUaGlzIHdpbGwgc3RpbGwgd29yayBpZiBhIG5vdGUgZG9lc24ndCBleGlzdCBmb3IgdGhhdCB5ZWFyKS48YnI+TGVhdmUgdGhlIGRyb3Bkb3duIGJsYW5rIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLlwiXHJcbiAgLy8gICAgIClcclxuICAvLyAgIClcclxuICAvLyAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgLy8gICAgIGRkLmFkZE9wdGlvbnMoZmllbGRPcHRpb25zKTtcclxuICAvLyAgICAgZGQub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgLy8gICAgICAgc2V0dGluZ3MuZGF0ZU5vdGVBZGRZZWFyID0gZmllbGQ7XHJcbiAgLy8gICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gIC8vICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyAgIH0pO1xyXG59XHJcbiIsICJpbXBvcnQgbG9nIGZyb20gXCJsb2dsZXZlbFwiO1xyXG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgRGVidWdMZXZlbCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGRldGFpbHMsIGZyYWdXaXRoSFRNTCB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZERlYnVnZ2luZ3NTZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgZGVidWdEZXRhaWxzID0gZGV0YWlscyhcIkRlYnVnZ2luZ1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGRlYnVnRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVidWcgTW9kZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlNldCB0aGUgbWluaW11bSBsZXZlbCBvZiBkZWJ1ZyBtZXNzYWdlcyB0byBjb25zb2xlIGxvZy4gSWYgeW91IGNob29zZSA8Y29kZT5UUkFDRTwvY29kZT4sIHRoZW4gZXZlcnl0aGluZyB3aWxsIGJlIGxvZ2dlZC4gSWYgeW91IGNob29zZSA8Y29kZT5FUlJPUjwvY29kZT4sIHRoZW4gb25seSB0aGUgbW9zdCBuZWNlc3NhcnkgaXNzdWVzIHdpbGwgYmUgbG9nZ2VkLiA8Y29kZT5TSUxFTlQ8L2NvZGU+IHdpbGwgdHVybiBvZmYgYWxsIGxvZ3MuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZCkgPT4ge1xyXG4gICAgICBPYmplY3Qua2V5cyhsb2cubGV2ZWxzKS5mb3JFYWNoKChrZXkpID0+IGRkLmFkZE9wdGlvbihrZXksIGtleSkpO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5kZWJ1Z01vZGUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogRGVidWdMZXZlbCkgPT4ge1xyXG4gICAgICAgIGxvZy5zZXRMZXZlbCh2YWx1ZSk7XHJcbiAgICAgICAgc2V0dGluZ3MuZGVidWdNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBkZWJ1Z0RldGFpbHMuY3JlYXRlRWwoXCJidXR0b25cIiwgeyB0ZXh0OiBcIkNvbnNvbGUgbG9nIHNldHRpbmdzXCIgfSwgKGVsKSA9PiB7XHJcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gY29uc29sZS5sb2coc2V0dGluZ3MpKTtcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MsIE1BVFJJWF9WSUVXIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZERlbmRyb25TZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcbiAgY29uc3QgZGVuZHJvbkRldGFpbHMgPSBzdWJEZXRhaWxzKFxyXG4gICAgXCJEZW5kcm9uIE5vdGVzXCIsXHJcbiAgICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHNcclxuICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhkZW5kcm9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiQWRkIERlbmRyb24gbm90ZXMgdG8gZ3JhcGhcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJEZW5kcm9uIG5vdGVzIGNyZWF0ZSBhIGhpZXJhcmNoeSB1c2luZyBub3RlIG5hbWVzLjwvYnI+PGNvZGU+bm1hdGguYWxnZWJyYTwvY29kZT4gaXMgYSBub3RlIGFib3V0IGFsZ2VicmEsIHdob3NlIHBhcmVudCBpcyA8Y29kZT5tYXRoPC9jb2RlPi48L2JyPjxjb2RlPm5tYXRoLmNhbGN1bHVzLmxpbWl0czwvY29kZT4gaXMgYSBub3RlIGFib3V0IGxpbWl0cyB3aG9zZSBwYXJlbnQgaXMgdGhlIG5vdGUgPGNvZGU+bWF0aC5jYWxjdWx1czwvY29kZT4sIHRoZSBwYXJlbnQgb2Ygd2hpY2ggaXMgPGNvZGU+bWF0aDwvY29kZT4uXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWRkRGVuZHJvbk5vdGVzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5hZGREZW5kcm9uTm90ZXMgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIG5ldyBTZXR0aW5nKGRlbmRyb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWxpbWl0ZXJcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJXaGljaCBkZWxpbWl0ZXIgc2hvdWxkIEJyZWFkY3J1bWJzIGxvb2sgZm9yPyBUaGUgZGVmYXVsdCBpcyA8Y29kZT4uPC9jb2RlPi5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRGVsaW1pdGVyXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmRlbmRyb25Ob3RlRGVsaW1pdGVyKTtcclxuXHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LmdldFZhbHVlKCk7XHJcbiAgICAgICAgaWYgKHZhbHVlKSBzZXR0aW5ncy5kZW5kcm9uTm90ZURlbGltaXRlciA9IHZhbHVlO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShgVGhlIGRlbGltaXRlciBjYW4ndCBiZSBibGFua2ApO1xyXG4gICAgICAgICAgc2V0dGluZ3MuZGVuZHJvbk5vdGVEZWxpbWl0ZXIgPSBERUZBVUxUX1NFVFRJTkdTLmRlbmRyb25Ob3RlRGVsaW1pdGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGVuZHJvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlRyaW0gRGVuZHJvbiBOb3RlIE5hbWVzXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiV2hlbiBkaXNwbGF5aW5nIGEgZGVuZHJvbiBub3RlIG5hbWUsIHNob3VsZCBpdCBiZSB0cmltbWVkIHRvIG9ubHkgc2hvdyB0aGUgbGFzdCBpdGVtIGluIHRoZSBjaGFpbj88L2JyPmUuZy4gPGNvZGU+QS5CLkM8L2NvZGU+IFx1MjE5MiA8Y29kZT5DPC9jb2RlPi5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy50cmltRGVuZHJvbk5vdGVzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy50cmltRGVuZHJvbk5vdGVzID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZGVuZHJvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlbmRyb24gTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXCJXaGljaCBmaWVsZCBzaG91bGQgQnJlYWRjcnVtYnMgdXNlIGZvciBEZW5kcm9uIG5vdGVzP1wiKVxyXG4gICAgLmFkZERyb3Bkb3duKChkZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiBkZC5hZGRPcHRpb24oZmllbGQsIGZpZWxkKSk7XHJcbiAgICAgIGRkLnNldFZhbHVlKHNldHRpbmdzLmRlbmRyb25Ob3RlRmllbGQpO1xyXG5cclxuICAgICAgZGQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZGVuZHJvbk5vdGVGaWVsZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgTm90aWNlLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBkZXRhaWxzLCBmcmFnV2l0aEhUTUwgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRHZW5lcmFsU2V0dGluZ3MocGx1Z2luOiBCQ1BsdWdpbiwgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGdlbmVyYWxEZXRhaWxzID0gZGV0YWlscyhcIkdlbmVyYWwgT3B0aW9uc1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJSZWZyZXNoIEluZGV4IG9uIE5vdGUgQ2hhbmdlXCIpXHJcbiAgICAuc2V0RGVzYyhmcmFnV2l0aEhUTUwoXHJcbiAgICAgIFwiUmVmcmVzaCB0aGUgQnJlYWRjcnVtYnMgaW5kZXggZGF0YSBldmVyeXRpbWUgeW91IGNoYW5nZSBub3Rlcy48L2JyPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBjYW4gYmUgdmVyeSBzbG93IG9uIGxhcmdlIHZhdWx0cy5cIilcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnJlZnJlc2hPbk5vdGVDaGFuZ2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnJlZnJlc2hPbk5vdGVDaGFuZ2UgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiUmVmcmVzaCBJbmRleCBPbiBOb3RlIFNhdmVcIilcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnJlZnJlc2hPbk5vdGVTYXZlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5yZWZyZXNoT25Ob3RlU2F2ZSA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaG93IFJlZnJlc2ggSW5kZXggTm90aWNlXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJXaGVuIFJlZnJlc2hpbmcgSW5kZXgsIHNob3VsZCBpdCBzaG93IGEgbm90aWNlIG9uY2UgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZT9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd1JlZnJlc2hOb3RpY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dSZWZyZXNoTm90aWNlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkFsaWFzIEZpZWxkc1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZmllbGRzIHVzZWQgdG8gc3BlY2lmeSBhbGlhc2VzLiBUaGVzZSBmaWVsZHMgd2lsbCBiZSBjaGVja2VkLCBpbiBvcmRlciwgdG8gZGlzcGxheSBhbiBhbHRlcm5hdGUgbm90ZSB0aXRsZSBpbiBkaWZmZXJlbnQgdmlld3MuPC9icj5UaGlzIGZpZWxkIHdpbGwgcHJvYmFibHkgYmUgPGNvZGU+YWxpYXM8L2NvZGU+IG9yIDxjb2RlPmFsaWFzZXM8L2NvZGU+LCBidXQgaXQgY2FuIGJlIGFueXRoaW5nLCBsaWtlIDxjb2RlPnRpdGxlPC9jb2RlPi5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLmFsdExpbmtGaWVsZHMuam9pbihcIiwgXCIpKTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5hbHRMaW5rRmllbGRzID0gc3BsaXRBbmRUcmltKHRleHQuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJPbmx5IHNob3cgZmlyc3QgYWxpYXNcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIklmIGEgbm90ZSBoYXMgYW4gYWxpYXMgKHVzaW5nIHRoZSBmaWVsZHMgaW4gdGhlIHNldHRpbmcgYWJvdmUpLCBzaG91bGQgb25seSB0aGUgZmlyc3Qgb25lIGJlIHNob3duP1wiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZSghc2V0dGluZ3Muc2hvd0FsbEFsaWFzZXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dBbGxBbGlhc2VzID0gIXZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJVc2UgeWFtbCBvciBpbmxpbmUgZmllbGRzIGZvciBoaWVyYXJjaHkgZGF0YVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSWYgZW5hYmxlZCwgQnJlYWRjcnVtYnMgd2lsbCBtYWtlIGl0J3MgaGllcmFyY2h5IHVzaW5nIHlhbWwgZmllbGRzLCBhbmQgaW5saW5lIERhdGF2aWV3IGZpZWxkcy5cXG5JZiB0aGlzIGlzIGRpc2FibGVkLCBpdCB3aWxsIG9ubHkgdXNlIEp1Z2dsIGxpbmtzIChTZWUgYmVsb3cpLlwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy51c2VBbGxNZXRhZGF0YSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MudXNlQWxsTWV0YWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhnZW5lcmFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiVXNlIEp1Z2dsIGxpbmsgc3ludGF4IHdpdGhvdXQgaGF2aW5nIEp1Z2dsIGluc3RhbGxlZC5cIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgJ1Nob3VsZCBCcmVhZGNydW1icyBsb29rIGZvciA8YSBocmVmPVwiaHR0cHM6Ly9qdWdnbC5pby9MaW5rK1R5cGVzXCIgYXJpYS1sYWJlbD1cImh0dHBzOi8vanVnZ2wuaW8vTGluaytUeXBlc1wiPkp1Z2dsIGxpbmtzPC9hPiBldmVuIGlmIHlvdSBkb25cXCd0IGhhdmUgSnVnZ2wgaW5zdGFsbGVkPyBJZiB5b3UgZG8gaGF2ZSBKdWdnbCBpbnN0YWxsZWQsIGl0IHdpbGwgYWx3YXlzIGxvb2sgZm9yIEp1Z2dsIGxpbmtzLidcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MucGFyc2VKdWdnbExpbmtzV2l0aG91dEp1Z2dsKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnBhcnNlSnVnZ2xMaW5rc1dpdGhvdXRKdWdnbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuXHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkVuYWJsZSBGaWVsZCBTdWdnZXN0b3JcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgJ0Fsb3Qgb2YgQnJlYWRjcnVtYnMgZmVhdHVyZXMgcmVxdWlyZSBhIG1ldGFkYXRhIChvciBpbmxpbmUgRGF0YXZpZXcpIGZpZWxkIHRvIHdvcmsuIEZvciBleGFtcGxlLCBgQkMtZm9sZGVyLW5vdGVgLjwvYnI+VGhlIEZpZWxkIFN1Z2dlc3RvciB3aWxsIHNob3cgYW4gYXV0b2NvbXBsZXRlIG1lbnUgd2l0aCBhbGwgYXZhaWxhYmxlIEJyZWFkY3J1bWJzIGZpZWxkIG9wdGlvbnMgd2hlbiB5b3UgdHlwZSA8Y29kZT5CQy08L2NvZGU+IGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuJ1xyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5maWVsZFN1Z2dlc3Rvcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MuZmllbGRTdWdnZXN0b3IgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIG5ldyBTZXR0aW5nKGdlbmVyYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJFbmFibGUgUmVsYXRpb24gU3VnZ2VzdG9yXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiRW5hYmxlIGFuIGVkaXRvciBzdWdnZXN0b3Igd2hpY2ggZ2V0cyB0cmlnZ2VyZWQgYnkgYSBjdXN0b20gc3RyaW5nIHRvIHNob3cgYSBsaXN0IG9mIHJlbGF0aW9ucyBmcm9tIHlvdXIgaGllcmFyY2hpZXMgdG8gaW5zZXJ0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmVuYWJsZVJlbGF0aW9uU3VnZ2VzdG9yKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZVJlbGF0aW9uU3VnZ2VzdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlJlbGF0aW9uIFN1Z2dlc3RvciBUcmlnZ2VyXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiVGhlIHN0cmluZyB1c2VkIHRvIHRyaWdnZXIgdGhlIHJlbGF0aW9uIHN1Z2dlc3Rvci4gRGVmYXVsdCBpcyA8Y29kZT5cXFxcPC9jb2RlPi5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy5yZWxTdWdnZXN0b3JUcmlnZ2VyKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5yZWxTdWdnZXN0b3JUcmlnZ2VyID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgaWYgKGFwcC5wbHVnaW5zLnBsdWdpbnMuZGF0YXZpZXcgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgbmV3IFNldHRpbmcoZ2VuZXJhbERldGFpbHMpXHJcbiAgICAgIC5zZXROYW1lKFwiRGF0YXZpZXcgV2FpdCBUaW1lXCIpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgICdFbnRlciBhbiBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBEYXRhdmlldyBJbmRleCB0byBsb2FkLiBUaGUgbGFyZ2VyIHlvdXIgdmF1bHQsIHRoZSBsb25nZXIgaXQgd2lsbCB0YWtlLiBUaGUgZGVmYXVsdCBpcyA1IHNlY29uZHMuJ1xyXG4gICAgICApXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIlNlY29uZHNcIilcclxuICAgICAgICAgIC5zZXRWYWx1ZSgoc2V0dGluZ3MuZHZXYWl0VGltZSAvIDEwMDApLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobnVtID4gMCkge1xyXG4gICAgICAgICAgICAgIHNldHRpbmdzLmR2V2FpdFRpbWUgPSBudW0gKiAxMDAwO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiVGhlIGludGVydmFsIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBzcGxpdEFuZFRyaW0gfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkSGllcmFyY2h5Tm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IGhpZXJhcmNoeU5vdGVEZXRhaWxzID0gc3ViRGV0YWlscyhcclxuICAgIFwiSGllcmFyY2h5IE5vdGVzXCIsXHJcbiAgICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHNcclxuICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhoaWVyYXJjaHlOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiSGllcmFyY2h5IE5vdGUocylcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5vdGVzIHVzZWQgdG8gY3JlYXRlIGV4dGVybmFsIEJyZWFkY3J1bWIgc3RydWN0dXJlcy48YnI+WW91IGNhbiBhbHNvIHBvaW50IHRvIGEgPGVtPmZvbGRlcjwvZW0+IG9mIGhpZXJhcmNoeSBub3RlcyBieSBlbnRlcmluZyA8Y29kZT5mb2xkZXJOYW1lLzwvY29kZT4gKGVuZGluZyB3aXRoIGEgPGNvZGU+LzwvY29kZT4pLjxicj5IaWVyYXJjaHkgbm90ZSBuYW1lcyBhbmQgZm9sZGVycyBvZiBoaWVyYXJjaHkgbm90ZXMgY2FuIGJvdGggYmUgZW50ZXJlZCBpbiB0aGUgc2FtZSBjb21tYS1zZXBhcmF0ZWQgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiSGllcmFyY2h5IE5vdGUocylcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuaGllcmFyY2h5Tm90ZXMuam9pbihcIiwgXCIpKTtcclxuXHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBbmRUcmltKHRleHQuZ2V0VmFsdWUoKSk7XHJcblxyXG4gICAgICAgIHNldHRpbmdzLmhpZXJhcmNoeU5vdGVzID0gc3BsaXRzO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhoaWVyYXJjaHlOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKCdIaWVyYXJjaHkgbm90ZSBpcyBwYXJlbnQgb2YgdG9wLWxldmVsIGl0ZW1zJylcclxuICAgIC5zZXREZXNjKCdTaG91bGQgdGhlIGFjdHVhbCBoaWVyYXJjaHkgbm90ZSBiZSB0cmVhdGVkIGFzIHRoZSBwYXJlbnQgb2YgYWxsIHRoZSB0b3AtbGV2ZWwgaXRlbXMgaW4gdGhlIGxpc3Q/IFx1MjcwNSA9IFllcywgXHUyNzRDID0gTm8nKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5oaWVyYXJjaHlOb3RlSXNQYXJlbnQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaGllcmFyY2h5Tm90ZUlzUGFyZW50ID0gdmFsdWVcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICBuZXcgU2V0dGluZyhoaWVyYXJjaHlOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBIaWVyYXJjaHkgTm90ZSBGaWVsZFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIkJ5IGRlZmF1bHQsIGhpZXJhcmNoeSBub3RlcyB1c2UgdGhlIGZpcnN0IDxjb2RlPnVwPC9jb2RlPiBmaWVsZCBpbiB5b3VyIGhpZXJhcmNoaWVzLiBDaG9vc2UgYSBkaWZmZXJlbnQgb25lIHRvIHVzZSBieSBkZWZhdWx0LiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBjaG9vc2UgYSBkZWZhdWx0LCBzZWxlY3QgdGhlIGJsYW5rIG9wdGlvbiBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHVwRmllbGRzID0gZ2V0RmllbGRzKHNldHRpbmdzLnVzZXJIaWVycywgXCJ1cFwiKTtcclxuXHJcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcclxuICAgICAgdXBGaWVsZHMuZm9yRWFjaChcclxuICAgICAgICAoZmllbGQpID0+IChvcHRpb25zW2ZpZWxkXSA9IGZpZWxkKVxyXG4gICAgICApO1xyXG4gICAgICBkZC5hZGRPcHRpb25zKG9wdGlvbnMpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLkhOVXBGaWVsZCB8fCB1cEZpZWxkc1swXSlcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5ITlVwRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbiAgaW1wb3J0IEZhTGlzdFVsIGZyb20gXCJzdmVsdGUtaWNvbnMvZmEvRmFMaXN0VWwuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IEZhUGx1cyBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhUGx1cy5zdmVsdGVcIjtcclxuICBpbXBvcnQgRmFSZWdUcmFzaEFsdCBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhUmVnVHJhc2hBbHQuc3ZlbHRlXCI7XHJcbiAgaW1wb3J0IHsgQVJST1dfRElSRUNUSU9OUywgYmxhbmtVc2VySGllciwgRElSRUNUSU9OUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuICBpbXBvcnQgdHlwZSB7IFVzZXJIaWVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB7IHNwbGl0QW5kVHJpbSwgc3dhcEl0ZW1zIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG4gIGltcG9ydCB7IGhpZXJUb1N0ciB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuXHJcbiAgbGV0IGN1cnJIaWVycyA9IFsuLi5wbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzXTtcclxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGUoY3VyckhpZXJzOiBVc2VySGllcltdKSB7XHJcbiAgICBwbHVnaW4uc2V0dGluZ3MudXNlckhpZXJzID0gY3VyckhpZXJzO1xyXG4gICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gIH1cclxuPC9zY3JpcHQ+XHJcblxyXG48ZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJCQy1CdXR0b25zXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJBZGQgTmV3IEhpZXJhcmNoeVwiXHJcbiAgICAgIG9uOmNsaWNrPXthc3luYyAoKSA9PiAoY3VyckhpZXJzID0gWy4uLmN1cnJIaWVycywgYmxhbmtVc2VySGllcigpXSl9XHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHJcbiAgICAgICAgPEZhUGx1cyAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBhcmlhLWxhYmVsPVwiUmVzZXQgQWxsIEhpZXJhcmNoaWVzXCJcclxuICAgICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0oXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVzZXQgYWxsIGhpZXJhcmNoaWVzP1wiKSkge1xyXG4gICAgICAgICAgY3VyckhpZXJzID0gW107XHJcbiAgICAgICAgICBhd2FpdCB1cGRhdGUoY3VyckhpZXJzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH19XHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHJcbiAgICAgICAgPEZhUmVnVHJhc2hBbHQgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgYXJpYS1sYWJlbD1cIlNob3cgSGllcmFyY2hpZXNcIlxyXG4gICAgICBvbjpjbGljaz17KCkgPT4gbmV3IE5vdGljZShjdXJySGllcnMubWFwKGhpZXJUb1N0cikuam9pbihcIlxcblxcblwiKSl9XHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHJcbiAgICAgICAgPEZhTGlzdFVsIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIHsjZWFjaCBjdXJySGllcnMgYXMgaGllciwgaX1cclxuICAgIDxkZXRhaWxzIGNsYXNzPVwiQkMtSGllci1EZXRhaWxzXCI+XHJcbiAgICAgIDxzdW1tYXJ5PlxyXG4gICAgICAgIHtESVJFQ1RJT05TLm1hcCgoZGlyKSA9PiBoaWVyW2Rpcl0/LmpvaW4oXCIsIFwiKSA/PyBcIlwiKVxyXG4gICAgICAgICAgLm1hcCgoZGlyRmllbGRzKSA9PiBgKCR7ZGlyRmllbGRzfSlgKVxyXG4gICAgICAgICAgLmpvaW4oXCIgXCIpfVxyXG5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIkJDLUJ1dHRvbnNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlN3YXAgd2l0aCBIaWVyYXJjaHkgQWJvdmVcIlxyXG4gICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGN1cnJIaWVycyA9IHN3YXBJdGVtcyhpLCBpIC0gMSwgY3VyckhpZXJzKTtcclxuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGUoY3VyckhpZXJzKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgXHUyMTkxXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlN3YXAgd2l0aCBIaWVyYXJjaHkgQmVsb3dcIlxyXG4gICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGN1cnJIaWVycyA9IHN3YXBJdGVtcyhpLCBpICsgMSwgY3VyckhpZXJzKTtcclxuICAgICAgICAgICAgICBhd2FpdCB1cGRhdGUoY3VyckhpZXJzKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgXHUyMTkzXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBIaWVyYXJjaHlcIlxyXG4gICAgICAgICAgICBvbjpjbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9sZEhpZXIgPSBjdXJySGllcnMuc3BsaWNlKGksIDEpWzBdO1xyXG4gICAgICAgICAgICAgIG9sZEhpZXIudXAuZm9yRWFjaCgodXBGaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5pbmRleE9mKHVwRmllbGQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHNldHRpbmdzLmxpbWl0VHJhaWxDaGVja2JveGVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIERJUkVDVElPTlMuZm9yRWFjaCgoZGlyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBvbGRIaWVyW2Rpcl0uZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhJID0gc2V0dGluZ3MubGltaXRKdW1wVG9GaXJzdEZpZWxkcy5pbmRleE9mKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SSA+IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMuc3BsaWNlKGluZGV4SSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbmRleEogPSBzZXR0aW5ncy5saW1pdFdyaXRlQkNDaGVja2JveGVzLmluZGV4T2YoZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaW5kZXhKID4gLTEpXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubGltaXRKdW1wVG9GaXJzdEZpZWxkcy5zcGxpY2UoaW5kZXhKLCAxKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBjdXJySGllcnMgPSBjdXJySGllcnM7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlKGN1cnJIaWVycyk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFhcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9zdW1tYXJ5PlxyXG4gICAgICB7I2VhY2ggRElSRUNUSU9OUyBhcyBkaXJ9XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIkJDLUFycm93LUxhYmVsXCIgZm9yPXtkaXJ9PlxyXG4gICAgICAgICAgICB7QVJST1dfRElSRUNUSU9OU1tkaXJdfVxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIHNpemU9XCIyMFwiXHJcbiAgICAgICAgICAgIG5hbWU9e2Rpcn1cclxuICAgICAgICAgICAgdmFsdWU9e2hpZXJbZGlyXT8uam9pbihcIiwgXCIpID8/IFwiXCJ9XHJcbiAgICAgICAgICAgIG9uOmNoYW5nZT17YXN5bmMgKGUpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgICBjb25zdCBzcGxpdHMgPSBzcGxpdEFuZFRyaW0odmFsdWUpO1xyXG4gICAgICAgICAgICAgIGN1cnJIaWVyc1tpXVtkaXJdID0gc3BsaXRzO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZShjdXJySGllcnMpO1xyXG5cclxuICAgICAgICAgICAgICBzcGxpdHMuZm9yRWFjaCgoc3BsaXQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgZGlyID09PSBcInVwXCIgJiZcclxuICAgICAgICAgICAgICAgICAgIXNldHRpbmdzLmxpbWl0VHJhaWxDaGVja2JveGVzLmluY2x1ZGVzKHNwbGl0KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdFRyYWlsQ2hlY2tib3hlcy5wdXNoKHNwbGl0KTtcclxuICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MubGltaXRKdW1wVG9GaXJzdEZpZWxkcy5pbmNsdWRlcyhzcGxpdCkpXHJcbiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmxpbWl0SnVtcFRvRmlyc3RGaWVsZHMucHVzaChzcGxpdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmxpbWl0V3JpdGVCQ0NoZWNrYm94ZXMuaW5jbHVkZXMoc3BsaXQpKVxyXG4gICAgICAgICAgICAgICAgICBzZXR0aW5ncy5saW1pdFdyaXRlQkNDaGVja2JveGVzLnB1c2goc3BsaXQpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIHsvZWFjaH1cclxuICAgIDwvZGV0YWlscz5cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIGxhYmVsLkJDLUFycm93LUxhYmVsIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIHdpZHRoOiAyMHB4ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gIGRpdi5CQy1CdXR0b25zIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XHJcbiAgfVxyXG5cclxuICBkZXRhaWxzLkJDLUhpZXItRGV0YWlscyB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlcik7XHJcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xyXG4gICAgcGFkZGluZzogMTBweCA1cHggMTBweCAxMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcclxuICB9XHJcbiAgLkJDLUhpZXItRGV0YWlscyBzdW1tYXJ5OjptYXJrZXIge1xyXG4gICAgZm9udC1zaXplOiAxMHB4O1xyXG4gIH1cclxuXHJcbiAgLkJDLUhpZXItRGV0YWlscyBzdW1tYXJ5IGJ1dHRvbiB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgfVxyXG4gIC5pY29uIHtcclxuICAgIGNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBwYWRkaW5nLXRvcDogM3B4O1xyXG4gICAgd2lkdGg6IDE3cHg7XHJcbiAgICBoZWlnaHQ6IDE3cHg7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiPHNjcmlwdD5cbiAgZXhwb3J0IGxldCB0aXRsZSA9IG51bGw7XG4gIGV4cG9ydCBsZXQgdmlld0JveDtcbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4gIHN2ZyB7XG4gICAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7XG4gICAgZmlsbDogY3VycmVudENvbG9yO1xuICAgIHN0cm9rZS13aWR0aDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgfSAgXG48L3N0eWxlPlxuXG48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB7dmlld0JveH0+XG4gIHsjaWYgdGl0bGV9XG4gICAgPHRpdGxlPnt0aXRsZX08L3RpdGxlPlxuICB7L2lmfVxuICA8c2xvdCAvPlxuPC9zdmc+XG4iLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk00OCA0OGE0OCA0OCAwIDEgMCA0OCA0OCA0OCA0OCAwIDAgMC00OC00OHptMCAxNjBhNDggNDggMCAxIDAgNDggNDggNDggNDggMCAwIDAtNDgtNDh6bTAgMTYwYTQ4IDQ4IDAgMSAwIDQ4IDQ4IDQ4IDQ4IDAgMCAwLTQ4LTQ4em00NDggMTZIMTc2YTE2IDE2IDAgMCAwLTE2IDE2djMyYTE2IDE2IDAgMCAwIDE2IDE2aDMyMGExNiAxNiAwIDAgMCAxNi0xNnYtMzJhMTYgMTYgMCAwIDAtMTYtMTZ6bTAtMzIwSDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZWODBhMTYgMTYgMCAwIDAtMTYtMTZ6bTAgMTYwSDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZ2LTMyYTE2IDE2IDAgMCAwLTE2LTE2elwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk00MTYgMjA4SDI3MlY2NGMwLTE3LjY3LTE0LjMzLTMyLTMyLTMyaC0zMmMtMTcuNjcgMC0zMiAxNC4zMy0zMiAzMnYxNDRIMzJjLTE3LjY3IDAtMzIgMTQuMzMtMzIgMzJ2MzJjMCAxNy42NyAxNC4zMyAzMiAzMiAzMmgxNDR2MTQ0YzAgMTcuNjcgMTQuMzMgMzIgMzIgMzJoMzJjMTcuNjcgMCAzMi0xNC4zMyAzMi0zMlYzMDRoMTQ0YzE3LjY3IDAgMzItMTQuMzMgMzItMzJ2LTMyYzAtMTcuNjctMTQuMzMtMzItMzItMzJ6XCIgLz5cbiAgICAgICAgPC9JY29uQmFzZT5cbiAgICAgICIsICI8c2NyaXB0PlxuICAgICAgICBpbXBvcnQgSWNvbkJhc2UgZnJvbSAnLi4vY29tcG9uZW50cy9JY29uQmFzZS5zdmVsdGUnO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPEljb25CYXNlIHZpZXdCb3g9XCIwIDAgNDQ4IDUxMlwiIHsuLi4kJHByb3BzfT5cbiAgICAgICAgICA8cGF0aCBkPVwiTTI2OCA0MTZoMjRhMTIgMTIgMCAwIDAgMTItMTJWMTg4YTEyIDEyIDAgMCAwLTEyLTEyaC0yNGExMiAxMiAwIDAgMC0xMiAxMnYyMTZhMTIgMTIgMCAwIDAgMTIgMTJ6TTQzMiA4MGgtODIuNDFsLTM0LTU2LjdBNDggNDggMCAwIDAgMjc0LjQxIDBIMTczLjU5YTQ4IDQ4IDAgMCAwLTQxLjE2IDIzLjNMOTguNDEgODBIMTZBMTYgMTYgMCAwIDAgMCA5NnYxNmExNiAxNiAwIDAgMCAxNiAxNmgxNnYzMzZhNDggNDggMCAwIDAgNDggNDhoMjg4YTQ4IDQ4IDAgMCAwIDQ4LTQ4VjEyOGgxNmExNiAxNiAwIDAgMCAxNi0xNlY5NmExNiAxNiAwIDAgMC0xNi0xNnpNMTcxLjg0IDUwLjkxQTYgNiAwIDAgMSAxNzcgNDhoOTRhNiA2IDAgMCAxIDUuMTUgMi45MUwyOTMuNjEgODBIMTU0LjM5ek0zNjggNDY0SDgwVjEyOGgyODh6bS0yMTItNDhoMjRhMTIgMTIgMCAwIDAgMTItMTJWMTg4YTEyIDEyIDAgMCAwLTEyLTEyaC0yNGExMiAxMiAwIDAgMC0xMiAxMnYyMTZhMTIgMTIgMCAwIDAgMTIgMTJ6XCIgLz5cbiAgICAgICAgPC9JY29uQmFzZT5cbiAgICAgICIsICJpbXBvcnQgVXNlckhpZXJhcmNoaWVzIGZyb20gXCIuLi9Db21wb25lbnRzL1VzZXJIaWVyYXJjaGllcy5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZEhpZXJhcmNoeVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IGZpZWxkRGV0YWlscyA9IGRldGFpbHMoXCJIaWVyYXJjaGllc1wiLCBjb250YWluZXJFbCk7XHJcblxyXG4gIGZpZWxkRGV0YWlscy5jcmVhdGVFbChcInBcIiwge1xyXG4gICAgdGV4dDogXCJIZXJlIHlvdSBjYW4gc2V0IHVwIGRpZmZlcmVudCBoaWVyYXJjaGllcyB5b3UgdXNlIGluIHlvdXIgdmF1bHQuIFRvIGFkZCBhIG5ldyBoaWVyYXJjaHksIGNsaWNrIHRoZSBwbHVzIGJ1dHRvbi4gVGhlbiwgZmlsbCBpbiB0aGUgZmllbGQgbmFtZXMgb2YgeW91ciBoaWVyYWNoeSBpbnRvIHRoZSA1IGJveGVzIHRoYXQgYXBwZWFyLlwiLFxyXG4gIH0pO1xyXG4gIGZpZWxkRGV0YWlscy5jcmVhdGVFbChcInBcIiwge1xyXG4gICAgdGV4dDogXCJGb3IgZWFjaCBkaXJlY3Rpb24sIHlvdSBjYW4gZW50ZXIgbXVsdGlwbGUgZmllbGQgbmFtZXMgaW4gYSBjb21tYS1zZXBlcmF0ZWQgbGlzdC4gRm9yIGV4YW1wbGU6IGBwYXJlbnQsIGJyb2FkZXIsIHVwcGVyYFwiLFxyXG4gIH0pO1xyXG5cclxuICBuZXcgVXNlckhpZXJhcmNoaWVzKHtcclxuICAgIHRhcmdldDogZmllbGREZXRhaWxzLFxyXG4gICAgcHJvcHM6IHsgcGx1Z2luIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwgbnVsbCwgIjxzY3JpcHQgbGFuZz1cInRzXCI+XHJcbiAgaW1wb3J0IHsgd2FybiB9IGZyb20gXCJsb2dsZXZlbFwiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5cclxuICBleHBvcnQgbGV0IHBsdWdpbjogQkNQbHVnaW47XHJcbiAgZXhwb3J0IGxldCBzZXR0aW5nTmFtZTogc3RyaW5nO1xyXG4gIGV4cG9ydCBsZXQgb3B0aW9uczogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuXHJcbiAgbGV0IHNlbGVjdGVkID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdO1xyXG5cclxuICAkOiB0b05vbmUgPSBzZWxlY3RlZC5sZW5ndGggPT09IDAgPyBmYWxzZSA6IHRydWU7XHJcblxyXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmUoKSB7XHJcbiAgICBpZiAoc2V0dGluZ3Nbc2V0dGluZ05hbWVdID09PSB1bmRlZmluZWQpXHJcbiAgICAgIHJldHVybiB3YXJuKHNldHRpbmdOYW1lICsgXCIgbm90IGZvdW5kIGluIEJDIHNldHRpbmdzXCIpO1xyXG5cclxuICAgIHNldHRpbmdzW3NldHRpbmdOYW1lXSA9IHNlbGVjdGVkO1xyXG4gICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgfVxyXG48L3NjcmlwdD5cclxuXHJcbjxkaXY+XHJcbiAgPGJ1dHRvblxyXG4gICAgb246Y2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgaWYgKHRvTm9uZSkgc2VsZWN0ZWQgPSBbXTtcclxuICAgICAgZWxzZSBzZWxlY3RlZCA9IG9wdGlvbnM7XHJcbiAgICAgIGF3YWl0IHNhdmUoKTtcclxuICAgIH19XHJcbiAgPlxyXG4gICAgU2VsZWN0IHt0b05vbmUgPyBcIk5vbmVcIiA6IFwiQWxsXCJ9XHJcbiAgPC9idXR0b24+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuICB7I2VhY2ggb3B0aW9ucyBhcyBvcHRpb259XHJcbiAgICA8ZGl2PlxyXG4gICAgICA8bGFiZWw+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgdmFsdWU9e29wdGlvbn1cclxuICAgICAgICAgIGJpbmQ6Z3JvdXA9e3NlbGVjdGVkfVxyXG4gICAgICAgICAgb246Y2hhbmdlPXthc3luYyAoKSA9PiBhd2FpdCBzYXZlKCl9XHJcbiAgICAgICAgLz5cclxuICAgICAgICB7b3B0aW9ufVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgPC9kaXY+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxzdHlsZT5cclxuICAuZ3JpZCB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxMDBweCwgMWZyKSk7XHJcbiAgfVxyXG48L3N0eWxlPlxyXG4iLCAiaW1wb3J0IENoZWNrYm94ZXMgZnJvbSBcIi4uL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkSnVtcFRvTmV4dFNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdmlld0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QganVtcFRvRGlyRGV0YWlscyA9IHN1YkRldGFpbHMoXCJKdW1wIHRvIE5leHQgRGlyZWN0aW9uXCIsIHZpZXdEZXRhaWxzKTtcclxuXHJcbiAganVtcFRvRGlyRGV0YWlscy5jcmVhdGVEaXYoeyBjbHM6ICdzZXR0aW5nLWl0ZW0tbmFtZScsIHRleHQ6ICdMaW1pdCB3aGljaCBmaWVsZHMgdG8ganVtcCB0bycgfSlcclxuXHJcbiAgbmV3IENoZWNrYm94ZXMoe1xyXG4gICAgdGFyZ2V0OiBqdW1wVG9EaXJEZXRhaWxzLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgcGx1Z2luLFxyXG4gICAgICBzZXR0aW5nTmFtZTogXCJsaW1pdEp1bXBUb0ZpcnN0RmllbGRzXCIsXHJcbiAgICAgIG9wdGlvbnM6IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpLFxyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgTm90aWNlLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IG9wZW5WaWV3IH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWIvZGlzdC91dGlsc1wiO1xyXG5pbXBvcnQgeyBNQVRSSVhfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IE1hdHJpeFZpZXcgZnJvbSBcIi4uL1ZpZXdzL01hdHJpeFZpZXdcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkTWF0cml4Vmlld1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdmlld0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgTUxWaWV3RGV0YWlscyA9IHN1YkRldGFpbHMoXCJNYXRyaXggVmlld1wiLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3cgYWxsIGZpZWxkIG5hbWVzIG9yIGp1c3QgcmVsYXRpb24gdHlwZXNcIilcclxuICAgIC5zZXREZXNjKGZyYWdXaXRoSFRNTChcclxuICAgICAgXCJTaG93IHRoZSBsaXN0IG9mIG1ldGFkYXRhIGZpZWxkcyBmb3IgZWFjaCByZWxhdGlvbiB0eXBlIChlLmcuIDxjb2RlPnBhcmVudCwgYnJvYWRlciwgdXBwZXI8L2NvZGU+KSwgb3IganVzdCB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdHlwZSwgaS5lLiAnPGNvZGU+UGFyZW50PC9jb2RlPicsICc8Y29kZT5TaWJsaW5nPC9jb2RlPicsICc8Y29kZT5DaGlsZDwvY29kZT4nLjwvYnI+XHUyNzA1ID0gc2hvdyB0aGUgZnVsbCBsaXN0LlwiKVxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd05hbWVPclR5cGUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dOYW1lT3JUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBSZWxhdGlvbnNoaXAgVHlwZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlNob3cgd2hldGhlciBhIGxpbmsgaXMgcmVhbCBvciBpbXBsaWVkLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dSZWxhdGlvblR5cGUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnNob3dSZWxhdGlvblR5cGUgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEaXJlY3Rpb25zIE9yZGVyXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIGBDaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXJlY3Rpb25zIGFwcGVhciBpbiB0aGUgTWF0cml4IHZpZXcuPC9icj5UaGUgZGVmYXVsdCBpcyBcInVwLCBzYW1lLCBkb3duLCBuZXh0LCBwcmV2XCIgKDxjb2RlPjAxMjM0PC9jb2RlPikuXHJcbiAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgIDxsaT4wIFx1MjE5MiB1cDwvbGk+XHJcbiAgICAgICAgICAgIDxsaT4xIFx1MjE5MiBzYW1lPC9saT5cclxuICAgICAgICAgICAgPGxpPjIgXHUyMTkyIGRvd248L2xpPlxyXG4gICAgICAgICAgICA8bGk+MyBcdTIxOTIgbmV4dDwvbGk+XHJcbiAgICAgICAgICAgIDxsaT40IFx1MjE5MiBwcmV2PC9saT5cclxuICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IFlvdSBjYW4gcmVtb3ZlIG51bWJlcnMgdG8gaGlkZSB0aG9zZSBkaXJlY3Rpb25zIGluIHRoZSBNYXRyaXggVmlldy4gRm9yIGV4YW1wbGUsIDxjb2RlPjAyPC9jb2RlPiB3aWxsIG9ubHkgc2hvdyB1cCBhbmQgZG93biwgaW4gdGhhdCBvcmRlci5gXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3Muc3F1YXJlRGlyZWN0aW9uc09yZGVyLmpvaW4oXCJcIikpO1xyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KFwiXCIpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHZhbHVlLmxlbmd0aCA8PSA1ICYmXHJcbiAgICAgICAgICB2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiBbXCIwXCIsIFwiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXS5pbmNsdWRlcyh2YWx1ZSkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5zcXVhcmVEaXJlY3Rpb25zT3JkZXIgPSB2YWx1ZXMubWFwKChvcmRlcikgPT5cclxuICAgICAgICAgICAgTnVtYmVyLnBhcnNlSW50KG9yZGVyKVxyXG4gICAgICAgICAgKSBhcyAoMCB8IDEgfCAyIHwgMyB8IDQpW107XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgICAgJ1RoZSB2YWx1ZSBtdXN0IGJlIGEgNSBkaWdpdCBudW1iZXIgdXNpbmcgb25seSB0aGUgZGlnaXRzIFwiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkVuYWJsZSBBbHBhaGVidGljYWwgU29ydGluZ1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiQnkgZGVmYXVsdCwgaXRlbXMgaW4gdGhlIE1hdHJpeCB2aWV3IGFyZSBzb3J0ZWQgYnkgdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHlvdXIgbm90ZXMuIFRvZ2dsZSB0aGlzIG9uIHRvIGVuYWJsZSBhbHBoYWJldGljYWwgc29ydGluZy5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuZW5hYmxlQWxwaGFTb3J0KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5lbmFibGVBbHBoYVNvcnQgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAvLyBUT0RPIGhpZGUgdGhpcyBzZXR0aW5nIGlmICFlbmFibGVBbHBoYVNvcnRcclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTb3J0IEFscGhhYmV0aWNhbGx5IEFzY2VuZGluZy9EZXNjZW5kaW5nXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJTb3J0IHNxdWFyZSBpdGVtcyBhbHBoYWJldGljYWxseSBpbiBBc2NlbmRpbmcgKFx1MjcwNSkgb3IgRGVzY2VuZGluZyAoXHUyNzRDKSBvcmRlci5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3MuYWxwaGFTb3J0QXNjKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5hbHBoYVNvcnRBc2MgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLmdldEFjdGl2ZVRZUEVWaWV3KE1BVFJJWF9WSUVXKS5kcmF3KCk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTb3J0IGJ5IG5vdGUgbmFtZSwgYnV0IHNob3cgYWxpYXNcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIldoZW4gdGhpcyBpcyB0dXJuZWQgb2ZmLCBub3RlcyB3aWxsIGZpcnN0IGJlIHNvcnRlZCBieSB0aGVpciBhbGlhcywgYW5kIHRoZW4gYnkgdGhlaXIgbmFtZSBpZiBubyBhbGlhcyBpcyBmb3VuZC4gVHVybiB0aGlzIG9uIHRvIHNvcnQgYnkgbm90ZSBuYW1lIGFsd2F5cywgYnV0IHN0aWxsIHNob3cgdGhlIGFsaWFzIGluIHRoZSByZXN1bHRzLlwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zb3J0QnlOYW1lU2hvd0FsaWFzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zb3J0QnlOYW1lU2hvd0FsaWFzID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcoTUxWaWV3RGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBJbXBsaWVkIFJlbGF0aW9uc1wiKVxyXG4gICAgLnNldERlc2MoXCJXaGV0aGVyIG9yIG5vdCB0byBzaG93IGltcGxpZWQgcmVsYXRpb25zIGF0IGFsbC5cIilcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dJbXBsaWVkUmVsYXRpb25zKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93SW1wbGllZFJlbGF0aW9ucyA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uZ2V0QWN0aXZlVFlQRVZpZXcoTUFUUklYX1ZJRVcpLmRyYXcoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIC8vIFRPRE8gSSBkb24ndCB0aGluayB0aGlzIHNldHRpbmcgd29ya3MgYW55bW9yZS4gSSByZW1vdmVkIGl0J3MgZnVuY3Rpb25hbGl0eSB3aGVuIGFkZGluZyBtdWx0aXBsZSBoaWVyYXJjaGllc1xyXG4gIC8vIG5ldyBTZXR0aW5nKE1MVmlld0RldGFpbHMpXHJcbiAgLy8gICAuc2V0TmFtZShcIkZpbHRlciBJbXBsaWVkIFNpYmxpbmdzXCIpXHJcbiAgLy8gICAuc2V0RGVzYyhcclxuICAvLyAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gIC8vICAgICAgIGBJbXBsaWVkIHNpYmxpbmdzIGFyZTpcclxuICAvLyAgICAgICAgIDxvbD5cclxuICAvLyAgICAgICAgICAgPGxpPm5vdGVzIHdpdGggdGhlIHNhbWUgcGFyZW50LCBvcjwvbGk+XHJcbiAgLy8gICAgICAgICAgIDxsaT5ub3RlcyB0aGF0IGFyZSByZWFsIHNpYmxpbmdzLjwvbGk+XHJcbiAgLy8gICAgICAgICA8L29sPlxyXG4gIC8vICAgICAgICAgVGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byB0eXBlIDEgaW1wbGllZCBzaWJsaW5ncy4gSWYgZW5hYmxlZCwgQnJlYWRjcnVtYnMgd2lsbCBmaWx0ZXIgdHlwZSAxIGltcGxpZWQgc2libGluZ3Mgc28gdGhhdCB0aGV5IG5vdCBvbmx5IHNoYXJlIHRoZSBzYW1lIHBhcmVudCwgYnV0IHRoZSBwYXJlbnQgcmVsYXRpb24gaGFzIHRoZSBleGFjdCBzYW1lIHR5cGUuIEZvciBleGFtcGxlLCB0aGUgdHdvIHJlYWwgcmVsYXRpb25zIDxjb2RlPkIgLXBhcmVudC0+IEE8L2NvZGU+LCBhbmQgPGNvZGU+QyAtcGFyZW50LT4gQTwvY29kZT4gY3JlYXRlIGFuIGltcGxpZWQgc2libGluZyBiZXR3ZWVuIEIgYW5kIEMgKHRoZXkgaGF2ZSB0aGUgc2FtZSBwYXJlbnQsIEEpLiBUaGUgdHdvIHJlYWwgcmVsYXRpb25zIDxjb2RlPkIgLXBhcmVudC0+IEE8L2NvZGU+LCBhbmQgPGNvZGU+QyAtdXAtPiBBPC9jb2RlPiBjcmVhdGUgYW4gaW1wbGllZCBzaWJsaW5nIGJldHdlZW4gQiBhbmQgQyAodGhleSBhbHNvIGhhdmUgdGhlIHNhbWUgcGFyZW50LCBBKS4gQnV0IGlmIHRoaXMgc2V0dGluZyBpcyB0dXJuZWQgb24sIHRoZSBzZWNvbmQgaW1wbGllZCBzaWJsaW5nIHdvdWxkIG5vdCBzaG93LCBiZWNhdXNlIHRoZSBwYXJlbnQgdHlwZXMgYXJlIGRpZmZlcm5ldCAocGFyZW50IHZlcnN1cyB1cCkuYFxyXG4gIC8vICAgICApXHJcbiAgLy8gICApXHJcbiAgLy8gICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgLy8gICAgIHRvZ2dsZVxyXG4gIC8vICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5maWx0ZXJJbXBsaWVkU2libGluZ3NPZkRpZmZlcmVudFR5cGVzKVxyXG4gIC8vICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAvLyAgICAgICAgIHNldHRpbmdzLmZpbHRlckltcGxpZWRTaWJsaW5nc09mRGlmZmVyZW50VHlwZXMgPSB2YWx1ZTtcclxuICAvLyAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAvLyAgICAgICAgIGF3YWl0IHBsdWdpbi5nZXRBY3RpdmVUWVBFVmlldyhNQVRSSVhfVklFVykuZHJhdygpO1xyXG4gIC8vICAgICAgIH0pXHJcbiAgLy8gICApO1xyXG5cclxuICBuZXcgU2V0dGluZyhNTFZpZXdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJPcGVuIFZpZXcgaW4gUmlnaHQgb3IgTGVmdCBzaWRlXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJXaGVuIGxvYWRpbmcgdGhlIG1hdHJpeCB2aWV3LCBzaG91bGQgaXQgb3BlbiBvbiB0aGUgbGVmdCBvciByaWdodCBzaWRlIGxlYWY/IFx1MjcwNSA9IFJpZ2h0LCBcdTI3NEMgPSBMZWZ0LlwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5ybExlYWYpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnJsTGVhZiA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShNQVRSSVhfVklFVyk7XHJcbiAgICAgICAgYXdhaXQgb3BlblZpZXcoXHJcbiAgICAgICAgICBhcHAsXHJcbiAgICAgICAgICBNQVRSSVhfVklFVyxcclxuICAgICAgICAgIE1hdHJpeFZpZXcsXHJcbiAgICAgICAgICB2YWx1ZSA/IFwicmlnaHRcIiA6IFwibGVmdFwiXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IE5vdGljZSwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcbmltcG9ydCB7IHN0clRvUmVnZXggfSBmcm9tIFwiLi4vVXRpbHMvZ2VuZXJhbFV0aWxzXCI7XHJcbmltcG9ydCB7IGdldEZpZWxkcyB9IGZyb20gXCIuLi9VdGlscy9IaWVyVXRpbHNcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkTm9TeXN0ZW1TZXR0aW5ncyhcclxuICBwbHVnaW46IEJDUGx1Z2luLFxyXG4gIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB7IHVzZXJIaWVycyB9ID0gc2V0dGluZ3M7XHJcbiAgY29uc3QgZmllbGRzID0gZ2V0RmllbGRzKHVzZXJIaWVycyk7XHJcblxyXG4gIGNvbnN0IG5vU3lzdGVtRGV0YWlscyA9IHN1YkRldGFpbHMoXHJcbiAgICBcIk5hbWluZyBTeXN0ZW1cIixcclxuICAgIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlsc1xyXG4gICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKG5vU3lzdGVtRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmFtaW5nIFN5c3RlbSBSZWdleFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIklmIHlvdSBuYW1lIHlvdXIgbm90ZXMgdXNpbmcgdGhlIEpvaG5ueSBEZWNpbWFsIFN5c3RlbSBvciBhIHJlbGF0ZWQgc3lzdGVtLCBlbnRlciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBuYW1pbmcgc3lzdGVtIHlvdSB1c2UuIFRoZSByZWdleCBzaG91bGQgb25seSBtYXRjaCB0aGUgbmFtaW5nIHN5c3RlbSBwYXJ0IG9mIHRoZSBuYW1lLCBub3QgdGhlIGFjdHVhbCBub3RlIHRpdGxlLjwvYnI+IEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIHRoZSBKb2hubnkgRGVjaW1hbCBTeXN0ZW0sIHlvdSBtaWdodCB1c2UgPGNvZGU+L15cXFxcZFxcXFwuXFxcXGRcXFxcLlxcXFx3L2c8L2NvZGU+IHRvIG1hdGNoIHRoZSBub3RlIG5hbWVkIDxjb2RlPjEuMi5hIENhcnM8L2NvZGU+LjwvYnI+SWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLm5hbWluZ1N5c3RlbVJlZ2V4KTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgc3RyVG9SZWdleCh2YWx1ZSkpIHtcclxuICAgICAgICAgIHNldHRpbmdzLm5hbWluZ1N5c3RlbVJlZ2V4ID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcIkludmFsaWQgUmVnZXhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcobm9TeXN0ZW1EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJOYW1pbmcgU3lzdGVtIERlbGltaXRlclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIldoYXQgY2hhcmFjdGVyIGRvIHlvdSB1c2UgdG8gc3BsaXQgdXAgeW91ciBuYW1pbmcgY29udmVudGlvbj8gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgPGNvZGU+MS4yLmEuYjwvY29kZT4sIHRoZW4geW91ciBkZWxpbWl0ZXIgaXMgYSBwZXJpb2QgKDxjb2RlPi48L2NvZGU+KS5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0LnNldFZhbHVlKHNldHRpbmdzLm5hbWluZ1N5c3RlbVNwbGl0KTtcclxuICAgICAgdGV4dC5pbnB1dEVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRleHQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBzZXR0aW5ncy5uYW1pbmdTeXN0ZW1TcGxpdCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyhub1N5c3RlbURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5hbWluZyBTeXN0ZW0gRmllbGRcIilcclxuICAgIC5zZXREZXNjKFwiV2hpY2ggZmllbGQgc2hvdWxkIEJyZWFkY3J1bWJzIHVzZSBmb3IgTmFtaW5nIFN5c3RlbSBub3Rlcz9cIilcclxuICAgIC5hZGREcm9wZG93bigoZGQpID0+IHtcclxuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgZGQuYWRkT3B0aW9uKGZpZWxkLCBmaWVsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy5uYW1pbmdTeXN0ZW1GaWVsZCk7XHJcbiAgICAgIGRkLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLm5hbWluZ1N5c3RlbUZpZWxkID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKG5vU3lzdGVtRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiTmFtaW5nIFN5c3RlbSBFbmRzIHdpdGggRGVsaW1pdGVyXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiRG9lcyB5b3VyIG5hbWluZyBjb252ZW50aW9uIGVuZCB3aXRoIHRoZSBkZWxpbWl0ZXI/IEZvciBleGFtcGxlLCA8Y29kZT4xLjIuIE5vdGU8L2NvZGU+IGRvZXMgZW5kIHdpdGggdGhlIGRlbGltaXRlciwgYnV0IDxjb2RlPjEuMiBOb3RlPC9jb2RlPiBkb2VzIG5vdC48L2JyPkZvciBtYXRjaGluZyBwdXJwb3NlcywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIG5hbWUgeW91ciBub3RlcyB3aXRoIHRoZSBkZWxpbWl0ZXIgb24gdGhlIGVuZC4gT25seSB0dXJuIHRoaXMgc2V0dGluZyBvbiBpZiB5b3UgZG8gbmFtZSB5b3VyIG5vdGVzIHRoaXMgd2F5LCBidXQga25vdyB0aGF0IHRoZSByZXN1bHRzIG1heSBub3QgYmUgYXMgYWNjdXJhdGUgaWYgeW91IGRvbid0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZykgPT5cclxuICAgICAgdG9nXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLm5hbWluZ1N5c3RlbUVuZHNXaXRoRGVsaW1pdGVyKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLm5hbWluZ1N5c3RlbUVuZHNXaXRoRGVsaW1pdGVyID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQsIFNldHRpbmcgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlZ2V4Tm90ZVNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHJlZ2V4Tm90ZURldGFpbHMgPSBzdWJEZXRhaWxzKFxyXG4gICAgXCJSZWdleCBOb3Rlc1wiLFxyXG4gICAgYWx0ZXJuYXRpdmVIaWVyYXJjaHlEZXRhaWxzXHJcbiAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcocmVnZXhOb3RlRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBSZWdleCBOb3RlIEZpZWxkXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiQnkgZGVmYXVsdCwgcmVnZXggbm90ZXMgdXNlIHRoZSBmaXJzdCBmaWVsZCBpbiB5b3VyIGhpZXJhcmNoaWVzICh1c3VhbGx5IGFuIDxjb2RlPlx1MjE5MTwvY29kZT4gZmllbGQpLiBDaG9vc2UgYSBkaWZmZXJlbnQgb25lIHRvIHVzZSBieSBkZWZhdWx0LCB3aXRob3V0IGhhdmluZyB0byBzcGVjaWZ5IDxjb2RlPkJDLXJlZ2V4LW5vdGUtZmllbGQ6IHtmaWVsZH08L2NvZGU+LjwvYnI+SWYgeW91IGRvbid0IHdhbnQgdG8gY2hvb3NlIGEgZGVmYXVsdCwgc2VsZWN0IHRoZSBibGFuayBvcHRpb24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC5cIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0ge307XHJcbiAgICAgIGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpLmZvckVhY2goXHJcbiAgICAgICAgKGZpZWxkKSA9PiAob3B0aW9uc1tmaWVsZF0gPSBmaWVsZClcclxuICAgICAgKTtcclxuICAgICAgZGQuYWRkT3B0aW9ucyhPYmplY3QuYXNzaWduKG9wdGlvbnMsIHsgXCJcIjogXCJcIiB9KSlcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MucmVnZXhOb3RlRmllbGQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jIChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MucmVnZXhOb3RlRmllbGQgPSBmaWVsZDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IGRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgTWFya2Rvd25SZW5kZXJlciwgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyByZWZyZXNoSW5kZXggfSBmcm9tIFwiLi4vcmVmcmVzaEluZGV4XCI7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlbGF0aW9uU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcclxuKSB7XHJcbiAgY29uc3QgeyBzZXR0aW5ncyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHJlbGF0aW9uRGV0YWlscyA9IGRldGFpbHMoXCJSZWxhdGlvbnNoaXBzXCIsIGNvbnRhaW5lckVsKTtcclxuXHJcbiAgZnVuY3Rpb24gbWVybWFpZERpYWdyYW0oZGlhZ3JhbVN0cjogc3RyaW5nKSB7XHJcbiAgICBNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKFxyXG4gICAgICBkaWFncmFtU3RyLFxyXG4gICAgICByZWxhdGlvbkRldGFpbHMuY3JlYXRlRGl2KCksXHJcbiAgICAgIFwiXCIsXHJcbiAgICAgIG51bGxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVsYXRpb25EZXRhaWxzLmNyZWF0ZUVsKFwicFwiLCB7XHJcbiAgICB0ZXh0OiBcIkhlcmUgeW91IGNhbiB0b2dnbGUgb24vb2ZmIGRpZmZlcmVudCB0eXBlcyBvZiBpbXBsaWVkIHJlbGF0aW9uc2hpcHMuIEFsbCBvZiB5b3VyIGV4cGxpY2l0IChyZWFsKSByZWxhdGlvbnNoaXBzIHdpbGwgc3RpbGwgc2hvdywgYnV0IHlvdSBjYW4gY2hvb3NlIHdoaWNoIGltcGxpZWQgb25lcyBnZXQgZmlsbGVkIGluLlxcbkFsbCBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYXJlIGdpdmVuIGEgQ1NTIGNsYXNzIG9mIHRoZSB0eXBlIG9mIGltcGxpZWQgcmVsYXRpb24sIHNvIHlvdSBjYW4gc3R5bGUgdGhlbSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUgYC5CQy1BdW50YC5cIixcclxuICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTYW1lIFBhcmVudCBpcyBTaWJsaW5nc1wiKVxyXG4gICAgLnNldERlc2MoXCJJZiBvbmUgbm90ZSBzaGFyZXMgYSBwYXJlbnQgd2l0aCBhbm90aGVyLCB0cmVhdCB0aGVtIGFzIHNpYmxpbmdzXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0ZykgPT5cclxuICAgICAgdGdcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zYW1lUGFyZW50SXNTaWJsaW5nKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNhbWVQYXJlbnRJc1NpYmxpbmcgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHVwfCBEYWRcXG5TaXN0ZXIgLS0+fHVwfCBEYWRcXG5NZSA8LS4tPnxzYW1lfCBTaXN0ZXJcXG5gYGBcIilcclxuXHJcbiAgbmV3IFNldHRpbmcocmVsYXRpb25EZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJTaWJsaW5ncycgU2libGluZ3NcIilcclxuICAgIC5zZXREZXNjKFwiVHJlYXQgeW91ciBzaWJsaW5ncycgc2libGluZ3MgYXMgeW91ciBzaWJsaW5nc1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2libGluZ3NTaWJsaW5nSXNTaWJsaW5nKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnNpYmxpbmdzU2libGluZ0lzU2libGluZyA9IHZhbDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBtZXJtYWlkRGlhZ3JhbShcImBgYG1lcm1haWRcXG5mbG93Y2hhcnQgTFJcXG5NZSAtLT58c2FtZXwgU2lzdGVyXFxuTWUgLS0+fHNhbWV8IEJyb3RoZXJcXG5TaXN0ZXIgPC0uLT58c2FtZXwgQnJvdGhlclxcbmBgYFwiKVxyXG5cclxuICBuZXcgU2V0dGluZyhyZWxhdGlvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNpYmxpbmdzJyBQYXJlbnQgaXMgUGFyZW50XCIpXHJcbiAgICAuc2V0RGVzYyhcIllvdXIgc2libGluZ3MnIHBhcmVudHMgYXJlIHlvdXIgcGFyZW50c1wiKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMuc2libGluZ3NQYXJlbnRJc1BhcmVudClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbCkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5zaWJsaW5nc1BhcmVudElzUGFyZW50ID0gdmFsO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG1lcm1haWREaWFncmFtKFwiYGBgbWVybWFpZFxcbmZsb3djaGFydCBMUlxcblNpc3RlciAtLT58dXB8IERhZFxcblNpc3RlciA8LS0+fHNhbWV8IE1lXFxuTWUgLS4tPnx1cHwgRGFkXFxuYGBgXCIpXHJcblxyXG4gIG5ldyBTZXR0aW5nKHJlbGF0aW9uRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiQXVudC9VbmNsZVwiKVxyXG4gICAgLnNldERlc2MoXCJUcmVhdCB5b3VyIHBhcmVudCdzIHNpYmxpbmdzIGFzIHlvdXIgcGFyZW50cyAoYXVudHMvdW5jbGVzKVwiKVxyXG4gICAgLmFkZFRvZ2dsZSgodGcpID0+XHJcbiAgICAgIHRnXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmltcGxpZWRSZWxhdGlvbnMucGFyZW50c1NpYmxpbmdzSXNQYXJlbnRzKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLnBhcmVudHNTaWJsaW5nc0lzUGFyZW50cyA9IHZhbDtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IHJlZnJlc2hJbmRleChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBtZXJtYWlkRGlhZ3JhbShcImBgYG1lcm1haWRcXG5mbG93Y2hhcnQgTFJcXG5NZSAtLT58dXB8IERhZFxcbkRhZCAtLT58c2FtZXwgVW5jbGVcXG5NZSAtLi0+fHVwfCBVbmNsZVxcbmBgYFwiKVxyXG5cclxuICBuZXcgU2V0dGluZyhyZWxhdGlvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkNvdXNpbnNcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRyZWF0IHRoZSBjb3VzaW5zIG9mIGEgbm90ZSBhcyBzaWJsaW5ncyAocGFyZW50cycgc2libGluZ3MnIGNoaWxkcmVuIGFyZSBjb3VzaW5zKVwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0ZykgPT5cclxuICAgICAgdGdcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MuaW1wbGllZFJlbGF0aW9ucy5jb3VzaW5zSXNTaWJsaW5nKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5pbXBsaWVkUmVsYXRpb25zLmNvdXNpbnNJc1NpYmxpbmcgPSB2YWw7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCByZWZyZXNoSW5kZXgocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbWVybWFpZERpYWdyYW0oXCJgYGBtZXJtYWlkXFxuZmxvd2NoYXJ0IExSXFxuTWUgLS0+fHVwfCBEYWRcXG5EYWQgLS0+fHNhbWV8IFVuY2xlXFxuVW5jbGUgLS0+fGRvd258IENvdXNpblxcbk1lIDwtLi0+fHNhbWV8IENvdXNpblxcbmBgYFwiKVxyXG5cclxuICBuZXcgU2V0dGluZyhyZWxhdGlvbkRldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk1ha2UgQ3VycmVudCBOb3RlIGFuIEltcGxpZWQgU2libGluZ1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiVGVjaGluY2FsbHksIHRoZSBjdXJyZW50IG5vdGUgaXMgYWx3YXlzIGl0J3Mgb3duIGltcGxpZWQgc2libGluZy4gQnkgZGVmYXVsdCwgaXQgaXMgbm90IHNob3cgYXMgc3VjaC4gVG9nZ2xlIHRoaXMgb24gdG8gbWFrZSBpdCBzaG93LlwiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy50cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy50cmVhdEN1cnJOb2RlQXNJbXBsaWVkU2libGluZyA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHJlZnJlc2hJbmRleCB9IGZyb20gXCIuLi9yZWZyZXNoSW5kZXhcIjtcclxuaW1wb3J0IHsgZ2V0RmllbGRzIH0gZnJvbSBcIi4uL1V0aWxzL0hpZXJVdGlsc1wiO1xyXG5pbXBvcnQgeyBmcmFnV2l0aEhUTUwsIHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRUYWdOb3RlU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBhbHRlcm5hdGl2ZUhpZXJhcmNoeURldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgdGFnTm90ZURldGFpbHMgPSBzdWJEZXRhaWxzKFwiVGFnIE5vdGVzXCIsIGFsdGVybmF0aXZlSGllcmFyY2h5RGV0YWlscyk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRhZ05vdGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFRhZyBOb3RlIEZpZWxkXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiQnkgZGVmYXVsdCwgdGFnIG5vdGVzIHVzZSB0aGUgZmlyc3QgZmllbGQgaW4geW91ciBoaWVyYXJjaGllcyAodXN1YWxseSBhbiA8Y29kZT5cdTIxOTE8L2NvZGU+IGZpZWxkKS4gQ2hvb3NlIGEgZGlmZmVyZW50IG9uZSB0byB1c2UgYnkgZGVmYXVsdCwgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSA8Y29kZT5CQy10YWctbm90ZS1maWVsZDoge2ZpZWxkfTwvY29kZT4uPC9icj5JZiB5b3UgZG9uJ3Qgd2FudCB0byBjaG9vc2UgYSBkZWZhdWx0LCBzZWxlY3QgdGhlIGJsYW5rIG9wdGlvbiBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0LlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGREcm9wZG93bigoZGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBvcHRpb25zID0ge307XHJcbiAgICAgIGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpLmZvckVhY2goXHJcbiAgICAgICAgKGZpZWxkKSA9PiAob3B0aW9uc1tmaWVsZF0gPSBmaWVsZClcclxuICAgICAgKTtcclxuICAgICAgZGQuYWRkT3B0aW9ucyhPYmplY3QuYXNzaWduKG9wdGlvbnMsIHsgXCJcIjogXCJcIiB9KSlcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MudGFnTm90ZUZpZWxkKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAoZmllbGQpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnRhZ05vdGVGaWVsZCA9IGZpZWxkO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgTm90aWNlLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7XHJcbiAgQVJST1dfRElSRUNUSU9OUyxcclxuICBERUZBVUxUX1NFVFRJTkdTLFxyXG4gIERJUkVDVElPTlMsXHJcbiAgSUxMRUdBTF9GSUxFTkFNRV9DSEFSUyxcclxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRocmVhZGluZ1NldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgY21kc0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgdGhyZWFkaW5nRGV0YWlscyA9IHN1YkRldGFpbHMoXCJUaHJlYWRpbmdcIiwgY21kc0RldGFpbHMpO1xyXG5cclxuICB0aHJlYWRpbmdEZXRhaWxzLmNyZWF0ZURpdih7XHJcbiAgICB0ZXh0OiBcIlNldHRpbmdzIGZvciB0aGUgY29tbWFuZHMgYENyZWF0ZSBuZXcgPGZpZWxkPiBmcm9tIGN1cnJlbnQgbm90ZWBcIixcclxuICB9KTtcclxuXHJcbiAgbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiT3BlbiBuZXcgdGhyZWFkcyBpbiBuZXcgcGFuZSBvciBjdXJyZW50IHBhbmVcIilcclxuICAgIC5hZGRUb2dnbGUoKHRvZykgPT4ge1xyXG4gICAgICB0b2cuc2V0VmFsdWUoc2V0dGluZ3MudGhyZWFkSW50b05ld1BhbmUpO1xyXG4gICAgICB0b2cub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MudGhyZWFkSW50b05ld1BhbmUgPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiVGhyZWFkIHVuZGVyIEN1cnNvclwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIklmIHRoZSBzZXR0aW5nIDxjb2RlPldyaXRlIEJyZWFkY3J1bWJzIElubGluZTwvY29kZT4gaXMgZW5hYmxlZCwgd2hlcmUgc2hvdWxkIHRoZSBuZXcgQnJlYWRjcnVtYiBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBub3RlPyBcdTI3MDUgPSBVbmRlciB0aGUgY3Vyc29yLCBcdTI3NEMgPSBBdCB0aGUgdG9wIG9mIHRoZSBub3RlICh1bmRlciB0aGUgeWFtbCwgaWYgYXBwbGljYWJsZSlcIlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2cpID0+IHtcclxuICAgICAgdG9nLnNldFZhbHVlKHNldHRpbmdzLnRocmVhZFVuZGVyQ3Vyc29yKTtcclxuICAgICAgdG9nLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnRocmVhZFVuZGVyQ3Vyc29yID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyh0aHJlYWRpbmdEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJOZXcgTm90ZSBOYW1lIFRlbXBsYXRlXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIGBXaGVuIHRocmVhZGluZyBpbnRvIGEgbmV3IG5vdGUsIGNob29zZSB0aGUgdGVtcGxhdGUgZm9yIHRoZSBuZXcgbm90ZSBuYW1lLjwvYnI+XHJcbiAgICAgICAgT3B0aW9ucyBpbmNsdWRlOjwvYnI+XHJcbiAgICAgICAgPHVsPlxyXG4gICAgICAgICAgPGxpPjxjb2RlPnt7ZmllbGR9fTwvY29kZT46IHRoZSBmaWVsZCBiZWluZyB0aHJlYWQgaW50bzwvbGk+XHJcbiAgICAgICAgICA8bGk+PGNvZGU+e3tkaXJ9fTwvY29kZT46IHRoZSBkaXJlY3Rpb24gYmVpbmcgdGhyZWFkIGludG88L2xpPlxyXG4gICAgICAgICAgPGxpPjxjb2RlPnt7Y3VycmVudH19PC9jb2RlPjogdGhlIGN1cnJlbnQgbm90ZSBuYW1lPC9saT5cclxuICAgICAgICAgIDxsaT48Y29kZT57e2RhdGV9fTwvY29kZT46IHRoZSBjdXJyZW50IGRhdGUgKFNldCB0aGUgZm9ybWF0IGluIHRoZSBzZXR0aW5nIGJlbG93KTwvbGk+XHJcbiAgICAgICAgPC91bD5gXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcbiAgICAgIHRleHQuc2V0VmFsdWUoc2V0dGluZ3MudGhyZWFkaW5nVGVtcGxhdGUpO1xyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmIChJTExFR0FMX0ZJTEVOQU1FX0NIQVJTLnNvbWUoKGNoYXIpID0+IHZhbHVlLmluY2x1ZGVzKGNoYXIpKSkge1xyXG4gICAgICAgICAgbmV3IE5vdGljZShcclxuICAgICAgICAgICAgYEZpbGUgbmFtZSBjYW5ub3QgY29udGFpbiBhbnkgb2YgdGhlc2UgY2hhcmFjdGVyczogJHtJTExFR0FMX0ZJTEVOQU1FX0NIQVJTLmpvaW4oXHJcbiAgICAgICAgICAgICAgXCIgXCJcclxuICAgICAgICAgICAgKX1gXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGV4dC5zZXRWYWx1ZShzZXR0aW5ncy50aHJlYWRpbmdUZW1wbGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldHRpbmdzLnRocmVhZGluZ1RlbXBsYXRlID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcodGhyZWFkaW5nRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGF0ZSBGb3JtYXRcIilcclxuICAgIC5zZXREZXNjKFwiVGhlIGRhdGUgZm9ybWF0IHVzZWQgaW4gdGhlIFRocmVhZGluZyBUZW1wbGF0ZSAoc2V0dGluZyBhYm92ZSlcIilcclxuICAgIC5hZGRNb21lbnRGb3JtYXQoKGZvcm1hdCkgPT4ge1xyXG4gICAgICBmb3JtYXRcclxuICAgICAgICAuc2V0RGVmYXVsdEZvcm1hdChERUZBVUxUX1NFVFRJTkdTLmRhdGVGb3JtYXQpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmRhdGVGb3JtYXQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MuZGF0ZUZvcm1hdCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIGNvbnN0IHRocmVhZERpclRlbXBsYXRlc1NldHRpbmcgPSBuZXcgU2V0dGluZyh0aHJlYWRpbmdEZXRhaWxzKVxyXG4gICAgLnNldENsYXNzKFwidGhyZWFkLWRpci10ZW1wbGF0ZXNcIilcclxuICAgIC5zZXROYW1lKFwiVGVtcGxhdGVyIFRlbXBsYXRlIHBlciBEaXJlY3Rpb25cIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgYEZvciBlYWNoIGRpcmVjdGlvbiB0byBiZSB0aHJlYWQgaW50bywgY2hvb3NlIGEgVGVtcGxhdGVyIHRlbXBsYXRlIHRvIGluc2VydCBpbnRvIHRoZSBuZXcgbm90ZS48L2JyPlxyXG4gICAgICAgICAgR2l2ZSB0aGUgYmFzZW5hbWUsIG9yIHRoZSBmdWxsIGZpbGUgcGF0aCAoZS5nLiA8Y29kZT5UZW1wbGF0ZXMvUGFyZW50IFRlbXBsYXRlPC9jb2RlPikuYFxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICBESVJFQ1RJT05TLmZvckVhY2goKGRpcikgPT5cclxuICAgIHRocmVhZERpclRlbXBsYXRlc1NldHRpbmcuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG4gICAgICB0ZXh0XHJcbiAgICAgICAgLnNldFBsYWNlaG9sZGVyKEFSUk9XX0RJUkVDVElPTlNbZGlyXSlcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MudGhyZWFkaW5nRGlyVGVtcGxhdGVzW2Rpcl0pO1xyXG4gICAgICB0ZXh0LmlucHV0RWwub25ibHVyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnRocmVhZGluZ0RpclRlbXBsYXRlc1tkaXJdID0gdGV4dC5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfTtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbn1cclxuIiwgImltcG9ydCB0eXBlIHsgSnVnZ2xMYXlvdXRzIH0gZnJvbSBcImp1Z2dsLWFwaVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCwgTm90aWNlLCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGlzSW5WYXVsdCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliL2Rpc3QvdXRpbHNcIjtcclxuaW1wb3J0IHsgVFJBSUxfTEVOR1RIUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IENoZWNrYm94ZXMgZnJvbSBcIi4uL0NvbXBvbmVudHMvQ2hlY2tib3hlcy5zdmVsdGVcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgc3BsaXRBbmRUcmltIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGRyYXdUcmFpbCB9IGZyb20gXCIuLi9WaWV3cy9UcmFpbFZpZXdcIjtcclxuaW1wb3J0IHsgZnJhZ1dpdGhIVE1MLCBzdWJEZXRhaWxzIH0gZnJvbSBcIi4vQnJlYWRjcnVtYnNTZXR0aW5nVGFiXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkVHJhaWxWaWV3U2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICB2aWV3RGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB0cmFpbERldGFpbHMgPSBzdWJEZXRhaWxzKFwiVHJhaWwvR3JpZC9KdWdnbFwiLCB2aWV3RGV0YWlscyk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyBCcmVhZGNydW1icyBpbiBFZGl0L0xpdmUtUHJldmlldyBNb2RlXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJJdCBhbHdheXMgc2hvd3MgaW4gcHJldmlldyBtb2RlLCBidXQgc2hvdWxkIGl0IGFsc28gc2hvdyBpbiB0aGUgb3RoZXIgdHdvP1wiXHJcbiAgICApXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgIHRvZ2dsZS5zZXRWYWx1ZShzZXR0aW5ncy5zaG93QkNzSW5FZGl0TFBNb2RlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5zaG93QkNzSW5FZGl0TFBNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgdHJhaWxEZXRhaWxzLmNyZWF0ZUVsKCdocicpXHJcbiAgdHJhaWxEZXRhaWxzLmNyZWF0ZURpdih7XHJcbiAgICBjbHM6IFwic2V0dGluZy1pdGVtLW5hbWVcIixcclxuICAgIHRleHQ6IFwiTGltaXQgVHJhaWwgVmlldyB0byBvbmx5IHNob3cgY2VydGFpbiBmaWVsZHNcIixcclxuICB9KTtcclxuXHJcbiAgbmV3IENoZWNrYm94ZXMoe1xyXG4gICAgdGFyZ2V0OiB0cmFpbERldGFpbHMsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICBwbHVnaW4sXHJcbiAgICAgIHNldHRpbmdOYW1lOiBcImxpbWl0VHJhaWxDaGVja2JveGVzXCIsXHJcbiAgICAgIG9wdGlvbnM6IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMsIFwidXBcIiksXHJcbiAgICB9LFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCB2aWV3c1RvU2hvdyA9IG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiVmlld3MgdG8gc2hvd1wiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiQ2hvb3NlIHdoaWNoIG9mIHRoZSB2aWV3cyB0byBzaG93IGF0IHRoZSB0b3Agb2YgdGhlIG5vdGUuIEp1Z2dsIFZpZXcgcmVxdWlyZXMgdGhlIEp1Z2dsIHBsdWdpbi5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRUb29sdGlwKFwiVHJhaWwgdmlld1wiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93VHJhaWwpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc2hvd1RyYWlsID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFRvb2x0aXAoXCJHcmlkIHZpZXdcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3Muc2hvd0dyaWQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc2hvd0dyaWQgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSlcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VG9vbHRpcChcIk5leHQvUHJldmlvdXMgdmlld1wiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93UHJldk5leHQpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc2hvd1ByZXZOZXh0ID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcblxyXG4gIGlmIChhcHAucGx1Z2lucy5wbHVnaW5zLmp1Z2dsICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHZpZXdzVG9TaG93LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XHJcbiAgICAgIHRvZ2dsZVxyXG4gICAgICAgIC5zZXRUb29sdGlwKFwiSnVnZ2wgdmlld1wiKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5zaG93SnVnZ2wpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc2hvd0p1Z2dsID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZSgnR3JpZCB2aWV3IGRlcHRoJylcclxuICAgIC5zZXREZXNjKCdMaW1pdCB0aGUgaW5pdGlhbCBkZXB0aCBvZiB0aGUgZ3JpZCB2aWV3JylcclxuICAgIC5hZGRTbGlkZXIoKHNsaWRlcikgPT4ge1xyXG4gICAgICBzbGlkZXJcclxuICAgICAgICAuc2V0TGltaXRzKDAsIDI1LCAxKVxyXG4gICAgICAgIC5zZXRWYWx1ZShzZXR0aW5ncy5ncmlkRGVmYXVsdERlcHRoKVxyXG4gICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpO1xyXG5cclxuICAgICAgc2xpZGVyLnNsaWRlckVsLm9uYmx1ciA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5ncmlkRGVmYXVsdERlcHRoID0gc2xpZGVyLmdldFZhbHVlKCk7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuXHJcbiAgbmV3IFNldHRpbmcodHJhaWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJJbmRleCBOb3RlKHMpXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgZnJhZ1dpdGhIVE1MKFxyXG4gICAgICAgIFwiVGhlIG5vdGUgdGhhdCBhbGwgb2YgeW91ciBvdGhlciBub3RlcyBsZWFkIGJhY2sgdG8uIFRoZSBwYXJlbnQgb2YgYWxsIHlvdXIgcGFyZW50IG5vdGVzLiBKdXN0IGVudGVyIHRoZSBiYXNlbmFtZS48L2JyPllvdSBjYW4gYWxzbyBoYXZlIG11bHRpcGxlIGluZGV4IG5vdGVzIChjb21tYS1zZXBhcmF0ZWQgbGlzdCkuPC9icj5MZWF2aW5nIHRoaXMgZmllbGQgZW1wdHkgd2lsbCBtYWtlIHRoZSB0cmFpbCBzaG93IGFsbCBwYXRocyBnb2luZyBhcyBmYXIgdXAgdGhlIHBhcmVudC10cmVlIGFzIHBvc3NpYmxlLlwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcbiAgICAgIHRleHRcclxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJJbmRleCBOb3RlXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLmluZGV4Tm90ZXMuam9pbihcIiwgXCIpKTtcclxuXHJcbiAgICAgIHRleHQuaW5wdXRFbC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXRzID0gc3BsaXRBbmRUcmltKHRleHQuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgc3BsaXRzWzBdID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgICAgIHNwbGl0cy5ldmVyeSgoaW5kZXgpID0+IGlzSW5WYXVsdChpbmRleCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5pbmRleE5vdGVzID0gc3BsaXRzO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0gZWxzZSBuZXcgTm90aWNlKFwiQXRsZWFzdCBvbmUgb2YgdGhlIG5vdGVzIGlzIG5vdCBpbiB5b3VyIHZhdWx0XCIpO1xyXG5cclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNob3dzIGFsbCBwYXRocyBpZiBub25lIHRvIGluZGV4IG5vdGUgYXJlIGZvdW5kXCIpXHJcbiAgICAuc2V0RGVzYyhcclxuICAgICAgXCJJZiB5b3UgaGF2ZSBhbiBpbmRleCBub3RlIGNob3NlbiwgYnV0IHRoZSB0cmFpbCB2aWV3IGhhcyBubyBwYXRocyBnb2luZyB1cCB0byB0aG9zZSBpbmRleCBub3Rlcywgc2hvdWxkIGl0IHNob3cgYWxsIHBhdGhzIGluc3RlYWQ/XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnNob3dBbGxQYXRoc0lmTm9uZVRvSW5kZXhOb3RlKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHNldHRpbmdzLnNob3dBbGxQYXRoc0lmTm9uZVRvSW5kZXhOb3RlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdDogQWxsLCBMb25nZXN0LCBvciBTaG9ydGVzdFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiSWYgbXVsdGlwbGUgcGF0aHMgYXJlIGZvdW5kIGdvaW5nIHVwIHRoZSBwYXJlbnQgdHJlZSwgd2hpY2ggb2YgdGhlbSBzaG91bGQgc2hvdz9cIlxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKGRkID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9XHJcbiAgICAgIFRSQUlMX0xFTkdUSFMuZm9yRWFjaChsZW5ndGggPT4ge1xyXG4gICAgICAgIG9wdGlvbnNbbGVuZ3RoXSA9IGxlbmd0aDtcclxuICAgICAgfSlcclxuXHJcbiAgICAgIGRkLmFkZE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgIGRkLnNldFZhbHVlKHNldHRpbmdzLnNob3dBbGwpO1xyXG4gICAgICBkZC5vbkNoYW5nZShhc3luYyAodmFsKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd0FsbCA9IHZhbDtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIlNlcGVyYXRvclwiKVxyXG4gICAgLnNldERlc2MoZnJhZ1dpdGhIVE1MKFxyXG4gICAgICBcIlRoZSBjaGFyYWN0ZXIgdG8gc2hvdyBiZXR3ZWVuIGNydW1icyBpbiB0aGUgYnJlYWRjcnVtYiB0cmFpbC4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+XHUyMTkyPC9jb2RlPlwiKVxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgIHRleHRcclxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJcdTIxOTJcIilcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MudHJhaWxTZXBlcmF0b3IpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3MudHJhaWxTZXBlcmF0b3IgPSB2YWx1ZTtcclxuICAgICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgIGF3YWl0IGRyYXdUcmFpbChwbHVnaW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICBuZXcgU2V0dGluZyh0cmFpbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIk5vIHBhdGggZm91bmQgbWVzc2FnZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiVGhlIHRleHQgdG8gZGlzcGxheSB3aGVuIG5vIHBhdGggdG8gdGhlIGluZGV4IG5vdGUgaXMgZm91bmQsIG9yIHRoZSBjdXJyZW50IG5vdGUgaGFzIG5vIHBhcmVudC5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgIHRleHRcclxuICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJObyBwYXRoIHRvIGluZGV4IG5vdGUgd2FzIGZvdW5kXCIpXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLm5vUGF0aE1lc3NhZ2UpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Mubm9QYXRoTWVzc2FnZSA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiUmVzcGVjdCBSZWFkYWJsZSBMaW5lIExlbmd0aFwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiU2hvdWxkIHRoZSBicmVhZGNydW1icyB0cmFpbCBhZGp1c3QgaXRzIHdpZHRoIHRvIHRoZSByZWFkYWJsZSBsaW5lIGxlbmd0aCwgb3IgdXNlIGFzIG11Y2ggc3BhY2UgYXMgcG9zc2libGU/IFx1MjcwNSA9IHVzZSByZWFkYWJsZSBsaW5lIGxlbmd0aC5cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUoc2V0dGluZ3MucmVzcGVjdFJlYWRhYmxlTGluZUxlbmd0aClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBzZXR0aW5ncy5yZXNwZWN0UmVhZGFibGVMaW5lTGVuZ3RoID0gdmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICBhd2FpdCBkcmF3VHJhaWwocGx1Z2luKTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiU2hvdyB1cCBmaWVsZHMgaW4gSnVnZ2xcIilcclxuICAgIC5zZXREZXNjKFwiSnVnZ2wgd2lsbCBzaG93IGJvdGggdXAgYW5kIGRvd24gZmllbGRzXCIpXHJcbiAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcclxuICAgICAgdG9nZ2xlXHJcbiAgICAgICAgLnNldFZhbHVlKHNldHRpbmdzLnNob3dVcEluSnVnZ2wpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgc2V0dGluZ3Muc2hvd1VwSW5KdWdnbCA9IHZhbHVlO1xyXG4gICAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIG5ldyBTZXR0aW5nKHRyYWlsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiSnVnZ2wgdmlldyBsYXlvdXRcIilcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBmcmFnV2l0aEhUTUwoXHJcbiAgICAgICAgXCJUaGUgbGF5b3V0IHR5cGUgdG8gdXNlIGZvciB0aGUgSnVnZ2wgdmlldy48YnI+VGhlIGhpZXJhcmNoeSBsYXlvdXQgaXMgbW9zdCBuYXR1cmFsIGZvciBCcmVhZGNydW1icywgYnV0IGZvciBsYXJnZSBncmFwaHMgRDMgRm9yY2UgaXMgcmVjb21tZW5kZWQuXCJcclxuICAgICAgKVxyXG4gICAgKVxyXG4gICAgLmFkZERyb3Bkb3duKChkYzogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiaGllcmFyY2h5XCIsIFwiSGllcmFyY2h5XCIpO1xyXG4gICAgICBkYy5hZGRPcHRpb24oXCJkMy1mb3JjZVwiLCBcIkQzIEZvcmNlXCIpO1xyXG4gICAgICBkYy5hZGRPcHRpb24oXCJjb2xhXCIsIFwiQ29sYSBGb3JjZVwiKTtcclxuICAgICAgZGMuYWRkT3B0aW9uKFwiZ3JpZFwiLCBcIkdyaWRcIik7XHJcbiAgICAgIGRjLmFkZE9wdGlvbihcImNvbmNlbnRyaWNcIiwgXCJDb25jZW50cmljXCIpO1xyXG5cclxuICAgICAgZGMuc2V0VmFsdWUoc2V0dGluZ3MuanVnZ2xMYXlvdXQpO1xyXG4gICAgICBkYy5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICBzZXR0aW5ncy5qdWdnbExheW91dCA9IHZhbHVlIGFzIEp1Z2dsTGF5b3V0cztcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgYXdhaXQgZHJhd1RyYWlsKHBsdWdpbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50LCBTZXR0aW5nIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEFMTFVOTElOS0VELCBSRUFsQ0xPU0VELCBSRUxBVElPTlMsIFZJU1RZUEVTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSB7IFJlbGF0aW9ucywgVmlzVHlwZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IHN1YkRldGFpbHMgfSBmcm9tIFwiLi9CcmVhZGNydW1ic1NldHRpbmdUYWJcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRWaXNNb2RhbFNldHRpbmdzKFxyXG4gIHBsdWdpbjogQkNQbHVnaW4sXHJcbiAgdmlld0RldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudFxyXG4pIHtcclxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgdmlzTW9kYWxEZXRhaWxzID0gc3ViRGV0YWlscyhcIlZpc3VhbGlzYXRpb24gTW9kYWxcIiwgdmlld0RldGFpbHMpO1xyXG5cclxuICBuZXcgU2V0dGluZyh2aXNNb2RhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgVmlzdWFsaXNhdGlvbiBUeXBlXCIpXHJcbiAgICAuc2V0RGVzYyhcIldoaWNoIHZpc3VhbGlzYXRpb24gdG8gc2hvdyBieSBkZWZhdWx0XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGNiOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBWSVNUWVBFUy5mb3JFYWNoKChvcHRpb246IFZpc1R5cGUpID0+IHtcclxuICAgICAgICBjYi5hZGRPcHRpb24ob3B0aW9uLCBvcHRpb24pO1xyXG4gICAgICB9KTtcclxuICAgICAgY2Iuc2V0VmFsdWUoc2V0dGluZ3MudmlzR3JhcGgpO1xyXG5cclxuICAgICAgY2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBWaXNUeXBlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3MudmlzR3JhcGggPSB2YWx1ZTtcclxuICAgICAgICBhd2FpdCBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgbmV3IFNldHRpbmcodmlzTW9kYWxEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXCJEZWZhdWx0IFJlbGF0aW9uXCIpXHJcbiAgICAuc2V0RGVzYyhcIldoaWNoIHJlbGF0aW9uIHR5cGUgdG8gc2hvdyBmaXJzdCB3aGVuIG9wZW5pbmcgdGhlIG1vZGFsXCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGRkKSA9PiB7XHJcbiAgICAgIFJFTEFUSU9OUy5mb3JFYWNoKChvcHRpb246IFJlbGF0aW9ucykgPT4ge1xyXG4gICAgICAgIGRkLmFkZE9wdGlvbihvcHRpb24sIG9wdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkZC5zZXRWYWx1ZShzZXR0aW5ncy52aXNSZWxhdGlvbik7XHJcblxyXG4gICAgICBkZC5vbkNoYW5nZShhc3luYyAodmFsdWU6IFJlbGF0aW9ucykgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnZpc1JlbGF0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIG5ldyBTZXR0aW5nKHZpc01vZGFsRGV0YWlscylcclxuICAgIC5zZXROYW1lKFwiRGVmYXVsdCBSZWFsL0Nsb3NlZFwiKVxyXG4gICAgLnNldERlc2MoXCJTaG93IHRoZSByZWFsIG9yIGNsb3NlZCBncmFwaCBieSBkZWZhdWx0XCIpXHJcbiAgICAuYWRkRHJvcGRvd24oKGNiOiBEcm9wZG93bkNvbXBvbmVudCkgPT4ge1xyXG4gICAgICBSRUFsQ0xPU0VELmZvckVhY2goKG9wdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY2IuYWRkT3B0aW9uKG9wdGlvbiwgb3B0aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNiLnNldFZhbHVlKHNldHRpbmdzLnZpc0Nsb3NlZCk7XHJcblxyXG4gICAgICBjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnZpc0Nsb3NlZCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICBuZXcgU2V0dGluZyh2aXNNb2RhbERldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIkRlZmF1bHQgVW5saW5rZWRcIilcclxuICAgIC5zZXREZXNjKFwiU2hvdyBhbGwgbm9kZXMgb3Igb25seSB0aG9zZSB3aGljaCBoYXZlIGxpbmtzIGJ5IGRlZmF1bHRcIilcclxuICAgIC5hZGREcm9wZG93bigoY2I6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgIEFMTFVOTElOS0VELmZvckVhY2goKG9wdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY2IuYWRkT3B0aW9uKG9wdGlvbiwgb3B0aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNiLnNldFZhbHVlKHNldHRpbmdzLnZpc0FsbCk7XHJcblxyXG4gICAgICBjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLnZpc0FsbCA9IHZhbHVlO1xyXG4gICAgICAgIGF3YWl0IHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG4iLCAiaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgQ2hlY2tib3hlcyBmcm9tIFwiLi4vQ29tcG9uZW50cy9DaGVja2JveGVzLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgeyBnZXRGaWVsZHMgfSBmcm9tIFwiLi4vVXRpbHMvSGllclV0aWxzXCI7XHJcbmltcG9ydCB7IGZyYWdXaXRoSFRNTCwgc3ViRGV0YWlscyB9IGZyb20gXCIuL0JyZWFkY3J1bWJzU2V0dGluZ1RhYlwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdyaXRlQkNzU2V0dGluZ3MoXHJcbiAgcGx1Z2luOiBCQ1BsdWdpbixcclxuICBjbWRzRGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50XHJcbikge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IHBsdWdpbjtcclxuICBjb25zdCB3cml0ZUJDc1RvRmlsZURldGFpbHMgPSBzdWJEZXRhaWxzKFxyXG4gICAgXCJXcml0ZSBCcmVhZGNydW1icyB0byBGaWxlXCIsXHJcbiAgICBjbWRzRGV0YWlsc1xyXG4gICk7XHJcblxyXG4gIHdyaXRlQkNzVG9GaWxlRGV0YWlscy5jcmVhdGVEaXYoe1xyXG4gICAgY2xzOiBcInNldHRpbmctaXRlbS1uYW1lXCIsXHJcbiAgICB0ZXh0OiBcIkxpbWl0IHRvIG9ubHkgd3JpdGUgY2VydGFpbiBmaWVsZHNcIixcclxuICB9KTtcclxuXHJcbiAgbmV3IENoZWNrYm94ZXMoe1xyXG4gICAgdGFyZ2V0OiB3cml0ZUJDc1RvRmlsZURldGFpbHMsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICBwbHVnaW4sXHJcbiAgICAgIG9wdGlvbnM6IGdldEZpZWxkcyhzZXR0aW5ncy51c2VySGllcnMpLFxyXG4gICAgICBzZXR0aW5nTmFtZTogXCJsaW1pdFdyaXRlQkNDaGVja2JveGVzXCIsXHJcbiAgICB9LFxyXG4gIH0pO1xyXG5cclxuICBuZXcgU2V0dGluZyh3cml0ZUJDc1RvRmlsZURldGFpbHMpXHJcbiAgICAuc2V0TmFtZShcIldyaXRlIElubGluZVwiKVxyXG4gICAgLnNldERlc2MoXHJcbiAgICAgIFwiV2hlbiB3cml0aW5nIEJDcyB0byBmaWxlLCBzaG91bGQgdGhleSBiZSB3cml0dGVuIGlubGluZSAodXNpbmcgRGF0YXZpZXcgc3ludGF4KSwgb3IgaW50byB0aGUgWUFNTCBvZiB0aGUgbm90ZT9cIlxyXG4gICAgKVxyXG4gICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICB0b2dnbGUuc2V0VmFsdWUoc2V0dGluZ3Mud3JpdGVCQ3NJbmxpbmUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHNldHRpbmdzLndyaXRlQkNzSW5saW5lID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgbmV3IFNldHRpbmcod3JpdGVCQ3NUb0ZpbGVEZXRhaWxzKVxyXG4gICAgLnNldE5hbWUoXHJcbiAgICAgIGZyYWdXaXRoSFRNTChcclxuICAgICAgICBcIlNob3cgdGhlIDxjb2RlPldyaXRlIEJyZWFkY3J1bWJzIHRvIEFMTCBGaWxlczwvY29kZT4gY29tbWFuZFwiXHJcbiAgICAgIClcclxuICAgIClcclxuICAgIC5zZXREZXNjKFxyXG4gICAgICBcIlRoaXMgY29tbWFuZCBhdHRlbXB0cyB0byB1cGRhdGUgQUxMIGZpbGVzIHdpdGggaW1wbGllZCBicmVhZGNydW1icyBwb2ludGluZyB0byB0aGVtLiBTbywgaXQgaXMgbm90IHNob3duIGJ5IGRlZmF1bHQgKGV2ZW4gdGhvdWdoIGl0IGhhcyAzIGNvbmZpcm1hdGlvbiBib3hlcyB0byBlbnN1cmUgeW91IHdhbnQgdG8gcnVuIGl0XCJcclxuICAgIClcclxuICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgdG9nZ2xlLnNldFZhbHVlKHNldHRpbmdzLnNob3dXcml0ZUFsbEJDc0NtZCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgc2V0dGluZ3Muc2hvd1dyaXRlQWxsQkNzQ21kID0gdmFsdWU7XHJcbiAgICAgICAgYXdhaXQgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxufVxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IER1Y2tzIGZyb20gXCIuLi9Db21wb25lbnRzL0R1Y2tzLnN2ZWx0ZVwiO1xyXG5pbXBvcnQgeyBEVUNLX0lDT04sIERVQ0tfVklFVyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHR5cGUgQkNQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER1Y2tzVmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuICBwcml2YXRlIHBsdWdpbjogQkNQbHVnaW47XHJcbiAgcHJpdmF0ZSB2aWV3OiBEdWNrcztcclxuXHJcbiAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIobGVhZik7XHJcbiAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHN1cGVyLm9ubG9hZCgpO1xyXG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLmRyYXcoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld1R5cGUoKSB7XHJcbiAgICByZXR1cm4gRFVDS19WSUVXO1xyXG4gIH1cclxuICBnZXREaXNwbGF5VGV4dCgpIHtcclxuICAgIHJldHVybiBcIkJyZWFkY3J1bWJzIER1Y2tzXCI7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPIER1Y2sgaWNvblxyXG4gIGljb24gPSBEVUNLX0lDT047XHJcblxyXG4gIGFzeW5jIG9uT3BlbigpOiBQcm9taXNlPHZvaWQ+IHsgfVxyXG5cclxuICBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy52aWV3Py4kZGVzdHJveSgpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZHJhdygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcblxyXG4gICAgdGhpcy52aWV3ID0gbmV3IER1Y2tzKHtcclxuICAgICAgdGFyZ2V0OiB0aGlzLmNvbnRlbnRFbCxcclxuICAgICAgcHJvcHM6IHsgcGx1Z2luOiB0aGlzLnBsdWdpbiwgZHVja3NWaWV3OiB0aGlzIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwgIjxzY3JpcHQ+XG4gICAgICAgIGltcG9ydCBJY29uQmFzZSBmcm9tICcuLi9jb21wb25lbnRzL0ljb25CYXNlLnN2ZWx0ZSc7XG4gICAgICAgIDwvc2NyaXB0PlxuICAgICAgICA8SWNvbkJhc2Ugdmlld0JveD1cIjAgMCAxOTIgNTEyXCIgey4uLiQkcHJvcHN9PlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMjAgNDI0LjIyOWgyMFYyNzkuNzcxSDIwYy0xMS4wNDYgMC0yMC04Ljk1NC0yMC0yMFYyMTJjMC0xMS4wNDYgOC45NTQtMjAgMjAtMjBoMTEyYzExLjA0NiAwIDIwIDguOTU0IDIwIDIwdjIxMi4yMjloMjBjMTEuMDQ2IDAgMjAgOC45NTQgMjAgMjBWNDkyYzAgMTEuMDQ2LTguOTU0IDIwLTIwIDIwSDIwYy0xMS4wNDYgMC0yMC04Ljk1NC0yMC0yMHYtNDcuNzcxYzAtMTEuMDQ2IDguOTU0LTIwIDIwLTIwek05NiAwQzU2LjIzNSAwIDI0IDMyLjIzNSAyNCA3MnMzMi4yMzUgNzIgNzIgNzIgNzItMzIuMjM1IDcyLTcyUzEzNS43NjQgMCA5NiAwelwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCBudWxsLCAiPHNjcmlwdCBsYW5nPVwidHNcIj5cclxuICBpbXBvcnQgeyBob3ZlclByZXZpZXcsIG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbiAgaW1wb3J0IEZhSW5mbyBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhSW5mby5zdmVsdGVcIjtcclxuICBpbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG4gIGltcG9ydCB0eXBlIER1Y2tzVmlldyBmcm9tIFwiLi4vVmlld3MvRHVja3NWaWV3XCI7XHJcblxyXG4gIGV4cG9ydCBsZXQgcGx1Z2luOiBCQ1BsdWdpbjtcclxuICBleHBvcnQgbGV0IGR1Y2tzVmlldzogRHVja3NWaWV3O1xyXG5cclxuICBjb25zdCB7IG1haW5HIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgZmlsZXMgPSBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cclxuICBsZXQgcXVlcnk6IHN0cmluZyA9IFwiXCI7XHJcbiAgbGV0IHJlZ2V4ID0gbmV3IFJlZ0V4cChxdWVyeSwgXCJnXCIpO1xyXG4gIGxldCBpbmNsdWRlID0gdHJ1ZTtcclxuXHJcbiAgJDoge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbmV3UmVnID0gbmV3IFJlZ0V4cChxdWVyeSwgXCJnXCIpO1xyXG4gICAgICByZWdleCA9IG5ld1JlZztcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgfVxyXG5cclxuICBjb25zdCBnZXREdWNrcyA9IChyZWdleDogUmVnRXhwKSA9PiB7XHJcbiAgICBpZiAoIXJlZ2V4KSByZXR1cm47XHJcbiAgICByZXR1cm4gZmlsZXNcclxuICAgICAgLm1hcCgoZmlsZSkgPT4gZmlsZS5iYXNlbmFtZSlcclxuICAgICAgLmZpbHRlcihcclxuICAgICAgICAobmFtZSkgPT4gIW1haW5HLm5laWdoYm9ycyhuYW1lKS5sZW5ndGggJiYgaW5jbHVkZSA9PT0gcmVnZXgudGVzdChuYW1lKVxyXG4gICAgICApO1xyXG4gIH07XHJcblxyXG4gICQ6IGR1Y2tzID0gZ2V0RHVja3MocmVnZXgpO1xyXG48L3NjcmlwdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1EdWNrcyBtYXJrZG93bi1wcmV2aWV3LXZpZXdcIj5cclxuICA8aDY+Tm90ZXMgd2l0aG91dCBCcmVhZGNydW1iczwvaDY+XHJcbiAgPHNwYW5cclxuICAgIGNsYXNzPVwiaWNvblwiXHJcbiAgICBhcmlhLWxhYmVsPXtgQSBSZWdleCB1c2VkIHRvIGZpbHRlciB0aGUgcmVzdWx0cy5cXG5JZiAnSW5jbHVkZScgaXMgY2hlY2tlZCwgaXQgd2lsbCBvbmx5IHNob3cgbm90ZXMgdGhhdCBtYXRjaCB0aGUgcmVnZXguXFxuSWYgJ0luY2x1ZGUnIGlzIG5vdCBjaGVja2VkLCB0aGlzIHJlZ2V4IHdpbGwgZmlsdGVyIG91dCBub3RlcyB0aGF0IG1hdGNoIGl0LmB9XHJcbiAgPlxyXG4gICAgPEZhSW5mbyAvPlxyXG4gIDwvc3Bhbj5cclxuICA8bGFiZWw+XHJcbiAgICBGaWx0ZXI6XHJcbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlJlZ2V4XCIgYmluZDp2YWx1ZT17cXVlcnl9IC8+XHJcbiAgPC9sYWJlbD5cclxuICA8aW5wdXQgYXJpYS1sYWJlbD1cIkluY2x1ZGVcIiB0eXBlPVwiY2hlY2tib3hcIiBiaW5kOmNoZWNrZWQ9e2luY2x1ZGV9IC8+XHJcblxyXG4gIHsjZWFjaCBkdWNrcyBhcyBkdWNrfVxyXG4gICAgPGRpdlxyXG4gICAgICBvbjpjbGljaz17YXN5bmMgKGUpID0+IGF3YWl0IG9wZW5PclN3aXRjaChkdWNrLCBlKX1cclxuICAgICAgb246bW91c2VvdmVyPXsoZSkgPT4gaG92ZXJQcmV2aWV3KGUsIGR1Y2tzVmlldywgZHVjayl9XHJcbiAgICA+XHJcbiAgICAgIDwhLS0gc3ZlbHRlLWlnbm9yZSBhMTF5LW1pc3NpbmctYXR0cmlidXRlIC0tPlxyXG4gICAgICA8YSBjbGFzcz1cImludGVybmFsLWxpbmtcIj57ZHVja308L2E+XHJcbiAgICA8L2Rpdj5cclxuICB7L2VhY2h9XHJcbjwvZGl2PlxyXG5cclxuPHN0eWxlPlxyXG4gIC5pY29uIHtcclxuICAgIGNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBwYWRkaW5nLXRvcDogNXB4ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICJpbXBvcnQgeyBJdGVtVmlldywgV29ya3NwYWNlTGVhZiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBhZGRGZWF0aGVySWNvbiB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbmltcG9ydCBTaWRlVHJlZSBmcm9tIFwiLi4vQ29tcG9uZW50cy9TaWRlVHJlZS5zdmVsdGVcIjtcclxuaW1wb3J0IHsgVFJFRV9WSUVXIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vLi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJlZVZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcbiAgcHJpdmF0ZSBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIHByaXZhdGUgdmlldzogU2lkZVRyZWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYsIHBsdWdpbjogQkNQbHVnaW4pIHtcclxuICAgIHN1cGVyKGxlYWYpO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBzdXBlci5vbmxvYWQoKTtcclxuICAgIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShhc3luYyAoKSA9PiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZHJhdygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3VHlwZSgpIHtcclxuICAgIHJldHVybiBUUkVFX1ZJRVc7XHJcbiAgfVxyXG4gIGdldERpc3BsYXlUZXh0KCkge1xyXG4gICAgcmV0dXJuIFwiQnJlYWRjcnVtYnMgRG93blwiO1xyXG4gIH1cclxuXHJcbiAgaWNvbiA9IGFkZEZlYXRoZXJJY29uKFwiY29ybmVyLXJpZ2h0LWRvd25cIikgYXMgc3RyaW5nO1xyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7fVxyXG5cclxuICBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy52aWV3Py4kZGVzdHJveSgpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZHJhdygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcblxyXG4gICAgdGhpcy52aWV3ID0gbmV3IFNpZGVUcmVlKHtcclxuICAgICAgdGFyZ2V0OiB0aGlzLmNvbnRlbnRFbCxcclxuICAgICAgcHJvcHM6IHsgcGx1Z2luOiB0aGlzLnBsdWdpbiwgdmlldzogdGhpcyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IGluZm8gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuICBpbXBvcnQge1xyXG4gICAgaG92ZXJQcmV2aWV3LFxyXG4gICAgaXNJblZhdWx0LFxyXG4gICAgb3Blbk9yU3dpdGNoLFxyXG4gIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuICBpbXBvcnQgRmFGaXJlIGZyb20gXCJzdmVsdGUtaWNvbnMvZmEvRmFGaXJlLnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCBGYVJlZ1Nub3dmbGFrZSBmcm9tIFwic3ZlbHRlLWljb25zL2ZhL0ZhUmVnU25vd2ZsYWtlLnN2ZWx0ZVwiO1xyXG4gIGltcG9ydCB7IGNyZWF0ZUluZGV4LCBpbmRleFRvTGluZVBhaXJzIH0gZnJvbSBcIi4uL0NvbW1hbmRzL0NyZWF0ZUluZGV4XCI7XHJcbiAgaW1wb3J0IHsgRElSRUNUSU9OUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuICBpbXBvcnQgdHlwZSB7IERpcmVjdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG4gIGltcG9ydCB0eXBlIEJDUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbiAgaW1wb3J0IHsgcmVmcmVzaEluZGV4IH0gZnJvbSBcIi4uL3JlZnJlc2hJbmRleFwiO1xyXG4gIGltcG9ydCB7IGRyb3BEZW5kcm9uIH0gZnJvbSBcIi4uL1V0aWxzL2dlbmVyYWxVdGlsc1wiO1xyXG4gIGltcG9ydCB7IGRmc0FsbFBhdGhzLCBnZXRTdWJJbkRpcnMgfSBmcm9tIFwiLi4vVXRpbHMvZ3JhcGhVdGlsc1wiO1xyXG4gIGltcG9ydCB0eXBlIFRyZWVWaWV3IGZyb20gXCIuLi9WaWV3cy9UcmVlVmlld1wiO1xyXG4gIGltcG9ydCB7IGdldEN1cnJGaWxlIH0gZnJvbSBcIi4uL1V0aWxzL09ic2lkaWFuVXRpbHNcIjtcclxuXHJcbiAgZXhwb3J0IGxldCBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIGV4cG9ydCBsZXQgdmlldzogVHJlZVZpZXc7XHJcblxyXG4gIGNvbnN0IHsgc2V0dGluZ3MsIGFwcCwgY2xvc2VkRyB9ID0gcGx1Z2luO1xyXG4gIGNvbnN0IHsgY3JlYXRlSW5kZXhJbmRlbnQgfSA9IHNldHRpbmdzO1xyXG5cclxuICBsZXQgZGlyOiBEaXJlY3Rpb25zID0gXCJkb3duXCI7XHJcbiAgbGV0IGZyb3plbiA9IGZhbHNlO1xyXG4gIGxldCB7IGJhc2VuYW1lIH0gPSBnZXRDdXJyRmlsZSgpO1xyXG5cclxuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcclxuICAgIGFwcC53b3Jrc3BhY2Uub24oXCJhY3RpdmUtbGVhZi1jaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICBpZiAoZnJvemVuKSByZXR1cm47XHJcbiAgICAgIGJhc2VuYW1lID0gZ2V0Q3VyckZpbGUoKT8uYmFzZW5hbWU7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIGxldCBsaW5lczogW3N0cmluZywgc3RyaW5nXVtdO1xyXG4gICQ6IHtcclxuICAgIGNvbnN0IGRvd25HID0gZ2V0U3ViSW5EaXJzKGNsb3NlZEcsIGRpcik7XHJcbiAgICBjb25zdCBhbGxQYXRocyA9IGRmc0FsbFBhdGhzKGRvd25HLCBiYXNlbmFtZSk7XHJcbiAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUluZGV4KGFsbFBhdGhzLCBmYWxzZSwgY3JlYXRlSW5kZXhJbmRlbnQpO1xyXG4gICAgaW5mbyh7IGFsbFBhdGhzLCBpbmRleCB9KTtcclxuXHJcbiAgICBsaW5lcyA9IGluZGV4VG9MaW5lUGFpcnMoaW5kZXgpO1xyXG4gIH1cclxuPC9zY3JpcHQ+XHJcblxyXG48IS0tIHN2ZWx0ZS1pZ25vcmUgYTExeS11bmtub3duLWFyaWEtYXR0cmlidXRlIC0tPlxyXG48c3BhblxyXG4gIGNsYXNzPVwiaWNvblwiXHJcbiAgYXJpYS1sYWJlbD17ZnJvemVuID8gYEZyb3plbiBvbjogJHtiYXNlbmFtZX1gIDogXCJVbmZyb3plblwifVxyXG4gIGFyaWEtbGFiZWwtcG9zaXRpb249XCJsZWZ0XCJcclxuICBvbjpjbGljaz17KCkgPT4ge1xyXG4gICAgZnJvemVuID0gIWZyb3plbjtcclxuICAgIGlmICghZnJvemVuKSBiYXNlbmFtZSA9IGdldEN1cnJGaWxlKCk/LmJhc2VuYW1lO1xyXG4gIH19XHJcbj5cclxuICB7I2lmIGZyb3plbn1cclxuICAgIDxGYVJlZ1Nub3dmbGFrZSAvPlxyXG4gIHs6ZWxzZX1cclxuICAgIDxGYUZpcmUgLz5cclxuICB7L2lmfVxyXG48L3NwYW4+XHJcblxyXG48YnV0dG9uXHJcbiAgYXJpYS1sYWJlbD1cIlJlZnJlc2ggU3RhdHMgVmlldyAoYWxzbyByZWZyZXNoZXMgQnJlYWRjcnVtYnMgSW5kZXgpXCJcclxuICBvbjpjbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgYXdhaXQgcmVmcmVzaEluZGV4KHBsdWdpbik7XHJcbiAgICBhd2FpdCB2aWV3LmRyYXcoKTtcclxuICB9fVxyXG4+XHJcbiAgXHUyMUJCXHJcbjwvYnV0dG9uPlxyXG5cclxuPHNlbGVjdCBjbGFzcz1cImRyb3Bkb3duXCIgYmluZDp2YWx1ZT17ZGlyfT5cclxuICB7I2VhY2ggRElSRUNUSU9OUyBhcyBkaXJlY3Rpb259XHJcbiAgICA8b3B0aW9uIHZhbHVlPXtkaXJlY3Rpb259PntkaXJlY3Rpb259PC9vcHRpb24+XHJcbiAgey9lYWNofVxyXG48L3NlbGVjdD5cclxuXHJcbjxkaXYgY2xhc3M9XCJCQy1kb3duc1wiPlxyXG4gIHsjZWFjaCBsaW5lcyBhcyBsaW5lfVxyXG4gICAgeyNpZiBsaW5lLmxlbmd0aCA+IDF9XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPHByZT57bGluZVswXSArIFwiLVwifTwvcHJlPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImludGVybmFsLWxpbmtcIlxyXG4gICAgICAgICAgb246Y2xpY2s9e2FzeW5jIChlKSA9PiBhd2FpdCBvcGVuT3JTd2l0Y2gobGluZVsxXSwgZSl9XHJcbiAgICAgICAgICBvbjptb3VzZW92ZXI9eyhlKSA9PiBob3ZlclByZXZpZXcoZSwgdmlldywgbGluZVsxXSl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPCEtLSBzdmVsdGUtaWdub3JlIGExMXktbWlzc2luZy1hdHRyaWJ1dGUgLS0+XHJcbiAgICAgICAgICA8YSBjbGFzcz1cImludGVybmFsLWxpbmsge2lzSW5WYXVsdChsaW5lWzFdKSA/ICcnIDogJ2lzLXVucmVzb2x2ZWQnfVwiXHJcbiAgICAgICAgICAgID57ZHJvcERlbmRyb24obGluZVsxXSwgc2V0dGluZ3MpfTwvYVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB7L2lmfVxyXG4gIHsvZWFjaH1cclxuPC9kaXY+XHJcblxyXG48c3R5bGU+XHJcbiAgYnV0dG9uIHtcclxuICAgIGRpc3BsYXk6IGlubGluZTtcclxuICAgIHBhZGRpbmc6IDFweCA2cHggMnB4IDZweDtcclxuICB9XHJcblxyXG4gIC5CQy1kb3ducyB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxuICB9XHJcbiAgcHJlIHtcclxuICAgIGRpc3BsYXk6IGlubGluZTtcclxuICB9XHJcblxyXG4gIC5pcy11bnJlc29sdmVkIHtcclxuICAgIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcclxuICB9XHJcblxyXG4gIC5pY29uIHtcclxuICAgIGNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBwYWRkaW5nLXRvcDogNXB4ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICB9XHJcbjwvc3R5bGU+XHJcbiIsICI8c2NyaXB0PlxuICAgICAgICBpbXBvcnQgSWNvbkJhc2UgZnJvbSAnLi4vY29tcG9uZW50cy9JY29uQmFzZS5zdmVsdGUnO1xuICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPEljb25CYXNlIHZpZXdCb3g9XCIwIDAgMzg0IDUxMlwiIHsuLi4kJHByb3BzfT5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIxNiAyMy44NmMwLTIzLjgtMzAuNjUtMzIuNzctNDQuMTUtMTMuMDRDNDggMTkxLjg1IDIyNCAyMDAgMjI0IDI4OGMwIDM1LjYzLTI5LjExIDY0LjQ2LTY0Ljg1IDYzLjk5LTM1LjE3LS40NS02My4xNS0yOS43Ny02My4xNS02NC45NHYtODUuNTFjMC0yMS43LTI2LjQ3LTMyLjIzLTQxLjQzLTE2LjVDMjcuOCAyMTMuMTYgMCAyNjEuMzMgMCAzMjBjMCAxMDUuODcgODYuMTMgMTkyIDE5MiAxOTJzMTkyLTg2LjEzIDE5Mi0xOTJjMC0xNzAuMjktMTY4LTE5My0xNjgtMjk2LjE0elwiIC8+XG4gICAgICAgIDwvSWNvbkJhc2U+XG4gICAgICAiLCAiPHNjcmlwdD5cbiAgICAgICAgaW1wb3J0IEljb25CYXNlIGZyb20gJy4uL2NvbXBvbmVudHMvSWNvbkJhc2Uuc3ZlbHRlJztcbiAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDxJY29uQmFzZSB2aWV3Qm94PVwiMCAwIDQ0OCA1MTJcIiB7Li4uJCRwcm9wc30+XG4gICAgICAgICAgPHBhdGggZD1cIk00NDAuMSAzNTUuMmwtMzkuMi0yMyAzNC4xLTkuM2M4LjQtMi4zIDEzLjQtMTEuMSAxMS4xLTE5LjZsLTQuMS0xNS41Yy0yLjItOC41LTEwLjktMTMuNi0xOS4zLTExLjNMMzQzIDI5OC4yIDI3MS4yIDI1Nmw3MS45LTQyLjIgNzkuNyAyMS43YzguNCAyLjMgMTctMi44IDE5LjMtMTEuM2w0LjEtMTUuNWMyLjItOC41LTIuNy0xNy4zLTExLjEtMTkuNmwtMzQuMS05LjMgMzkuMi0yM2M3LjUtNC40IDEwLjEtMTQuMiA1LjgtMjEuOWwtNy45LTEzLjljLTQuMy03LjctMTQtMTAuMy0yMS41LTUuOWwtMzkuMiAyMyA5LjEtMzQuN2MyLjItOC41LTIuNy0xNy4zLTExLjEtMTkuNmwtMTUuMi00LjFjLTguNC0yLjMtMTcgMi44LTE5LjMgMTEuM2wtMjEuMyA4MS03MS45IDQyLjJ2LTg0LjVMMzA2IDcwLjRjNi4xLTYuMiA2LjEtMTYuNCAwLTIyLjZsLTExLjEtMTEuM2MtNi4xLTYuMi0xNi4xLTYuMi0yMi4yIDBsLTI0LjkgMjUuNFYxNmMwLTguOC03LTE2LTE1LjctMTZoLTE1LjdjLTguNyAwLTE1LjcgNy4yLTE1LjcgMTZ2NDYuMWwtMjQuOS0yNS40Yy02LjEtNi4yLTE2LjEtNi4yLTIyLjIgMEwxNDIuMSA0OGMtNi4xIDYuMi02LjEgMTYuNCAwIDIyLjZsNTguMyA1OS4zdjg0LjVsLTcxLjktNDIuMi0yMS4zLTgxYy0yLjItOC41LTEwLjktMTMuNi0xOS4zLTExLjNMNzIuNyA4NGMtOC40IDIuMy0xMy40IDExLjEtMTEuMSAxOS42bDkuMSAzNC43LTM5LjItMjNjLTcuNS00LjQtMTcuMS0xLjgtMjEuNSA1LjlsLTcuOSAxMy45Yy00LjMgNy43LTEuOCAxNy40IDUuOCAyMS45bDM5LjIgMjMtMzQuMSA5LjFjLTguNCAyLjMtMTMuNCAxMS4xLTExLjEgMTkuNkw2IDIyNC4yYzIuMiA4LjUgMTAuOSAxMy42IDE5LjMgMTEuM2w3OS43LTIxLjcgNzEuOSA0Mi4yLTcxLjkgNDIuMi03OS43LTIxLjdjLTguNC0yLjMtMTcgMi44LTE5LjMgMTEuM2wtNC4xIDE1LjVjLTIuMiA4LjUgMi43IDE3LjMgMTEuMSAxOS42bDM0LjEgOS4zLTM5LjIgMjNjLTcuNSA0LjQtMTAuMSAxNC4yLTUuOCAyMS45TDEwIDM5MWM0LjMgNy43IDE0IDEwLjMgMjEuNSA1LjlsMzkuMi0yMy05LjEgMzQuN2MtMi4yIDguNSAyLjcgMTcuMyAxMS4xIDE5LjZsMTUuMiA0LjFjOC40IDIuMyAxNy0yLjggMTkuMy0xMS4zbDIxLjMtODEgNzEuOS00Mi4ydjg0LjVsLTU4LjMgNTkuM2MtNi4xIDYuMi02LjEgMTYuNCAwIDIyLjZsMTEuMSAxMS4zYzYuMSA2LjIgMTYuMSA2LjIgMjIuMiAwbDI0LjktMjUuNFY0OTZjMCA4LjggNyAxNiAxNS43IDE2aDE1LjdjOC43IDAgMTUuNy03LjIgMTUuNy0xNnYtNDYuMWwyNC45IDI1LjRjNi4xIDYuMiAxNi4xIDYuMiAyMi4yIDBsMTEuMS0xMS4zYzYuMS02LjIgNi4xLTE2LjQgMC0yMi42bC01OC4zLTU5LjN2LTg0LjVsNzEuOSA0Mi4yIDIxLjMgODFjMi4yIDguNSAxMC45IDEzLjYgMTkuMyAxMS4zTDM3NSA0MjhjOC40LTIuMyAxMy40LTExLjEgMTEuMS0xOS42bC05LjEtMzQuNyAzOS4yIDIzYzcuNSA0LjQgMTcuMSAxLjggMjEuNS01LjlsNy45LTEzLjljNC42LTcuNSAyLjEtMTcuMy01LjUtMjEuN3pcIiAvPlxuICAgICAgICA8L0ljb25CYXNlPlxuICAgICAgIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwgImltcG9ydCBhc2NlbmRpbmcgZnJvbSBcIi4vYXNjZW5kaW5nLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGYpIHtcbiAgbGV0IGRlbHRhID0gZjtcbiAgbGV0IGNvbXBhcmUgPSBmO1xuXG4gIGlmIChmLmxlbmd0aCA9PT0gMSkge1xuICAgIGRlbHRhID0gKGQsIHgpID0+IGYoZCkgLSB4O1xuICAgIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGYpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGVmdChhLCB4LCBsbywgaGkpIHtcbiAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoO1xuICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkgbG8gPSBtaWQgKyAxO1xuICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICB9XG4gICAgcmV0dXJuIGxvO1xuICB9XG5cbiAgZnVuY3Rpb24gcmlnaHQoYSwgeCwgbG8sIGhpKSB7XG4gICAgaWYgKGxvID09IG51bGwpIGxvID0gMDtcbiAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDtcbiAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgY29uc3QgbWlkID0gKGxvICsgaGkpID4+PiAxO1xuICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkO1xuICAgICAgZWxzZSBsbyA9IG1pZCArIDE7XG4gICAgfVxuICAgIHJldHVybiBsbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRlcihhLCB4LCBsbywgaGkpIHtcbiAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwO1xuICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoO1xuICAgIGNvbnN0IGkgPSBsZWZ0KGEsIHgsIGxvLCBoaSAtIDEpO1xuICAgIHJldHVybiBpID4gbG8gJiYgZGVsdGEoYVtpIC0gMV0sIHgpID4gLWRlbHRhKGFbaV0sIHgpID8gaSAtIDEgOiBpO1xuICB9XG5cbiAgcmV0dXJuIHtsZWZ0LCBjZW50ZXIsIHJpZ2h0fTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7XG4gIHJldHVybiAoZCwgeCkgPT4gYXNjZW5kaW5nKGYoZCksIHgpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBiaXNlY3RvciBmcm9tIFwiLi9iaXNlY3Rvci5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxuY29uc3QgYXNjZW5kaW5nQmlzZWN0ID0gYmlzZWN0b3IoYXNjZW5kaW5nKTtcbmV4cG9ydCBjb25zdCBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDtcbmV4cG9ydCBjb25zdCBiaXNlY3RMZWZ0ID0gYXNjZW5kaW5nQmlzZWN0LmxlZnQ7XG5leHBvcnQgY29uc3QgYmlzZWN0Q2VudGVyID0gYmlzZWN0b3IobnVtYmVyKS5jZW50ZXI7XG5leHBvcnQgZGVmYXVsdCBiaXNlY3RSaWdodDtcbiIsICJ2YXIgZTEwID0gTWF0aC5zcXJ0KDUwKSxcbiAgICBlNSA9IE1hdGguc3FydCgxMCksXG4gICAgZTIgPSBNYXRoLnNxcnQoMik7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBjb3VudCkge1xuICB2YXIgcmV2ZXJzZSxcbiAgICAgIGkgPSAtMSxcbiAgICAgIG4sXG4gICAgICB0aWNrcyxcbiAgICAgIHN0ZXA7XG5cbiAgc3RvcCA9ICtzdG9wLCBzdGFydCA9ICtzdGFydCwgY291bnQgPSArY291bnQ7XG4gIGlmIChzdGFydCA9PT0gc3RvcCAmJiBjb3VudCA+IDApIHJldHVybiBbc3RhcnRdO1xuICBpZiAocmV2ZXJzZSA9IHN0b3AgPCBzdGFydCkgbiA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBuO1xuICBpZiAoKHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkpID09PSAwIHx8ICFpc0Zpbml0ZShzdGVwKSkgcmV0dXJuIFtdO1xuXG4gIGlmIChzdGVwID4gMCkge1xuICAgIGxldCByMCA9IE1hdGgucm91bmQoc3RhcnQgLyBzdGVwKSwgcjEgPSBNYXRoLnJvdW5kKHN0b3AgLyBzdGVwKTtcbiAgICBpZiAocjAgKiBzdGVwIDwgc3RhcnQpICsrcjA7XG4gICAgaWYgKHIxICogc3RlcCA+IHN0b3ApIC0tcjE7XG4gICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IHIxIC0gcjAgKyAxKTtcbiAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAocjAgKyBpKSAqIHN0ZXA7XG4gIH0gZWxzZSB7XG4gICAgc3RlcCA9IC1zdGVwO1xuICAgIGxldCByMCA9IE1hdGgucm91bmQoc3RhcnQgKiBzdGVwKSwgcjEgPSBNYXRoLnJvdW5kKHN0b3AgKiBzdGVwKTtcbiAgICBpZiAocjAgLyBzdGVwIDwgc3RhcnQpICsrcjA7XG4gICAgaWYgKHIxIC8gc3RlcCA+IHN0b3ApIC0tcjE7XG4gICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IHIxIC0gcjAgKyAxKTtcbiAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAocjAgKyBpKSAvIHN0ZXA7XG4gIH1cblxuICBpZiAocmV2ZXJzZSkgdGlja3MucmV2ZXJzZSgpO1xuXG4gIHJldHVybiB0aWNrcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KSB7XG4gIHZhciBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksXG4gICAgICBwb3dlciA9IE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcCkgLyBNYXRoLkxOMTApLFxuICAgICAgZXJyb3IgPSBzdGVwIC8gTWF0aC5wb3coMTAsIHBvd2VyKTtcbiAgcmV0dXJuIHBvd2VyID49IDBcbiAgICAgID8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSkgKiBNYXRoLnBvdygxMCwgcG93ZXIpXG4gICAgICA6IC1NYXRoLnBvdygxMCwgLXBvd2VyKSAvIChlcnJvciA+PSBlMTAgPyAxMCA6IGVycm9yID49IGU1ID8gNSA6IGVycm9yID49IGUyID8gMiA6IDEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSB7XG4gIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksXG4gICAgICBzdGVwMSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXAwKSAvIE1hdGguTE4xMCkpLFxuICAgICAgZXJyb3IgPSBzdGVwMCAvIHN0ZXAxO1xuICBpZiAoZXJyb3IgPj0gZTEwKSBzdGVwMSAqPSAxMDtcbiAgZWxzZSBpZiAoZXJyb3IgPj0gZTUpIHN0ZXAxICo9IDU7XG4gIGVsc2UgaWYgKGVycm9yID49IGUyKSBzdGVwMSAqPSAyO1xuICByZXR1cm4gc3RvcCA8IHN0YXJ0ID8gLXN0ZXAxIDogc3RlcDE7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikge1xuICBsZXQgbWF4O1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsXG4gICAgICAgICAgJiYgKG1heCA8IHZhbHVlIHx8IChtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpKSB7XG4gICAgICAgIG1heCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDtcblxuICB2YXIgaSA9IC0xLFxuICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsXG4gICAgICByYW5nZSA9IG5ldyBBcnJheShuKTtcblxuICB3aGlsZSAoKytpIDwgbikge1xuICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn1cbiIsICJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsICJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCAiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIHhcbiAgICA/IHggLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKHgpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwgImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZ3JvdXAgPT0gbnVsbCA/IFtdIDogYXJyYXkoZ3JvdXApO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCAiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCAiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIHRoaXMuY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsICJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb25cdTIwMTl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXkodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG4iLCAiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGVudGVyID0gdHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIiA/IG9uZW50ZXIoZW50ZXIpIDogZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgaWYgKG9udXBkYXRlICE9IG51bGwpIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdGlvbikge1xuICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBTZWxlY3Rpb24pKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG1lcmdlXCIpO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBhcmUpIHtcbiAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHtcbiAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpO1xufVxuXG5mdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgYXJndW1lbnRzWzBdID0gdGhpcztcbiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSArK3NpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHNpemU7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi4vbmFtZXNwYWNlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpO1xuICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbFxuICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKVxuICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZVxuICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50XG59XG4iLCAiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvblxuICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/IFwiXCIgOiBwcmlvcml0eSkpXG4gICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3R5bGVWYWx1ZShub2RlLCBuYW1lKSB7XG4gIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSlcbiAgICAgIHx8IGRlZmF1bHRWaWV3KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbn1cbiIsICJmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgZWxzZSB0aGlzW25hbWVdID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvblxuICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTtcbn1cbiIsICJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsICJmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkge1xuICB0aGlzLnRleHRDb250ZW50ID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRleHRGdW5jdGlvblxuICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xufVxuIiwgImZ1bmN0aW9uIGh0bWxSZW1vdmUoKSB7XG4gIHRoaXMuaW5uZXJIVE1MID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBodG1sRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gaHRtbFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gaHRtbEZ1bmN0aW9uXG4gICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MO1xufVxuIiwgImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCAiZnVuY3Rpb24gbG93ZXIoKSB7XG4gIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTtcbn1cbiIsICJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwgImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCAiZnVuY3Rpb24gcmVtb3ZlKCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7XG59XG4iLCAiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpXG4gICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fO1xufVxuIiwgImZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcikge1xuICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50LCB0aGlzLl9fZGF0YV9fKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXModHlwZW5hbWVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb25SZW1vdmUodHlwZW5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbjtcbiAgICBpZiAoIW9uKSByZXR1cm47XG4gICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvblsrK2ldID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTtcbiAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uLCBvLCBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lcih2YWx1ZSk7XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5vcHRpb25zID0gb3B0aW9ucyk7XG4gICAgICAgIG8udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIG9wdGlvbnM6IG9wdGlvbnN9O1xuICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtcbiAgICBlbHNlIG9uLnB1c2gobyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gby52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTtcbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uXG4gICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQgZnJvbSBcIi4vc2VsZWN0Q2hpbGQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gZnJvbSBcIi4vc2VsZWN0Q2hpbGRyZW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW50ZXIgZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZXhpdCBmcm9tIFwiLi9leGl0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2pvaW4gZnJvbSBcIi4vam9pbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9vcmRlciBmcm9tIFwiLi9vcmRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zb3J0IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2FsbCBmcm9tIFwiLi9jYWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGVzIGZyb20gXCIuL25vZGVzLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX25vZGUgZnJvbSBcIi4vbm9kZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zaXplIGZyb20gXCIuL3NpemUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZW1wdHkgZnJvbSBcIi4vZW1wdHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZWFjaCBmcm9tIFwiLi9lYWNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9wcm9wZXJ0eSBmcm9tIFwiLi9wcm9wZXJ0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbGFzc2VkIGZyb20gXCIuL2NsYXNzZWQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2h0bWwgZnJvbSBcIi4vaHRtbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yYWlzZSBmcm9tIFwiLi9yYWlzZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9sb3dlciBmcm9tIFwiLi9sb3dlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hcHBlbmQgZnJvbSBcIi4vYXBwZW5kLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2luc2VydCBmcm9tIFwiLi9pbnNlcnQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jbG9uZSBmcm9tIFwiLi9jbG9uZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kYXR1bSBmcm9tIFwiLi9kYXR1bS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9kaXNwYXRjaCBmcm9tIFwiLi9kaXNwYXRjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pdGVyYXRvciBmcm9tIFwiLi9pdGVyYXRvci5qc1wiO1xuXG5leHBvcnQgdmFyIHJvb3QgPSBbbnVsbF07XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBwYXJlbnRzKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzO1xufVxuXG5TZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbixcbiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4sXG4gIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlcixcbiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsXG4gIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsXG4gIGV4aXQ6IHNlbGVjdGlvbl9leGl0LFxuICBqb2luOiBzZWxlY3Rpb25fam9pbixcbiAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiBzZWxlY3Rpb25fc2VsZWN0aW9uLFxuICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLFxuICBzb3J0OiBzZWxlY3Rpb25fc29ydCxcbiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsXG4gIGF0dHI6IHNlbGVjdGlvbl9hdHRyLFxuICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLFxuICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LFxuICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCxcbiAgdGV4dDogc2VsZWN0aW9uX3RleHQsXG4gIGh0bWw6IHNlbGVjdGlvbl9odG1sLFxuICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLFxuICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLFxuICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsXG4gIGluc2VydDogc2VsZWN0aW9uX2luc2VydCxcbiAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLFxuICBjbG9uZTogc2VsZWN0aW9uX2Nsb25lLFxuICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLFxuICBvbjogc2VsZWN0aW9uX29uLFxuICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX2l0ZXJhdG9yXG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZWxlY3Rpb247XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb24sIHJvb3R9IGZyb20gXCIuL3NlbGVjdGlvbi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSlcbiAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGxldCBzb3VyY2VFdmVudDtcbiAgd2hpbGUgKHNvdXJjZUV2ZW50ID0gZXZlbnQuc291cmNlRXZlbnQpIGV2ZW50ID0gc291cmNlRXZlbnQ7XG4gIHJldHVybiBldmVudDtcbn1cbiIsICJpbXBvcnQgc291cmNlRXZlbnQgZnJvbSBcIi4vc291cmNlRXZlbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQsIG5vZGUpIHtcbiAgZXZlbnQgPSBzb3VyY2VFdmVudChldmVudCk7XG4gIGlmIChub2RlID09PSB1bmRlZmluZWQpIG5vZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBpZiAobm9kZSkge1xuICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlO1xuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZO1xuICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTtcbiAgICB9XG4gICAgaWYgKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtldmVudC5wYWdlWCwgZXZlbnQucGFnZVldO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQgZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCB0cnVlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSBcIm5vbmVcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgaWYgKG5vY2xpY2spIHtcbiAgICBzZWxlY3Rpb24ub24oXCJjbGljay5kcmFnXCIsIG5vZXZlbnQsIHRydWUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEcmFnRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgc3ViamVjdCxcbiAgdGFyZ2V0LFxuICBpZGVudGlmaWVyLFxuICBhY3RpdmUsXG4gIHgsIHksIGR4LCBkeSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzdWJqZWN0OiB7dmFsdWU6IHN1YmplY3QsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBpZGVudGlmaWVyOiB7dmFsdWU6IGlkZW50aWZpZXIsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgYWN0aXZlOiB7dmFsdWU6IGFjdGl2ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB4OiB7dmFsdWU6IHgsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgeToge3ZhbHVlOiB5LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGR4OiB7dmFsdWU6IGR4LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGR5OiB7dmFsdWU6IGR5LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuXG5EcmFnRXZlbnQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2YWx1ZSA9IHRoaXMuXy5vbi5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gIHJldHVybiB2YWx1ZSA9PT0gdGhpcy5fID8gdGhpcyA6IHZhbHVlO1xufTtcbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9kcmFnLCB7eWVzZHJhZ30gZnJvbSBcIi4vbm9kcmFnLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IERyYWdFdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICFldmVudC5jdHJsS2V5ICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb250YWluZXIoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGV2ZW50LCBkKSB7XG4gIHJldHVybiBkID09IG51bGwgPyB7eDogZXZlbnQueCwgeTogZXZlbnQueX0gOiBkO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBjb250YWluZXIgPSBkZWZhdWx0Q29udGFpbmVyLFxuICAgICAgc3ViamVjdCA9IGRlZmF1bHRTdWJqZWN0LFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGdlc3R1cmVzID0ge30sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZHJhZ1wiLCBcImVuZFwiKSxcbiAgICAgIGFjdGl2ZSA9IDAsXG4gICAgICBtb3VzZWRvd254LFxuICAgICAgbW91c2Vkb3dueSxcbiAgICAgIG1vdXNlbW92aW5nLFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7XG5cbiAgZnVuY3Rpb24gZHJhZyhzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLm9uKFwibW91c2Vkb3duLmRyYWdcIiwgbW91c2Vkb3duZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC5kcmFnXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLmRyYWdcIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcInRvdWNoLWFjdGlvblwiLCBcIm5vbmVcIilcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCBkKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuY2FsbCh0aGlzLCBldmVudCwgZCkpIHJldHVybjtcbiAgICB2YXIgZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRoaXMsIGNvbnRhaW5lci5jYWxsKHRoaXMsIGV2ZW50LCBkKSwgZXZlbnQsIGQsIFwibW91c2VcIik7XG4gICAgaWYgKCFnZXN0dXJlKSByZXR1cm47XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLmRyYWdcIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLmRyYWdcIiwgbW91c2V1cHBlZCwgdHJ1ZSk7XG4gICAgbm9kcmFnKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIG1vdXNlbW92aW5nID0gZmFsc2U7XG4gICAgbW91c2Vkb3dueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgbW91c2Vkb3dueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgZ2VzdHVyZShcInN0YXJ0XCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoIW1vdXNlbW92aW5nKSB7XG4gICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0gbW91c2Vkb3dueCwgZHkgPSBldmVudC5jbGllbnRZIC0gbW91c2Vkb3dueTtcbiAgICAgIG1vdXNlbW92aW5nID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICB9XG4gICAgZ2VzdHVyZXMubW91c2UoXCJkcmFnXCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWdcIiwgbnVsbCk7XG4gICAgeWVzZHJhZyhldmVudC52aWV3LCBtb3VzZW1vdmluZyk7XG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZ2VzdHVyZXMubW91c2UoXCJlbmRcIiwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCBkKSB7XG4gICAgaWYgKCFmaWx0ZXIuY2FsbCh0aGlzLCBldmVudCwgZCkpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBjID0gY29udGFpbmVyLmNhbGwodGhpcywgZXZlbnQsIGQpLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRoaXMsIGMsIGV2ZW50LCBkLCB0b3VjaGVzW2ldLmlkZW50aWZpZXIsIHRvdWNoZXNbaV0pKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwic3RhcnRcIiwgZXZlbnQsIHRvdWNoZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQpIHtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICAgIGdlc3R1cmUoXCJkcmFnXCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50KSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwiZW5kXCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBiZWZvcmVzdGFydCh0aGF0LCBjb250YWluZXIsIGV2ZW50LCBkLCBpZGVudGlmaWVyLCB0b3VjaCkge1xuICAgIHZhciBkaXNwYXRjaCA9IGxpc3RlbmVycy5jb3B5KCksXG4gICAgICAgIHAgPSBwb2ludGVyKHRvdWNoIHx8IGV2ZW50LCBjb250YWluZXIpLCBkeCwgZHksXG4gICAgICAgIHM7XG5cbiAgICBpZiAoKHMgPSBzdWJqZWN0LmNhbGwodGhhdCwgbmV3IERyYWdFdmVudChcImJlZm9yZXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICB0YXJnZXQ6IGRyYWcsXG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFjdGl2ZSxcbiAgICAgICAgeDogcFswXSxcbiAgICAgICAgeTogcFsxXSxcbiAgICAgICAgZHg6IDAsXG4gICAgICAgIGR5OiAwLFxuICAgICAgICBkaXNwYXRjaFxuICAgICAgfSksIGQpKSA9PSBudWxsKSByZXR1cm47XG5cbiAgICBkeCA9IHMueCAtIHBbMF0gfHwgMDtcbiAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUsIGV2ZW50LCB0b3VjaCkge1xuICAgICAgdmFyIHAwID0gcCwgbjtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwic3RhcnRcIjogZ2VzdHVyZXNbaWRlbnRpZmllcl0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6IGRlbGV0ZSBnZXN0dXJlc1tpZGVudGlmaWVyXSwgLS1hY3RpdmU7IC8vIG5vYnJlYWtcbiAgICAgICAgY2FzZSBcImRyYWdcIjogcCA9IHBvaW50ZXIodG91Y2ggfHwgZXZlbnQsIGNvbnRhaW5lciksIG4gPSBhY3RpdmU7IGJyZWFrO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2guY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhhdCxcbiAgICAgICAgbmV3IERyYWdFdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIHN1YmplY3Q6IHMsXG4gICAgICAgICAgdGFyZ2V0OiBkcmFnLFxuICAgICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgICAgYWN0aXZlOiBuLFxuICAgICAgICAgIHg6IHBbMF0gKyBkeCxcbiAgICAgICAgICB5OiBwWzFdICsgZHksXG4gICAgICAgICAgZHg6IHBbMF0gLSBwMFswXSxcbiAgICAgICAgICBkeTogcFsxXSAtIHAwWzFdLFxuICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBkcmFnLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogZmlsdGVyO1xuICB9O1xuXG4gIGRyYWcuY29udGFpbmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnRhaW5lciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogY29udGFpbmVyO1xuICB9O1xuXG4gIGRyYWcuc3ViamVjdCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgZHJhZykgOiBzdWJqZWN0O1xuICB9O1xuXG4gIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgZHJhZykgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgZHJhZy5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7XG4gIH07XG5cbiAgZHJhZy5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCBkcmFnKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgcmV0dXJuIGRyYWc7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCAiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/XFxcXGQqXFxcXC4/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChcIl5yZ2JcXFxcKFwiICsgW3JlSSwgcmVJLCByZUldICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JcXFxcKFwiICsgW3JlUCwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiYVxcXFwoXCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlUCwgcmVQLCByZVAsIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKFwiXmhzbFxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUF0gKyBcIlxcXFwpJFwiKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xhXFxcXChcIiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIik7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHk6IGZ1bmN0aW9uKGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIFwiI1wiICsgaGV4KHRoaXMucikgKyBoZXgodGhpcy5nKSArIGhleCh0aGlzLmIpO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgcmV0dXJuIChhID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCIpXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArIFwiLCBcIlxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpXG4gICAgICArIChhID09PSAxID8gXCIpXCIgOiBcIiwgXCIgKyBhICsgXCIpXCIpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2w6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpO1xuICAgIHJldHVybiAoYSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwiKVxuICAgICAgICArICh0aGlzLmggfHwgMCkgKyBcIiwgXCJcbiAgICAgICAgKyAodGhpcy5zIHx8IDApICogMTAwICsgXCIlLCBcIlxuICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyBcIiVcIlxuICAgICAgICArIChhID09PSAxID8gXCIpXCIgOiBcIiwgXCIgKyBhICsgXCIpXCIpO1xuICB9XG59KSk7XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsICJleHBvcnQgY29uc3QgcmFkaWFucyA9IE1hdGguUEkgLyAxODA7XG5leHBvcnQgY29uc3QgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG4iLCAiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5pbXBvcnQge0NvbG9yLCByZ2JDb252ZXJ0LCBSZ2IsIGRhcmtlciwgYnJpZ2h0ZXJ9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5pbXBvcnQge2RlZ3JlZXMsIHJhZGlhbnN9IGZyb20gXCIuL21hdGguanNcIjtcblxudmFyIEEgPSAtMC4xNDg2MSxcbiAgICBCID0gKzEuNzgyNzcsXG4gICAgQyA9IC0wLjI5MjI3LFxuICAgIEQgPSAtMC45MDY0OSxcbiAgICBFID0gKzEuOTcyOTQsXG4gICAgRUQgPSBFICogRCxcbiAgICBFQiA9IEUgKiBCLFxuICAgIEJDX0RBID0gQiAqIEMgLSBEICogQTtcblxuZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgQ3ViZWhlbGl4KSByZXR1cm4gbmV3IEN1YmVoZWxpeChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBsID0gKEJDX0RBICogYiArIEVEICogciAtIEVCICogZykgLyAoQkNfREEgKyBFRCAtIEVCKSxcbiAgICAgIGJsID0gYiAtIGwsXG4gICAgICBrID0gKEUgKiAoZyAtIGwpIC0gQyAqIGJsKSAvIEQsXG4gICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSAqIGwgKiAoMSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTFcbiAgICAgIGggPSBzID8gTWF0aC5hdGFuMihrLCBibCkgKiBkZWdyZWVzIC0gMTIwIDogTmFOO1xuICByZXR1cm4gbmV3IEN1YmVoZWxpeChoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVoZWxpeENvbnZlcnQoaCkgOiBuZXcgQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoQ3ViZWhlbGl4LCBjdWJlaGVsaXgsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGggPSBpc05hTih0aGlzLmgpID8gMCA6ICh0aGlzLmggKyAxMjApICogcmFkaWFucyxcbiAgICAgICAgbCA9ICt0aGlzLmwsXG4gICAgICAgIGEgPSBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyAqIGwgKiAoMSAtIGwpLFxuICAgICAgICBjb3NoID0gTWF0aC5jb3MoaCksXG4gICAgICAgIHNpbmggPSBNYXRoLnNpbihoKTtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIDI1NSAqIChsICsgYSAqIChBICogY29zaCArIEIgKiBzaW5oKSksXG4gICAgICAyNTUgKiAobCArIGEgKiAoQyAqIGNvc2ggKyBEICogc2luaCkpLFxuICAgICAgMjU1ICogKGwgKyBhICogKEUgKiBjb3NoKSksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9XG59KSk7XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwgImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgaWYgKCFiKSBiID0gW107XG4gIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLFxuICAgICAgYyA9IGIuc2xpY2UoKSxcbiAgICAgIGk7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckFycmF5KHgpIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7XG59XG4iLCAiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5pbXBvcnQgbnVtYmVyQXJyYXksIHtpc051bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiAoaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5IDogZ2VuZXJpY0FycmF5KShhLCBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyaWNBcnJheShhLCBiKSB7XG4gIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsXG4gICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCxcbiAgICAgIHggPSBuZXcgQXJyYXkobmEpLFxuICAgICAgYyA9IG5ldyBBcnJheShuYiksXG4gICAgICBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7XG4gIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgZCA9IG5ldyBEYXRlO1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKiAoMSAtIHQpICsgYiAqIHQpLCBkO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCAiaW1wb3J0IHZhbHVlIGZyb20gXCIuL3ZhbHVlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGkgPSB7fSxcbiAgICAgIGMgPSB7fSxcbiAgICAgIGs7XG5cbiAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09IFwib2JqZWN0XCIpIGEgPSB7fTtcbiAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09IFwib2JqZWN0XCIpIGIgPSB7fTtcblxuICBmb3IgKGsgaW4gYikge1xuICAgIGlmIChrIGluIGEpIHtcbiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY1trXSA9IGJba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7XG4gICAgcmV0dXJuIGM7XG4gIH07XG59XG4iLCAiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsICJpbXBvcnQge2NvbG9yfSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCByZ2IgZnJvbSBcIi4vcmdiLmpzXCI7XG5pbXBvcnQge2dlbmVyaWNBcnJheX0gZnJvbSBcIi4vYXJyYXkuanNcIjtcbmltcG9ydCBkYXRlIGZyb20gXCIuL2RhdGUuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQgb2JqZWN0IGZyb20gXCIuL29iamVjdC5qc1wiO1xuaW1wb3J0IHN0cmluZyBmcm9tIFwiLi9zdHJpbmcuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgdCA9IHR5cGVvZiBiLCBjO1xuICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09IFwiYm9vbGVhblwiID8gY29uc3RhbnQoYilcbiAgICAgIDogKHQgPT09IFwibnVtYmVyXCIgPyBudW1iZXJcbiAgICAgIDogdCA9PT0gXCJzdHJpbmdcIiA/ICgoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgcmdiKSA6IHN0cmluZylcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gcmdiXG4gICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVxuICAgICAgOiBpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXlcbiAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGdlbmVyaWNBcnJheVxuICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGIudG9TdHJpbmcgIT09IFwiZnVuY3Rpb25cIiB8fCBpc05hTihiKSA/IG9iamVjdFxuICAgICAgOiBudW1iZXIpKGEsIGIpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoYSAqICgxIC0gdCkgKyBiICogdCk7XG4gIH07XG59XG4iLCAidmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0ge1xuICB0cmFuc2xhdGVYOiAwLFxuICB0cmFuc2xhdGVZOiAwLFxuICByb3RhdGU6IDAsXG4gIHNrZXdYOiAwLFxuICBzY2FsZVg6IDEsXG4gIHNjYWxlWTogMVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYO1xuICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7XG4gIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDtcbiAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7XG4gIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7XG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRlWDogZSxcbiAgICB0cmFuc2xhdGVZOiBmLFxuICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsXG4gICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLFxuICAgIHNjYWxlWDogc2NhbGVYLFxuICAgIHNjYWxlWTogc2NhbGVZXG4gIH07XG59XG4iLCAiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwgImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCAidmFyIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiB6b29tUmhvKHJobywgcmhvMiwgcmhvNCkge1xuXG4gIC8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbiAgLy8gcDEgPSBbdXgxLCB1eTEsIHcxXVxuICBmdW5jdGlvbiB6b29tKHAwLCBwMSkge1xuICAgIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sXG4gICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSxcbiAgICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICAgIGR5ID0gdXkxIC0gdXkwLFxuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgICBpLFxuICAgICAgICBTO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCBcdTIyNDUgdTEuXG4gICAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdCAqIGR4LFxuICAgICAgICAgIHV5MCArIHQgKiBkeSxcbiAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYWwgY2FzZS5cbiAgICBlbHNlIHtcbiAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksXG4gICAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80ICogZDIpIC8gKDIgKiB3MSAqIHJobzIgKiBkMSksXG4gICAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgICAgIFMgPSAocjEgLSByMCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICB2YXIgcyA9IHQgKiBTLFxuICAgICAgICAgICAgY29zaHIwID0gY29zaChyMCksXG4gICAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdSAqIGR4LFxuICAgICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGkuZHVyYXRpb24gPSBTICogMTAwMCAqIHJobyAvIE1hdGguU1FSVDI7XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHpvb20ucmhvID0gZnVuY3Rpb24oXykge1xuICAgIHZhciBfMSA9IE1hdGgubWF4KDFlLTMsICtfKSwgXzIgPSBfMSAqIF8xLCBfNCA9IF8yICogXzI7XG4gICAgcmV0dXJuIHpvb21SaG8oXzEsIF8yLCBfNCk7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59KShNYXRoLlNRUlQyLCAyLCA0KTtcbiIsICJpbXBvcnQge2N1YmVoZWxpeCBhcyBjb2xvckN1YmVoZWxpeH0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgY29sb3IsIHtodWV9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGN1YmVoZWxpeChodWUpIHtcbiAgcmV0dXJuIChmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KSB7XG4gICAgeSA9ICt5O1xuXG4gICAgZnVuY3Rpb24gY3ViZWhlbGl4KHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBoID0gaHVlKChzdGFydCA9IGNvbG9yQ3ViZWhlbGl4KHN0YXJ0KSkuaCwgKGVuZCA9IGNvbG9yQ3ViZWhlbGl4KGVuZCkpLmgpLFxuICAgICAgICAgIHMgPSBjb2xvcihzdGFydC5zLCBlbmQucyksXG4gICAgICAgICAgbCA9IGNvbG9yKHN0YXJ0LmwsIGVuZC5sKSxcbiAgICAgICAgICBvcGFjaXR5ID0gY29sb3Ioc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgc3RhcnQuaCA9IGgodCk7XG4gICAgICAgIHN0YXJ0LnMgPSBzKHQpO1xuICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7XG4gICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjdWJlaGVsaXguZ2FtbWEgPSBjdWJlaGVsaXhHYW1tYTtcblxuICAgIHJldHVybiBjdWJlaGVsaXg7XG4gIH0pKDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjdWJlaGVsaXgoaHVlKTtcbmV4cG9ydCB2YXIgY3ViZWhlbGl4TG9uZyA9IGN1YmVoZWxpeChjb2xvcik7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW50ZXJwb2xhdG9yLCBuKSB7XG4gIHZhciBzYW1wbGVzID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgc2FtcGxlc1tpXSA9IGludGVycG9sYXRvcihpIC8gKG4gLSAxKSk7XG4gIHJldHVybiBzYW1wbGVzO1xufVxuIiwgInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZVx1MjAxOXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW5cdTIwMTl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwgImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwgImltcG9ydCBpbnRlcnJ1cHQgZnJvbSBcIi4uL2ludGVycnVwdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwgImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwgImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwgImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsICJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbnZhciBTZWxlY3Rpb24gPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsICJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCAiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwgImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsICJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsICJleHBvcnQgZnVuY3Rpb24gY3ViaWNJbih0KSB7XG4gIHJldHVybiB0ICogdCAqIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjtcbn1cbiIsICJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnRlcnJ1cHQgZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuXG5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7XG5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjtcbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7cG9pbnRlciwgc2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IEJydXNoRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG52YXIgTU9ERV9EUkFHID0ge25hbWU6IFwiZHJhZ1wifSxcbiAgICBNT0RFX1NQQUNFID0ge25hbWU6IFwic3BhY2VcIn0sXG4gICAgTU9ERV9IQU5ETEUgPSB7bmFtZTogXCJoYW5kbGVcIn0sXG4gICAgTU9ERV9DRU5URVIgPSB7bmFtZTogXCJjZW50ZXJcIn07XG5cbmNvbnN0IHthYnMsIG1heCwgbWlufSA9IE1hdGg7XG5cbmZ1bmN0aW9uIG51bWJlcjEoZSkge1xuICByZXR1cm4gWytlWzBdLCArZVsxXV07XG59XG5cbmZ1bmN0aW9uIG51bWJlcjIoZSkge1xuICByZXR1cm4gW251bWJlcjEoZVswXSksIG51bWJlcjEoZVsxXSldO1xufVxuXG52YXIgWCA9IHtcbiAgbmFtZTogXCJ4XCIsXG4gIGhhbmRsZXM6IFtcIndcIiwgXCJlXCJdLm1hcCh0eXBlKSxcbiAgaW5wdXQ6IGZ1bmN0aW9uKHgsIGUpIHsgcmV0dXJuIHggPT0gbnVsbCA/IG51bGwgOiBbWyt4WzBdLCBlWzBdWzFdXSwgWyt4WzFdLCBlWzFdWzFdXV07IH0sXG4gIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ICYmIFt4eVswXVswXSwgeHlbMV1bMF1dOyB9XG59O1xuXG52YXIgWSA9IHtcbiAgbmFtZTogXCJ5XCIsXG4gIGhhbmRsZXM6IFtcIm5cIiwgXCJzXCJdLm1hcCh0eXBlKSxcbiAgaW5wdXQ6IGZ1bmN0aW9uKHksIGUpIHsgcmV0dXJuIHkgPT0gbnVsbCA/IG51bGwgOiBbW2VbMF1bMF0sICt5WzBdXSwgW2VbMV1bMF0sICt5WzFdXV07IH0sXG4gIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ICYmIFt4eVswXVsxXSwgeHlbMV1bMV1dOyB9XG59O1xuXG52YXIgWFkgPSB7XG4gIG5hbWU6IFwieHlcIixcbiAgaGFuZGxlczogW1wiblwiLCBcIndcIiwgXCJlXCIsIFwic1wiLCBcIm53XCIsIFwibmVcIiwgXCJzd1wiLCBcInNlXCJdLm1hcCh0eXBlKSxcbiAgaW5wdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSA9PSBudWxsID8gbnVsbCA6IG51bWJlcjIoeHkpOyB9LFxuICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eTsgfVxufTtcblxudmFyIGN1cnNvcnMgPSB7XG4gIG92ZXJsYXk6IFwiY3Jvc3NoYWlyXCIsXG4gIHNlbGVjdGlvbjogXCJtb3ZlXCIsXG4gIG46IFwibnMtcmVzaXplXCIsXG4gIGU6IFwiZXctcmVzaXplXCIsXG4gIHM6IFwibnMtcmVzaXplXCIsXG4gIHc6IFwiZXctcmVzaXplXCIsXG4gIG53OiBcIm53c2UtcmVzaXplXCIsXG4gIG5lOiBcIm5lc3ctcmVzaXplXCIsXG4gIHNlOiBcIm53c2UtcmVzaXplXCIsXG4gIHN3OiBcIm5lc3ctcmVzaXplXCJcbn07XG5cbnZhciBmbGlwWCA9IHtcbiAgZTogXCJ3XCIsXG4gIHc6IFwiZVwiLFxuICBudzogXCJuZVwiLFxuICBuZTogXCJud1wiLFxuICBzZTogXCJzd1wiLFxuICBzdzogXCJzZVwiXG59O1xuXG52YXIgZmxpcFkgPSB7XG4gIG46IFwic1wiLFxuICBzOiBcIm5cIixcbiAgbnc6IFwic3dcIixcbiAgbmU6IFwic2VcIixcbiAgc2U6IFwibmVcIixcbiAgc3c6IFwibndcIlxufTtcblxudmFyIHNpZ25zWCA9IHtcbiAgb3ZlcmxheTogKzEsXG4gIHNlbGVjdGlvbjogKzEsXG4gIG46IG51bGwsXG4gIGU6ICsxLFxuICBzOiBudWxsLFxuICB3OiAtMSxcbiAgbnc6IC0xLFxuICBuZTogKzEsXG4gIHNlOiArMSxcbiAgc3c6IC0xXG59O1xuXG52YXIgc2lnbnNZID0ge1xuICBvdmVybGF5OiArMSxcbiAgc2VsZWN0aW9uOiArMSxcbiAgbjogLTEsXG4gIGU6IG51bGwsXG4gIHM6ICsxLFxuICB3OiBudWxsLFxuICBudzogLTEsXG4gIG5lOiAtMSxcbiAgc2U6ICsxLFxuICBzdzogKzFcbn07XG5cbmZ1bmN0aW9uIHR5cGUodCkge1xuICByZXR1cm4ge3R5cGU6IHR9O1xufVxuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICFldmVudC5jdHJsS2V5ICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7XG4gIHZhciBzdmcgPSB0aGlzLm93bmVyU1ZHRWxlbWVudCB8fCB0aGlzO1xuICBpZiAoc3ZnLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICBzdmcgPSBzdmcudmlld0JveC5iYXNlVmFsO1xuICAgIHJldHVybiBbW3N2Zy54LCBzdmcueV0sIFtzdmcueCArIHN2Zy53aWR0aCwgc3ZnLnkgKyBzdmcuaGVpZ2h0XV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtzdmcud2lkdGguYmFzZVZhbC52YWx1ZSwgc3ZnLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7XG4gIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKFwib250b3VjaHN0YXJ0XCIgaW4gdGhpcyk7XG59XG5cbi8vIExpa2UgZDMubG9jYWwsIGJ1dCB3aXRoIHRoZSBuYW1lIFx1MjAxQ19fYnJ1c2hcdTIwMUQgcmF0aGVyIHRoYW4gYXV0by1nZW5lcmF0ZWQuXG5mdW5jdGlvbiBsb2NhbChub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX2JydXNoKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuO1xuICByZXR1cm4gbm9kZS5fX2JydXNoO1xufVxuXG5mdW5jdGlvbiBlbXB0eShleHRlbnQpIHtcbiAgcmV0dXJuIGV4dGVudFswXVswXSA9PT0gZXh0ZW50WzFdWzBdXG4gICAgICB8fCBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJydXNoU2VsZWN0aW9uKG5vZGUpIHtcbiAgdmFyIHN0YXRlID0gbm9kZS5fX2JydXNoO1xuICByZXR1cm4gc3RhdGUgPyBzdGF0ZS5kaW0ub3V0cHV0KHN0YXRlLnNlbGVjdGlvbikgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnJ1c2hYKCkge1xuICByZXR1cm4gYnJ1c2goWCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBicnVzaFkoKSB7XG4gIHJldHVybiBicnVzaChZKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBicnVzaChYWSk7XG59XG5cbmZ1bmN0aW9uIGJydXNoKGRpbSkge1xuICB2YXIgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCxcbiAgICAgIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAga2V5cyA9IHRydWUsXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiYnJ1c2hcIiwgXCJlbmRcIiksXG4gICAgICBoYW5kbGVTaXplID0gNixcbiAgICAgIHRvdWNoZW5kaW5nO1xuXG4gIGZ1bmN0aW9uIGJydXNoKGdyb3VwKSB7XG4gICAgdmFyIG92ZXJsYXkgPSBncm91cFxuICAgICAgICAucHJvcGVydHkoXCJfX2JydXNoXCIsIGluaXRpYWxpemUpXG4gICAgICAuc2VsZWN0QWxsKFwiLm92ZXJsYXlcIilcbiAgICAgIC5kYXRhKFt0eXBlKFwib3ZlcmxheVwiKV0pO1xuXG4gICAgb3ZlcmxheS5lbnRlcigpLmFwcGVuZChcInJlY3RcIilcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcIm92ZXJsYXlcIilcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKVxuICAgICAgICAuYXR0cihcImN1cnNvclwiLCBjdXJzb3JzLm92ZXJsYXkpXG4gICAgICAubWVyZ2Uob3ZlcmxheSlcbiAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGV4dGVudCA9IGxvY2FsKHRoaXMpLmV4dGVudDtcbiAgICAgICAgICBzZWxlY3QodGhpcylcbiAgICAgICAgICAgICAgLmF0dHIoXCJ4XCIsIGV4dGVudFswXVswXSlcbiAgICAgICAgICAgICAgLmF0dHIoXCJ5XCIsIGV4dGVudFswXVsxXSlcbiAgICAgICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0pXG4gICAgICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGV4dGVudFsxXVsxXSAtIGV4dGVudFswXVsxXSk7XG4gICAgICAgIH0pO1xuXG4gICAgZ3JvdXAuc2VsZWN0QWxsKFwiLnNlbGVjdGlvblwiKVxuICAgICAgLmRhdGEoW3R5cGUoXCJzZWxlY3Rpb25cIildKVxuICAgICAgLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKVxuICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwic2VsZWN0aW9uXCIpXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnMuc2VsZWN0aW9uKVxuICAgICAgICAuYXR0cihcImZpbGxcIiwgXCIjNzc3XCIpXG4gICAgICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIDAuMylcbiAgICAgICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjZmZmXCIpXG4gICAgICAgIC5hdHRyKFwic2hhcGUtcmVuZGVyaW5nXCIsIFwiY3Jpc3BFZGdlc1wiKTtcblxuICAgIHZhciBoYW5kbGUgPSBncm91cC5zZWxlY3RBbGwoXCIuaGFuZGxlXCIpXG4gICAgICAuZGF0YShkaW0uaGFuZGxlcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlOyB9KTtcblxuICAgIGhhbmRsZS5leGl0KCkucmVtb3ZlKCk7XG5cbiAgICBoYW5kbGUuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpXG4gICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gXCJoYW5kbGUgaGFuZGxlLS1cIiArIGQudHlwZTsgfSlcbiAgICAgICAgLmF0dHIoXCJjdXJzb3JcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gY3Vyc29yc1tkLnR5cGVdOyB9KTtcblxuICAgIGdyb3VwXG4gICAgICAgIC5lYWNoKHJlZHJhdylcbiAgICAgICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxuICAgICAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi5icnVzaFwiLCBzdGFydGVkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuYnJ1c2hcIiwgc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLmJydXNoXCIsIHRvdWNobW92ZWQpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcInRvdWNoLWFjdGlvblwiLCBcIm5vbmVcIilcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIGJydXNoLm1vdmUgPSBmdW5jdGlvbihncm91cCwgc2VsZWN0aW9uKSB7XG4gICAgaWYgKGdyb3VwLnR3ZWVuKSB7XG4gICAgICBncm91cFxuICAgICAgICAgIC5vbihcInN0YXJ0LmJydXNoXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KGV2ZW50KTsgfSlcbiAgICAgICAgICAub24oXCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmQoZXZlbnQpOyB9KVxuICAgICAgICAgIC50d2VlbihcImJydXNoXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLFxuICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uMCA9IHN0YXRlLnNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc2VsZWN0aW9uLCBzdGF0ZS5leHRlbnQpLFxuICAgICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShzZWxlY3Rpb24wLCBzZWxlY3Rpb24xKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdHdlZW4odCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTtcbiAgICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgICAgICAgIGVtaXQuYnJ1c2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjAgIT09IG51bGwgJiYgc2VsZWN0aW9uMSAhPT0gbnVsbCA/IHR3ZWVuIDogdHdlZW4oMSk7XG4gICAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwXG4gICAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBhcmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSxcbiAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmdzKS5iZWZvcmVzdGFydCgpO1xuXG4gICAgICAgICAgICBpbnRlcnJ1cHQodGhhdCk7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24xID09PSBudWxsID8gbnVsbCA6IHNlbGVjdGlvbjE7XG4gICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTtcbiAgICAgICAgICAgIGVtaXQuc3RhcnQoKS5icnVzaCgpLmVuZCgpO1xuICAgICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgYnJ1c2gubW92ZShncm91cCwgbnVsbCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVkcmF3KCkge1xuICAgIHZhciBncm91cCA9IHNlbGVjdCh0aGlzKSxcbiAgICAgICAgc2VsZWN0aW9uID0gbG9jYWwodGhpcykuc2VsZWN0aW9uO1xuXG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgZ3JvdXAuc2VsZWN0QWxsKFwiLnNlbGVjdGlvblwiKVxuICAgICAgICAgIC5zdHlsZShcImRpc3BsYXlcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcInhcIiwgc2VsZWN0aW9uWzBdWzBdKVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBzZWxlY3Rpb25bMF1bMV0pXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0pXG4gICAgICAgICAgLmF0dHIoXCJoZWlnaHRcIiwgc2VsZWN0aW9uWzFdWzFdIC0gc2VsZWN0aW9uWzBdWzFdKTtcblxuICAgICAgZ3JvdXAuc2VsZWN0QWxsKFwiLmhhbmRsZVwiKVxuICAgICAgICAgIC5zdHlsZShcImRpc3BsYXlcIiwgbnVsbClcbiAgICAgICAgICAuYXR0cihcInhcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gXCJlXCIgPyBzZWxlY3Rpb25bMV1bMF0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvblswXVswXSAtIGhhbmRsZVNpemUgLyAyOyB9KVxuICAgICAgICAgIC5hdHRyKFwieVwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGVbMF0gPT09IFwic1wiID8gc2VsZWN0aW9uWzFdWzFdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMV0gLSBoYW5kbGVTaXplIC8gMjsgfSlcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZSA9PT0gXCJuXCIgfHwgZC50eXBlID09PSBcInNcIiA/IHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZSA9PT0gXCJlXCIgfHwgZC50eXBlID09PSBcIndcIiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KTtcbiAgICB9XG5cbiAgICBlbHNlIHtcbiAgICAgIGdyb3VwLnNlbGVjdEFsbChcIi5zZWxlY3Rpb24sLmhhbmRsZVwiKVxuICAgICAgICAgIC5zdHlsZShcImRpc3BsYXlcIiwgXCJub25lXCIpXG4gICAgICAgICAgLmF0dHIoXCJ4XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ5XCIsIG51bGwpXG4gICAgICAgICAgLmF0dHIoXCJ3aWR0aFwiLCBudWxsKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICB2YXIgZW1pdCA9IHRoYXQuX19icnVzaC5lbWl0dGVyO1xuICAgIHJldHVybiBlbWl0ICYmICghY2xlYW4gfHwgIWVtaXQuY2xlYW4pID8gZW1pdCA6IG5ldyBFbWl0dGVyKHRoYXQsIGFyZ3MsIGNsZWFuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5zdGF0ZSA9IHRoYXQuX19icnVzaDtcbiAgICB0aGlzLmFjdGl2ZSA9IDA7XG4gICAgdGhpcy5jbGVhbiA9IGNsZWFuO1xuICB9XG5cbiAgRW1pdHRlci5wcm90b3R5cGUgPSB7XG4gICAgYmVmb3Jlc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHRoaXMuc3RhdGUuZW1pdHRlciA9IHRoaXMsIHRoaXMuc3RhcnRpbmcgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24oZXZlbnQsIG1vZGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXJ0aW5nKSB0aGlzLnN0YXJ0aW5nID0gZmFsc2UsIHRoaXMuZW1pdChcInN0YXJ0XCIsIGV2ZW50LCBtb2RlKTtcbiAgICAgIGVsc2UgdGhpcy5lbWl0KFwiYnJ1c2hcIiwgZXZlbnQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBicnVzaDogZnVuY3Rpb24oZXZlbnQsIG1vZGUpIHtcbiAgICAgIHRoaXMuZW1pdChcImJydXNoXCIsIGV2ZW50LCBtb2RlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbihldmVudCwgbW9kZSkge1xuICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsIHRoaXMuZW1pdChcImVuZFwiLCBldmVudCwgbW9kZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUsIGV2ZW50LCBtb2RlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgQnJ1c2hFdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIHRhcmdldDogYnJ1c2gsXG4gICAgICAgICAgc2VsZWN0aW9uOiBkaW0ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSxcbiAgICAgICAgICBtb2RlLFxuICAgICAgICAgIGRpc3BhdGNoOiBsaXN0ZW5lcnNcbiAgICAgICAgfSksXG4gICAgICAgIGRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHN0YXJ0ZWQoZXZlbnQpIHtcbiAgICBpZiAodG91Y2hlbmRpbmcgJiYgIWV2ZW50LnRvdWNoZXMpIHJldHVybjtcbiAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47XG5cbiAgICB2YXIgdGhhdCA9IHRoaXMsXG4gICAgICAgIHR5cGUgPSBldmVudC50YXJnZXQuX19kYXRhX18udHlwZSxcbiAgICAgICAgbW9kZSA9IChrZXlzICYmIGV2ZW50Lm1ldGFLZXkgPyB0eXBlID0gXCJvdmVybGF5XCIgOiB0eXBlKSA9PT0gXCJzZWxlY3Rpb25cIiA/IE1PREVfRFJBRyA6IChrZXlzICYmIGV2ZW50LmFsdEtleSA/IE1PREVfQ0VOVEVSIDogTU9ERV9IQU5ETEUpLFxuICAgICAgICBzaWduWCA9IGRpbSA9PT0gWSA/IG51bGwgOiBzaWduc1hbdHlwZV0sXG4gICAgICAgIHNpZ25ZID0gZGltID09PSBYID8gbnVsbCA6IHNpZ25zWVt0eXBlXSxcbiAgICAgICAgc3RhdGUgPSBsb2NhbCh0aGF0KSxcbiAgICAgICAgZXh0ZW50ID0gc3RhdGUuZXh0ZW50LFxuICAgICAgICBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb24sXG4gICAgICAgIFcgPSBleHRlbnRbMF1bMF0sIHcwLCB3MSxcbiAgICAgICAgTiA9IGV4dGVudFswXVsxXSwgbjAsIG4xLFxuICAgICAgICBFID0gZXh0ZW50WzFdWzBdLCBlMCwgZTEsXG4gICAgICAgIFMgPSBleHRlbnRbMV1bMV0sIHMwLCBzMSxcbiAgICAgICAgZHggPSAwLFxuICAgICAgICBkeSA9IDAsXG4gICAgICAgIG1vdmluZyxcbiAgICAgICAgc2hpZnRpbmcgPSBzaWduWCAmJiBzaWduWSAmJiBrZXlzICYmIGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgICBsb2NrWCxcbiAgICAgICAgbG9ja1ksXG4gICAgICAgIHBvaW50cyA9IEFycmF5LmZyb20oZXZlbnQudG91Y2hlcyB8fCBbZXZlbnRdLCB0ID0+IHtcbiAgICAgICAgICBjb25zdCBpID0gdC5pZGVudGlmaWVyO1xuICAgICAgICAgIHQgPSBwb2ludGVyKHQsIHRoYXQpO1xuICAgICAgICAgIHQucG9pbnQwID0gdC5zbGljZSgpO1xuICAgICAgICAgIHQuaWRlbnRpZmllciA9IGk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKHR5cGUgPT09IFwib3ZlcmxheVwiKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uKSBtb3ZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcHRzID0gW3BvaW50c1swXSwgcG9pbnRzWzFdIHx8IHBvaW50c1swXV07XG4gICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gPSBbW1xuICAgICAgICAgIHcwID0gZGltID09PSBZID8gVyA6IG1pbihwdHNbMF1bMF0sIHB0c1sxXVswXSksXG4gICAgICAgICAgbjAgPSBkaW0gPT09IFggPyBOIDogbWluKHB0c1swXVsxXSwgcHRzWzFdWzFdKVxuICAgICAgICBdLCBbXG4gICAgICAgICAgZTAgPSBkaW0gPT09IFkgPyBFIDogbWF4KHB0c1swXVswXSwgcHRzWzFdWzBdKSxcbiAgICAgICAgICBzMCA9IGRpbSA9PT0gWCA/IFMgOiBtYXgocHRzWzBdWzFdLCBwdHNbMV1bMV0pXG4gICAgICAgIF1dO1xuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPiAxKSBtb3ZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHcwID0gc2VsZWN0aW9uWzBdWzBdO1xuICAgICAgbjAgPSBzZWxlY3Rpb25bMF1bMV07XG4gICAgICBlMCA9IHNlbGVjdGlvblsxXVswXTtcbiAgICAgIHMwID0gc2VsZWN0aW9uWzFdWzFdO1xuICAgIH1cblxuICAgIHcxID0gdzA7XG4gICAgbjEgPSBuMDtcbiAgICBlMSA9IGUwO1xuICAgIHMxID0gczA7XG5cbiAgICB2YXIgZ3JvdXAgPSBzZWxlY3QodGhhdClcbiAgICAgICAgLmF0dHIoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIik7XG5cbiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwLnNlbGVjdEFsbChcIi5vdmVybGF5XCIpXG4gICAgICAgIC5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZV0pO1xuXG4gICAgaW50ZXJydXB0KHRoYXQpO1xuICAgIHZhciBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMsIHRydWUpLmJlZm9yZXN0YXJ0KCk7XG5cbiAgICBpZiAoZXZlbnQudG91Y2hlcykge1xuICAgICAgZW1pdC5tb3ZlZCA9IG1vdmVkO1xuICAgICAgZW1pdC5lbmRlZCA9IGVuZGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmlldyA9IHNlbGVjdChldmVudC52aWV3KVxuICAgICAgICAgIC5vbihcIm1vdXNlbW92ZS5icnVzaFwiLCBtb3ZlZCwgdHJ1ZSlcbiAgICAgICAgICAub24oXCJtb3VzZXVwLmJydXNoXCIsIGVuZGVkLCB0cnVlKTtcbiAgICAgIGlmIChrZXlzKSB2aWV3XG4gICAgICAgICAgLm9uKFwia2V5ZG93bi5icnVzaFwiLCBrZXlkb3duZWQsIHRydWUpXG4gICAgICAgICAgLm9uKFwia2V5dXAuYnJ1c2hcIiwga2V5dXBwZWQsIHRydWUpXG5cbiAgICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpO1xuICAgIH1cblxuICAgIHJlZHJhdy5jYWxsKHRoYXQpO1xuICAgIGVtaXQuc3RhcnQoZXZlbnQsIG1vZGUubmFtZSk7XG5cbiAgICBmdW5jdGlvbiBtb3ZlZChldmVudCkge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGV2ZW50LmNoYW5nZWRUb3VjaGVzIHx8IFtldmVudF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBkIG9mIHBvaW50cylcbiAgICAgICAgICBpZiAoZC5pZGVudGlmaWVyID09PSBwLmlkZW50aWZpZXIpIGQuY3VyID0gcG9pbnRlcihwLCB0aGF0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaGlmdGluZyAmJiAhbG9ja1ggJiYgIWxvY2tZICYmIHBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbMF07XG4gICAgICAgIGlmIChhYnMocG9pbnQuY3VyWzBdIC0gcG9pbnRbMF0pID4gYWJzKHBvaW50LmN1clsxXSAtIHBvaW50WzFdKSlcbiAgICAgICAgICBsb2NrWSA9IHRydWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsb2NrWCA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cylcbiAgICAgICAgaWYgKHBvaW50LmN1cikgcG9pbnRbMF0gPSBwb2ludC5jdXJbMF0sIHBvaW50WzFdID0gcG9pbnQuY3VyWzFdO1xuICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgbW92ZShldmVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW92ZShldmVudCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbMF0sIHBvaW50MCA9IHBvaW50LnBvaW50MDtcbiAgICAgIHZhciB0O1xuXG4gICAgICBkeCA9IHBvaW50WzBdIC0gcG9pbnQwWzBdO1xuICAgICAgZHkgPSBwb2ludFsxXSAtIHBvaW50MFsxXTtcblxuICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgIGNhc2UgTU9ERV9TUEFDRTpcbiAgICAgICAgY2FzZSBNT0RFX0RSQUc6IHtcbiAgICAgICAgICBpZiAoc2lnblgpIGR4ID0gbWF4KFcgLSB3MCwgbWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3MCArIGR4LCBlMSA9IGUwICsgZHg7XG4gICAgICAgICAgaWYgKHNpZ25ZKSBkeSA9IG1heChOIC0gbjAsIG1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHtcbiAgICAgICAgICBpZiAocG9pbnRzWzFdKSB7XG4gICAgICAgICAgICBpZiAoc2lnblgpIHcxID0gbWF4KFcsIG1pbihFLCBwb2ludHNbMF1bMF0pKSwgZTEgPSBtYXgoVywgbWluKEUsIHBvaW50c1sxXVswXSkpLCBzaWduWCA9IDE7XG4gICAgICAgICAgICBpZiAoc2lnblkpIG4xID0gbWF4KE4sIG1pbihTLCBwb2ludHNbMF1bMV0pKSwgczEgPSBtYXgoTiwgbWluKFMsIHBvaW50c1sxXVsxXSkpLCBzaWduWSA9IDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGR4ID0gbWF4KFcgLSB3MCwgbWluKEUgLSB3MCwgZHgpKSwgdzEgPSB3MCArIGR4LCBlMSA9IGUwO1xuICAgICAgICAgICAgZWxzZSBpZiAoc2lnblggPiAwKSBkeCA9IG1heChXIC0gZTAsIG1pbihFIC0gZTAsIGR4KSksIHcxID0gdzAsIGUxID0gZTAgKyBkeDtcbiAgICAgICAgICAgIGlmIChzaWduWSA8IDApIGR5ID0gbWF4KE4gLSBuMCwgbWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwO1xuICAgICAgICAgICAgZWxzZSBpZiAoc2lnblkgPiAwKSBkeSA9IG1heChOIC0gczAsIG1pbihTIC0gczAsIGR5KSksIG4xID0gbjAsIHMxID0gczAgKyBkeTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBNT0RFX0NFTlRFUjoge1xuICAgICAgICAgIGlmIChzaWduWCkgdzEgPSBtYXgoVywgbWluKEUsIHcwIC0gZHggKiBzaWduWCkpLCBlMSA9IG1heChXLCBtaW4oRSwgZTAgKyBkeCAqIHNpZ25YKSk7XG4gICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IG1heChOLCBtaW4oUywgbjAgLSBkeSAqIHNpZ25ZKSksIHMxID0gbWF4KE4sIG1pbihTLCBzMCArIGR5ICogc2lnblkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZTEgPCB3MSkge1xuICAgICAgICBzaWduWCAqPSAtMTtcbiAgICAgICAgdCA9IHcwLCB3MCA9IGUwLCBlMCA9IHQ7XG4gICAgICAgIHQgPSB3MSwgdzEgPSBlMSwgZTEgPSB0O1xuICAgICAgICBpZiAodHlwZSBpbiBmbGlwWCkgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZSA9IGZsaXBYW3R5cGVdXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzMSA8IG4xKSB7XG4gICAgICAgIHNpZ25ZICo9IC0xO1xuICAgICAgICB0ID0gbjAsIG4wID0gczAsIHMwID0gdDtcbiAgICAgICAgdCA9IG4xLCBuMSA9IHMxLCBzMSA9IHQ7XG4gICAgICAgIGlmICh0eXBlIGluIGZsaXBZKSBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29yc1t0eXBlID0gZmxpcFlbdHlwZV1dKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5IGJydXNoLm1vdmUhXG4gICAgICBpZiAobG9ja1gpIHcxID0gc2VsZWN0aW9uWzBdWzBdLCBlMSA9IHNlbGVjdGlvblsxXVswXTtcbiAgICAgIGlmIChsb2NrWSkgbjEgPSBzZWxlY3Rpb25bMF1bMV0sIHMxID0gc2VsZWN0aW9uWzFdWzFdO1xuXG4gICAgICBpZiAoc2VsZWN0aW9uWzBdWzBdICE9PSB3MVxuICAgICAgICAgIHx8IHNlbGVjdGlvblswXVsxXSAhPT0gbjFcbiAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMF0gIT09IGUxXG4gICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzFdICE9PSBzMSkge1xuICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBbW3cxLCBuMV0sIFtlMSwgczFdXTtcbiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICAgIGVtaXQuYnJ1c2goZXZlbnQsIG1vZGUubmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kZWQoZXZlbnQpIHtcbiAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICAgICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdFbmFibGUoZXZlbnQudmlldywgbW92aW5nKTtcbiAgICAgICAgdmlldy5vbihcImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2hcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBncm91cC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIik7XG4gICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5vdmVybGF5KTtcbiAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIChvbiBzdGFydCkhXG4gICAgICBpZiAoZW1wdHkoc2VsZWN0aW9uKSkgc3RhdGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7XG4gICAgICBlbWl0LmVuZChldmVudCwgbW9kZS5uYW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrZXlkb3duZWQoZXZlbnQpIHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUXG4gICAgICAgICAgc2hpZnRpbmcgPSBzaWduWCAmJiBzaWduWTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSkge1xuICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7XG4gICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTtcbiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjtcbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAzMjogeyAvLyBTUEFDRTsgdGFrZXMgcHJpb3JpdHkgb3ZlciBBTFRcbiAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUgfHwgbW9kZSA9PT0gTU9ERV9DRU5URVIpIHtcbiAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTEgLSBkeDsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxIC0gZHg7XG4gICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxIC0gZHk7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMSAtIGR5O1xuICAgICAgICAgICAgbW9kZSA9IE1PREVfU1BBQ0U7XG4gICAgICAgICAgICBvdmVybGF5LmF0dHIoXCJjdXJzb3JcIiwgY3Vyc29ycy5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgICB9XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrZXl1cHBlZChldmVudCkge1xuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlRcbiAgICAgICAgICBpZiAoc2hpZnRpbmcpIHtcbiAgICAgICAgICAgIGxvY2tYID0gbG9ja1kgPSBzaGlmdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVFxuICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0NFTlRFUikge1xuICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxO1xuICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xO1xuICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFO1xuICAgICAgICAgICAgbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFXG4gICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfU1BBQ0UpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7XG4gICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZO1xuICAgICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxOyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7XG4gICAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTtcbiAgICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3ZlcmxheS5hdHRyKFwiY3Vyc29yXCIsIGN1cnNvcnNbdHlwZV0pO1xuICAgICAgICAgICAgbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgICB9XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50KSB7XG4gICAgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLm1vdmVkKGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQpIHtcbiAgICBlbWl0dGVyKHRoaXMsIGFyZ3VtZW50cykuZW5kZWQoZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9fYnJ1c2ggfHwge3NlbGVjdGlvbjogbnVsbH07XG4gICAgc3RhdGUuZXh0ZW50ID0gbnVtYmVyMihleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgc3RhdGUuZGltID0gZGltO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KG51bWJlcjIoXykpLCBicnVzaCkgOiBleHRlbnQ7XG4gIH07XG5cbiAgYnJ1c2guZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgYnJ1c2gpIDogZmlsdGVyO1xuICB9O1xuXG4gIGJydXNoLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGJydXNoKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICBicnVzaC5oYW5kbGVTaXplID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhhbmRsZVNpemUgPSArXywgYnJ1c2gpIDogaGFuZGxlU2l6ZTtcbiAgfTtcblxuICBicnVzaC5rZXlNb2RpZmllcnMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoa2V5cyA9ICEhXywgYnJ1c2gpIDoga2V5cztcbiAgfTtcblxuICBicnVzaC5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBicnVzaCA6IHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiBicnVzaDtcbn1cbiIsICJjb25zdCBwaSA9IE1hdGguUEksXG4gICAgdGF1ID0gMiAqIHBpLFxuICAgIGVwc2lsb24gPSAxZS02LFxuICAgIHRhdUVwc2lsb24gPSB0YXUgLSBlcHNpbG9uO1xuXG5mdW5jdGlvbiBQYXRoKCkge1xuICB0aGlzLl94MCA9IHRoaXMuX3kwID0gLy8gc3RhcnQgb2YgY3VycmVudCBzdWJwYXRoXG4gIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVudCBzdWJwYXRoXG4gIHRoaXMuXyA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiBuZXcgUGF0aDtcbn1cblxuUGF0aC5wcm90b3R5cGUgPSBwYXRoLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFBhdGgsXG4gIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7XG4gICAgICB0aGlzLl8gKz0gXCJaXCI7XG4gICAgfVxuICB9LFxuICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJMXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7XG4gICAgdGhpcy5fICs9IFwiUVwiICsgKCt4MSkgKyBcIixcIiArICgreTEpICsgXCIsXCIgKyAodGhpcy5feDEgPSAreCkgKyBcIixcIiArICh0aGlzLl95MSA9ICt5KTtcbiAgfSxcbiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICB0aGlzLl8gKz0gXCJDXCIgKyAoK3gxKSArIFwiLFwiICsgKCt5MSkgKyBcIixcIiArICgreDIpICsgXCIsXCIgKyAoK3kyKSArIFwiLFwiICsgKHRoaXMuX3gxID0gK3gpICsgXCIsXCIgKyAodGhpcy5feTEgPSAreSk7XG4gIH0sXG4gIGFyY1RvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5Miwgcikge1xuICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7XG4gICAgdmFyIHgwID0gdGhpcy5feDEsXG4gICAgICAgIHkwID0gdGhpcy5feTEsXG4gICAgICAgIHgyMSA9IHgyIC0geDEsXG4gICAgICAgIHkyMSA9IHkyIC0geTEsXG4gICAgICAgIHgwMSA9IHgwIC0geDEsXG4gICAgICAgIHkwMSA9IHkwIC0geTEsXG4gICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxO1xuXG4gICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuXG4gICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJuZWdhdGl2ZSByYWRpdXM6IFwiICsgcik7XG5cbiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS5cbiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuXyArPSBcIk1cIiArICh0aGlzLl94MSA9IHgxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEpO1xuICAgIH1cblxuICAgIC8vIE9yLCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLlxuICAgIGVsc2UgaWYgKCEobDAxXzIgPiBlcHNpbG9uKSk7XG5cbiAgICAvLyBPciwgYXJlICh4MCx5MCksICh4MSx5MSkgYW5kICh4Mix5MikgY29sbGluZWFyP1xuICAgIC8vIEVxdWl2YWxlbnRseSwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgyLHkyKT9cbiAgICAvLyBPciwgaXMgdGhlIHJhZGl1cyB6ZXJvPyBMaW5lIHRvICh4MSx5MSkuXG4gICAgZWxzZSBpZiAoIShNYXRoLmFicyh5MDEgKiB4MjEgLSB5MjEgKiB4MDEpID4gZXBzaWxvbikgfHwgIXIpIHtcbiAgICAgIHRoaXMuXyArPSBcIkxcIiArICh0aGlzLl94MSA9IHgxKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTEpO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgZHJhdyBhbiBhcmMhXG4gICAgZWxzZSB7XG4gICAgICB2YXIgeDIwID0geDIgLSB4MCxcbiAgICAgICAgICB5MjAgPSB5MiAtIHkwLFxuICAgICAgICAgIGwyMV8yID0geDIxICogeDIxICsgeTIxICogeTIxLFxuICAgICAgICAgIGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLFxuICAgICAgICAgIGwyMSA9IE1hdGguc3FydChsMjFfMiksXG4gICAgICAgICAgbDAxID0gTWF0aC5zcXJ0KGwwMV8yKSxcbiAgICAgICAgICBsID0gciAqIE1hdGgudGFuKChwaSAtIE1hdGguYWNvcygobDIxXzIgKyBsMDFfMiAtIGwyMF8yKSAvICgyICogbDIxICogbDAxKSkpIC8gMiksXG4gICAgICAgICAgdDAxID0gbCAvIGwwMSxcbiAgICAgICAgICB0MjEgPSBsIC8gbDIxO1xuXG4gICAgICAvLyBJZiB0aGUgc3RhcnQgdGFuZ2VudCBpcyBub3QgY29pbmNpZGVudCB3aXRoICh4MCx5MCksIGxpbmUgdG8uXG4gICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uKSB7XG4gICAgICAgIHRoaXMuXyArPSBcIkxcIiArICh4MSArIHQwMSAqIHgwMSkgKyBcIixcIiArICh5MSArIHQwMSAqIHkwMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDAsXCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArIFwiLFwiICsgKHRoaXMuX3gxID0geDEgKyB0MjEgKiB4MjEpICsgXCIsXCIgKyAodGhpcy5feTEgPSB5MSArIHQyMSAqIHkyMSk7XG4gICAgfVxuICB9LFxuICBhcmM6IGZ1bmN0aW9uKHgsIHksIHIsIGEwLCBhMSwgY2N3KSB7XG4gICAgeCA9ICt4LCB5ID0gK3ksIHIgPSArciwgY2N3ID0gISFjY3c7XG4gICAgdmFyIGR4ID0gciAqIE1hdGguY29zKGEwKSxcbiAgICAgICAgZHkgPSByICogTWF0aC5zaW4oYTApLFxuICAgICAgICB4MCA9IHggKyBkeCxcbiAgICAgICAgeTAgPSB5ICsgZHksXG4gICAgICAgIGN3ID0gMSBeIGNjdyxcbiAgICAgICAgZGEgPSBjY3cgPyBhMCAtIGExIDogYTEgLSBhMDtcblxuICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLlxuICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwibmVnYXRpdmUgcmFkaXVzOiBcIiArIHIpO1xuXG4gICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MCx5MCkuXG4gICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7XG4gICAgICB0aGlzLl8gKz0gXCJNXCIgKyB4MCArIFwiLFwiICsgeTA7XG4gICAgfVxuXG4gICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5jaWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS5cbiAgICBlbHNlIGlmIChNYXRoLmFicyh0aGlzLl94MSAtIHgwKSA+IGVwc2lsb24gfHwgTWF0aC5hYnModGhpcy5feTEgLSB5MCkgPiBlcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJMXCIgKyB4MCArIFwiLFwiICsgeTA7XG4gICAgfVxuXG4gICAgLy8gSXMgdGhpcyBhcmMgZW1wdHk/IFdlXHUyMDE5cmUgZG9uZS5cbiAgICBpZiAoIXIpIHJldHVybjtcblxuICAgIC8vIERvZXMgdGhlIGFuZ2xlIGdvIHRoZSB3cm9uZyB3YXk/IEZsaXAgdGhlIGRpcmVjdGlvbi5cbiAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1ICsgdGF1O1xuXG4gICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLlxuICAgIGlmIChkYSA+IHRhdUVwc2lsb24pIHtcbiAgICAgIHRoaXMuXyArPSBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiwwLDEsXCIgKyBjdyArIFwiLFwiICsgKHggLSBkeCkgKyBcIixcIiArICh5IC0gZHkpICsgXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCwxLFwiICsgY3cgKyBcIixcIiArICh0aGlzLl94MSA9IHgwKSArIFwiLFwiICsgKHRoaXMuX3kxID0geTApO1xuICAgIH1cblxuICAgIC8vIElzIHRoaXMgYXJjIG5vbi1lbXB0eT8gRHJhdyBhbiBhcmMhXG4gICAgZWxzZSBpZiAoZGEgPiBlcHNpbG9uKSB7XG4gICAgICB0aGlzLl8gKz0gXCJBXCIgKyByICsgXCIsXCIgKyByICsgXCIsMCxcIiArICgrKGRhID49IHBpKSkgKyBcIixcIiArIGN3ICsgXCIsXCIgKyAodGhpcy5feDEgPSB4ICsgciAqIE1hdGguY29zKGExKSkgKyBcIixcIiArICh0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpKTtcbiAgICB9XG4gIH0sXG4gIHJlY3Q6IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHtcbiAgICB0aGlzLl8gKz0gXCJNXCIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArIFwiLFwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSkgKyBcImhcIiArICgrdykgKyBcInZcIiArICgraCkgKyBcImhcIiArICgtdykgKyBcIlpcIjtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl87XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGg7XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgbm9kZXMsIHN0cmVuZ3RoID0gMTtcblxuICBpZiAoeCA9PSBudWxsKSB4ID0gMDtcbiAgaWYgKHkgPT0gbnVsbCkgeSA9IDA7XG5cbiAgZnVuY3Rpb24gZm9yY2UoKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN4ID0gMCxcbiAgICAgICAgc3kgPSAwO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBzeCArPSBub2RlLngsIHN5ICs9IG5vZGUueTtcbiAgICB9XG5cbiAgICBmb3IgKHN4ID0gKHN4IC8gbiAtIHgpICogc3RyZW5ndGgsIHN5ID0gKHN5IC8gbiAtIHkpICogc3RyZW5ndGgsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueCAtPSBzeCwgbm9kZS55IC09IHN5O1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgbm9kZXMgPSBfO1xuICB9O1xuXG4gIGZvcmNlLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4O1xuICB9O1xuXG4gIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9ICtfLCBmb3JjZSkgOiB5O1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gK18sIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkKSB7XG4gIGNvbnN0IHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQpLFxuICAgICAgeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCk7XG4gIHJldHVybiBhZGQodGhpcy5jb3Zlcih4LCB5KSwgeCwgeSwgZCk7XG59XG5cbmZ1bmN0aW9uIGFkZCh0cmVlLCB4LCB5LCBkKSB7XG4gIGlmIChpc05hTih4KSB8fCBpc05hTih5KSkgcmV0dXJuIHRyZWU7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciBwYXJlbnQsXG4gICAgICBub2RlID0gdHJlZS5fcm9vdCxcbiAgICAgIGxlYWYgPSB7ZGF0YTogZH0sXG4gICAgICB4MCA9IHRyZWUuX3gwLFxuICAgICAgeTAgPSB0cmVlLl95MCxcbiAgICAgIHgxID0gdHJlZS5feDEsXG4gICAgICB5MSA9IHRyZWUuX3kxLFxuICAgICAgeG0sXG4gICAgICB5bSxcbiAgICAgIHhwLFxuICAgICAgeXAsXG4gICAgICByaWdodCxcbiAgICAgIGJvdHRvbSxcbiAgICAgIGksXG4gICAgICBqO1xuXG4gIC8vIElmIHRoZSB0cmVlIGlzIGVtcHR5LCBpbml0aWFsaXplIHRoZSByb290IGFzIGEgbGVhZi5cbiAgaWYgKCFub2RlKSByZXR1cm4gdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7XG5cbiAgLy8gRmluZCB0aGUgZXhpc3RpbmcgbGVhZiBmb3IgdGhlIG5ldyBwb2ludCwgb3IgYWRkIGl0LlxuICB3aGlsZSAobm9kZS5sZW5ndGgpIHtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgICBpZiAocGFyZW50ID0gbm9kZSwgIShub2RlID0gbm9kZVtpID0gYm90dG9tIDw8IDEgfCByaWdodF0pKSByZXR1cm4gcGFyZW50W2ldID0gbGVhZiwgdHJlZTtcbiAgfVxuXG4gIC8vIElzIHRoZSBuZXcgcG9pbnQgaXMgZXhhY3RseSBjb2luY2lkZW50IHdpdGggdGhlIGV4aXN0aW5nIHBvaW50P1xuICB4cCA9ICt0cmVlLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKTtcbiAgeXAgPSArdHJlZS5feS5jYWxsKG51bGwsIG5vZGUuZGF0YSk7XG4gIGlmICh4ID09PSB4cCAmJiB5ID09PSB5cCkgcmV0dXJuIGxlYWYubmV4dCA9IG5vZGUsIHBhcmVudCA/IHBhcmVudFtpXSA9IGxlYWYgOiB0cmVlLl9yb290ID0gbGVhZiwgdHJlZTtcblxuICAvLyBPdGhlcndpc2UsIHNwbGl0IHRoZSBsZWFmIG5vZGUgdW50aWwgdGhlIG9sZCBhbmQgbmV3IHBvaW50IGFyZSBzZXBhcmF0ZWQuXG4gIGRvIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQgPyBwYXJlbnRbaV0gPSBuZXcgQXJyYXkoNCkgOiB0cmVlLl9yb290ID0gbmV3IEFycmF5KDQpO1xuICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTtcbiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltO1xuICB9IHdoaWxlICgoaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHQpID09PSAoaiA9ICh5cCA+PSB5bSkgPDwgMSB8ICh4cCA+PSB4bSkpKTtcbiAgcmV0dXJuIHBhcmVudFtqXSA9IG5vZGUsIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRBbGwoZGF0YSkge1xuICB2YXIgZCwgaSwgbiA9IGRhdGEubGVuZ3RoLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB4eiA9IG5ldyBBcnJheShuKSxcbiAgICAgIHl6ID0gbmV3IEFycmF5KG4pLFxuICAgICAgeDAgPSBJbmZpbml0eSxcbiAgICAgIHkwID0gSW5maW5pdHksXG4gICAgICB4MSA9IC1JbmZpbml0eSxcbiAgICAgIHkxID0gLUluZmluaXR5O1xuXG4gIC8vIENvbXB1dGUgdGhlIHBvaW50cyBhbmQgdGhlaXIgZXh0ZW50LlxuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQgPSBkYXRhW2ldKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSBjb250aW51ZTtcbiAgICB4eltpXSA9IHg7XG4gICAgeXpbaV0gPSB5O1xuICAgIGlmICh4IDwgeDApIHgwID0geDtcbiAgICBpZiAoeCA+IHgxKSB4MSA9IHg7XG4gICAgaWYgKHkgPCB5MCkgeTAgPSB5O1xuICAgIGlmICh5ID4geTEpIHkxID0geTtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIHdlcmUgbm8gKHZhbGlkKSBwb2ludHMsIGFib3J0LlxuICBpZiAoeDAgPiB4MSB8fCB5MCA+IHkxKSByZXR1cm4gdGhpcztcblxuICAvLyBFeHBhbmQgdGhlIHRyZWUgdG8gY292ZXIgdGhlIG5ldyBwb2ludHMuXG4gIHRoaXMuY292ZXIoeDAsIHkwKS5jb3Zlcih4MSwgeTEpO1xuXG4gIC8vIEFkZCB0aGUgbmV3IHBvaW50cy5cbiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgIGFkZCh0aGlzLCB4eltpXSwgeXpbaV0sIGRhdGFbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICBpZiAoaXNOYU4oeCA9ICt4KSB8fCBpc05hTih5ID0gK3kpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHgwID0gdGhpcy5feDAsXG4gICAgICB5MCA9IHRoaXMuX3kwLFxuICAgICAgeDEgPSB0aGlzLl94MSxcbiAgICAgIHkxID0gdGhpcy5feTE7XG5cbiAgLy8gSWYgdGhlIHF1YWR0cmVlIGhhcyBubyBleHRlbnQsIGluaXRpYWxpemUgdGhlbS5cbiAgLy8gSW50ZWdlciBleHRlbnQgYXJlIG5lY2Vzc2FyeSBzbyB0aGF0IGlmIHdlIGxhdGVyIGRvdWJsZSB0aGUgZXh0ZW50LFxuICAvLyB0aGUgZXhpc3RpbmcgcXVhZHJhbnQgYm91bmRhcmllcyBkb25cdTIwMTl0IGNoYW5nZSBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgZXJyb3IhXG4gIGlmIChpc05hTih4MCkpIHtcbiAgICB4MSA9ICh4MCA9IE1hdGguZmxvb3IoeCkpICsgMTtcbiAgICB5MSA9ICh5MCA9IE1hdGguZmxvb3IoeSkpICsgMTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgZG91YmxlIHJlcGVhdGVkbHkgdG8gY292ZXIuXG4gIGVsc2Uge1xuICAgIHZhciB6ID0geDEgLSB4MCB8fCAxLFxuICAgICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpO1xuXG4gICAgd2hpbGUgKHgwID4geCB8fCB4ID49IHgxIHx8IHkwID4geSB8fCB5ID49IHkxKSB7XG4gICAgICBpID0gKHkgPCB5MCkgPDwgMSB8ICh4IDwgeDApO1xuICAgICAgcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50LCB6ICo9IDI7XG4gICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgY2FzZSAwOiB4MSA9IHgwICsgeiwgeTEgPSB5MCArIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDE6IHgwID0geDEgLSB6LCB5MSA9IHkwICsgejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogeDEgPSB4MCArIHosIHkwID0geTEgLSB6OyBicmVhaztcbiAgICAgICAgY2FzZSAzOiB4MCA9IHgxIC0geiwgeTAgPSB5MSAtIHo7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yb290ICYmIHRoaXMuX3Jvb3QubGVuZ3RoKSB0aGlzLl9yb290ID0gbm9kZTtcbiAgfVxuXG4gIHRoaXMuX3gwID0geDA7XG4gIHRoaXMuX3kwID0geTA7XG4gIHRoaXMuX3gxID0geDE7XG4gIHRoaXMuX3kxID0geTE7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZGF0YSA9IFtdO1xuICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyBkYXRhLnB1c2gobm9kZS5kYXRhKTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpXG4gIH0pO1xuICByZXR1cm4gZGF0YTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuY292ZXIoK19bMF1bMF0sICtfWzBdWzFdKS5jb3ZlcigrX1sxXVswXSwgK19bMV1bMV0pXG4gICAgICA6IGlzTmFOKHRoaXMuX3gwKSA/IHVuZGVmaW5lZCA6IFtbdGhpcy5feDAsIHRoaXMuX3kwXSwgW3RoaXMuX3gxLCB0aGlzLl95MV1dO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHRoaXMubm9kZSA9IG5vZGU7XG4gIHRoaXMueDAgPSB4MDtcbiAgdGhpcy55MCA9IHkwO1xuICB0aGlzLngxID0geDE7XG4gIHRoaXMueTEgPSB5MTtcbn1cbiIsICJpbXBvcnQgUXVhZCBmcm9tIFwiLi9xdWFkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykge1xuICB2YXIgZGF0YSxcbiAgICAgIHgwID0gdGhpcy5feDAsXG4gICAgICB5MCA9IHRoaXMuX3kwLFxuICAgICAgeDEsXG4gICAgICB5MSxcbiAgICAgIHgyLFxuICAgICAgeTIsXG4gICAgICB4MyA9IHRoaXMuX3gxLFxuICAgICAgeTMgPSB0aGlzLl95MSxcbiAgICAgIHF1YWRzID0gW10sXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIHEsXG4gICAgICBpO1xuXG4gIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHgwLCB5MCwgeDMsIHkzKSk7XG4gIGlmIChyYWRpdXMgPT0gbnVsbCkgcmFkaXVzID0gSW5maW5pdHk7XG4gIGVsc2Uge1xuICAgIHgwID0geCAtIHJhZGl1cywgeTAgPSB5IC0gcmFkaXVzO1xuICAgIHgzID0geCArIHJhZGl1cywgeTMgPSB5ICsgcmFkaXVzO1xuICAgIHJhZGl1cyAqPSByYWRpdXM7XG4gIH1cblxuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG5cbiAgICAvLyBTdG9wIHNlYXJjaGluZyBpZiB0aGlzIHF1YWRyYW50IGNhblx1MjAxOXQgY29udGFpbiBhIGNsb3NlciBub2RlLlxuICAgIGlmICghKG5vZGUgPSBxLm5vZGUpXG4gICAgICAgIHx8ICh4MSA9IHEueDApID4geDNcbiAgICAgICAgfHwgKHkxID0gcS55MCkgPiB5M1xuICAgICAgICB8fCAoeDIgPSBxLngxKSA8IHgwXG4gICAgICAgIHx8ICh5MiA9IHEueTEpIDwgeTApIGNvbnRpbnVlO1xuXG4gICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50LlxuICAgIGlmIChub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIHhtID0gKHgxICsgeDIpIC8gMixcbiAgICAgICAgICB5bSA9ICh5MSArIHkyKSAvIDI7XG5cbiAgICAgIHF1YWRzLnB1c2goXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVsyXSwgeDEsIHltLCB4bSwgeTIpLFxuICAgICAgICBuZXcgUXVhZChub2RlWzFdLCB4bSwgeTEsIHgyLCB5bSksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKVxuICAgICAgKTtcblxuICAgICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuXG4gICAgICBpZiAoaSA9ICh5ID49IHltKSA8PCAxIHwgKHggPj0geG0pKSB7XG4gICAgICAgIHEgPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDEgLSBpXSA9IHE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmlzaXQgdGhpcyBwb2ludC4gKFZpc2l0aW5nIGNvaW5jaWRlbnQgcG9pbnRzIGlzblx1MjAxOXQgbmVjZXNzYXJ5ISlcbiAgICBlbHNlIHtcbiAgICAgIHZhciBkeCA9IHggLSArdGhpcy5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSksXG4gICAgICAgICAgZHkgPSB5IC0gK3RoaXMuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpLFxuICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICBpZiAoZDIgPCByYWRpdXMpIHtcbiAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQocmFkaXVzID0gZDIpO1xuICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkO1xuICAgICAgICB4MyA9IHggKyBkLCB5MyA9IHkgKyBkO1xuICAgICAgICBkYXRhID0gbm9kZS5kYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGQpIHtcbiAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQpKSB8fCBpc05hTih5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKSkpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHNcblxuICB2YXIgcGFyZW50LFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICByZXRhaW5lcixcbiAgICAgIHByZXZpb3VzLFxuICAgICAgbmV4dCxcbiAgICAgIHgwID0gdGhpcy5feDAsXG4gICAgICB5MCA9IHRoaXMuX3kwLFxuICAgICAgeDEgPSB0aGlzLl94MSxcbiAgICAgIHkxID0gdGhpcy5feTEsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHhtLFxuICAgICAgeW0sXG4gICAgICByaWdodCxcbiAgICAgIGJvdHRvbSxcbiAgICAgIGksXG4gICAgICBqO1xuXG4gIC8vIElmIHRoZSB0cmVlIGlzIGVtcHR5LCBpbml0aWFsaXplIHRoZSByb290IGFzIGEgbGVhZi5cbiAgaWYgKCFub2RlKSByZXR1cm4gdGhpcztcblxuICAvLyBGaW5kIHRoZSBsZWFmIG5vZGUgZm9yIHRoZSBwb2ludC5cbiAgLy8gV2hpbGUgZGVzY2VuZGluZywgYWxzbyByZXRhaW4gdGhlIGRlZXBlc3QgcGFyZW50IHdpdGggYSBub24tcmVtb3ZlZCBzaWJsaW5nLlxuICBpZiAobm9kZS5sZW5ndGgpIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gICAgaWYgKCEocGFyZW50ID0gbm9kZSwgbm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCFub2RlLmxlbmd0aCkgYnJlYWs7XG4gICAgaWYgKHBhcmVudFsoaSArIDEpICYgM10gfHwgcGFyZW50WyhpICsgMikgJiAzXSB8fCBwYXJlbnRbKGkgKyAzKSAmIDNdKSByZXRhaW5lciA9IHBhcmVudCwgaiA9IGk7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBwb2ludCB0byByZW1vdmUuXG4gIHdoaWxlIChub2RlLmRhdGEgIT09IGQpIGlmICghKHByZXZpb3VzID0gbm9kZSwgbm9kZSA9IG5vZGUubmV4dCkpIHJldHVybiB0aGlzO1xuICBpZiAobmV4dCA9IG5vZGUubmV4dCkgZGVsZXRlIG5vZGUubmV4dDtcblxuICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29pbmNpZGVudCBwb2ludHMsIHJlbW92ZSBqdXN0IHRoZSBwb2ludC5cbiAgaWYgKHByZXZpb3VzKSByZXR1cm4gKG5leHQgPyBwcmV2aW91cy5uZXh0ID0gbmV4dCA6IGRlbGV0ZSBwcmV2aW91cy5uZXh0KSwgdGhpcztcblxuICAvLyBJZiB0aGlzIGlzIHRoZSByb290IHBvaW50LCByZW1vdmUgaXQuXG4gIGlmICghcGFyZW50KSByZXR1cm4gdGhpcy5fcm9vdCA9IG5leHQsIHRoaXM7XG5cbiAgLy8gUmVtb3ZlIHRoaXMgbGVhZi5cbiAgbmV4dCA/IHBhcmVudFtpXSA9IG5leHQgOiBkZWxldGUgcGFyZW50W2ldO1xuXG4gIC8vIElmIHRoZSBwYXJlbnQgbm93IGNvbnRhaW5zIGV4YWN0bHkgb25lIGxlYWYsIGNvbGxhcHNlIHN1cGVyZmx1b3VzIHBhcmVudHMuXG4gIGlmICgobm9kZSA9IHBhcmVudFswXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzJdIHx8IHBhcmVudFszXSlcbiAgICAgICYmIG5vZGUgPT09IChwYXJlbnRbM10gfHwgcGFyZW50WzJdIHx8IHBhcmVudFsxXSB8fCBwYXJlbnRbMF0pXG4gICAgICAmJiAhbm9kZS5sZW5ndGgpIHtcbiAgICBpZiAocmV0YWluZXIpIHJldGFpbmVyW2pdID0gbm9kZTtcbiAgICBlbHNlIHRoaXMuX3Jvb3QgPSBub2RlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBbGwoZGF0YSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IGRhdGEubGVuZ3RoOyBpIDwgbjsgKytpKSB0aGlzLnJlbW92ZShkYXRhW2ldKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9yb290O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGRvICsrc2l6ZTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpXG4gIH0pO1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsICJpbXBvcnQgUXVhZCBmcm9tIFwiLi9xdWFkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHZhciBxdWFkcyA9IFtdLCBxLCBub2RlID0gdGhpcy5fcm9vdCwgY2hpbGQsIHgwLCB5MCwgeDEsIHkxO1xuICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZChub2RlLCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpO1xuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG4gICAgaWYgKCFjYWxsYmFjayhub2RlID0gcS5ub2RlLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEpICYmIG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEsIHltKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQgUXVhZCBmcm9tIFwiLi9xdWFkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHZhciBxdWFkcyA9IFtdLCBuZXh0ID0gW10sIHE7XG4gIGlmICh0aGlzLl9yb290KSBxdWFkcy5wdXNoKG5ldyBRdWFkKHRoaXMuX3Jvb3QsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7XG4gIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHtcbiAgICB2YXIgbm9kZSA9IHEubm9kZTtcbiAgICBpZiAobm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciBjaGlsZCwgeDAgPSBxLngwLCB5MCA9IHEueTAsIHgxID0gcS54MSwgeTEgPSBxLnkxLCB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzFdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeTAsIHgxLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7XG4gICAgfVxuICAgIG5leHQucHVzaChxKTtcbiAgfVxuICB3aGlsZSAocSA9IG5leHQucG9wKCkpIHtcbiAgICBjYWxsYmFjayhxLm5vZGUsIHEueDAsIHEueTAsIHEueDEsIHEueTEpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WChkKSB7XG4gIHJldHVybiBkWzBdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRZKGQpIHtcbiAgcmV0dXJuIGRbMV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKF8pIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5feSA9IF8sIHRoaXMpIDogdGhpcy5feTtcbn1cbiIsICJpbXBvcnQgdHJlZV9hZGQsIHthZGRBbGwgYXMgdHJlZV9hZGRBbGx9IGZyb20gXCIuL2FkZC5qc1wiO1xuaW1wb3J0IHRyZWVfY292ZXIgZnJvbSBcIi4vY292ZXIuanNcIjtcbmltcG9ydCB0cmVlX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHRyZWVfZXh0ZW50IGZyb20gXCIuL2V4dGVudC5qc1wiO1xuaW1wb3J0IHRyZWVfZmluZCBmcm9tIFwiLi9maW5kLmpzXCI7XG5pbXBvcnQgdHJlZV9yZW1vdmUsIHtyZW1vdmVBbGwgYXMgdHJlZV9yZW1vdmVBbGx9IGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyZWVfcm9vdCBmcm9tIFwiLi9yb290LmpzXCI7XG5pbXBvcnQgdHJlZV9zaXplIGZyb20gXCIuL3NpemUuanNcIjtcbmltcG9ydCB0cmVlX3Zpc2l0IGZyb20gXCIuL3Zpc2l0LmpzXCI7XG5pbXBvcnQgdHJlZV92aXNpdEFmdGVyIGZyb20gXCIuL3Zpc2l0QWZ0ZXIuanNcIjtcbmltcG9ydCB0cmVlX3gsIHtkZWZhdWx0WH0gZnJvbSBcIi4veC5qc1wiO1xuaW1wb3J0IHRyZWVfeSwge2RlZmF1bHRZfSBmcm9tIFwiLi95LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1YWR0cmVlKG5vZGVzLCB4LCB5KSB7XG4gIHZhciB0cmVlID0gbmV3IFF1YWR0cmVlKHggPT0gbnVsbCA/IGRlZmF1bHRYIDogeCwgeSA9PSBudWxsID8gZGVmYXVsdFkgOiB5LCBOYU4sIE5hTiwgTmFOLCBOYU4pO1xuICByZXR1cm4gbm9kZXMgPT0gbnVsbCA/IHRyZWUgOiB0cmVlLmFkZEFsbChub2Rlcyk7XG59XG5cbmZ1bmN0aW9uIFF1YWR0cmVlKHgsIHksIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHRoaXMuX3ggPSB4O1xuICB0aGlzLl95ID0geTtcbiAgdGhpcy5feDAgPSB4MDtcbiAgdGhpcy5feTAgPSB5MDtcbiAgdGhpcy5feDEgPSB4MTtcbiAgdGhpcy5feTEgPSB5MTtcbiAgdGhpcy5fcm9vdCA9IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbGVhZl9jb3B5KGxlYWYpIHtcbiAgdmFyIGNvcHkgPSB7ZGF0YTogbGVhZi5kYXRhfSwgbmV4dCA9IGNvcHk7XG4gIHdoaWxlIChsZWFmID0gbGVhZi5uZXh0KSBuZXh0ID0gbmV4dC5uZXh0ID0ge2RhdGE6IGxlYWYuZGF0YX07XG4gIHJldHVybiBjb3B5O1xufVxuXG52YXIgdHJlZVByb3RvID0gcXVhZHRyZWUucHJvdG90eXBlID0gUXVhZHRyZWUucHJvdG90eXBlO1xuXG50cmVlUHJvdG8uY29weSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29weSA9IG5ldyBRdWFkdHJlZSh0aGlzLl94LCB0aGlzLl95LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSksXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIG5vZGVzLFxuICAgICAgY2hpbGQ7XG5cbiAgaWYgKCFub2RlKSByZXR1cm4gY29weTtcblxuICBpZiAoIW5vZGUubGVuZ3RoKSByZXR1cm4gY29weS5fcm9vdCA9IGxlYWZfY29weShub2RlKSwgY29weTtcblxuICBub2RlcyA9IFt7c291cmNlOiBub2RlLCB0YXJnZXQ6IGNvcHkuX3Jvb3QgPSBuZXcgQXJyYXkoNCl9XTtcbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlLnNvdXJjZVtpXSkge1xuICAgICAgICBpZiAoY2hpbGQubGVuZ3RoKSBub2Rlcy5wdXNoKHtzb3VyY2U6IGNoaWxkLCB0YXJnZXQ6IG5vZGUudGFyZ2V0W2ldID0gbmV3IEFycmF5KDQpfSk7XG4gICAgICAgIGVsc2Ugbm9kZS50YXJnZXRbaV0gPSBsZWFmX2NvcHkoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTtcblxudHJlZVByb3RvLmFkZCA9IHRyZWVfYWRkO1xudHJlZVByb3RvLmFkZEFsbCA9IHRyZWVfYWRkQWxsO1xudHJlZVByb3RvLmNvdmVyID0gdHJlZV9jb3ZlcjtcbnRyZWVQcm90by5kYXRhID0gdHJlZV9kYXRhO1xudHJlZVByb3RvLmV4dGVudCA9IHRyZWVfZXh0ZW50O1xudHJlZVByb3RvLmZpbmQgPSB0cmVlX2ZpbmQ7XG50cmVlUHJvdG8ucmVtb3ZlID0gdHJlZV9yZW1vdmU7XG50cmVlUHJvdG8ucmVtb3ZlQWxsID0gdHJlZV9yZW1vdmVBbGw7XG50cmVlUHJvdG8ucm9vdCA9IHRyZWVfcm9vdDtcbnRyZWVQcm90by5zaXplID0gdHJlZV9zaXplO1xudHJlZVByb3RvLnZpc2l0ID0gdHJlZV92aXNpdDtcbnRyZWVQcm90by52aXNpdEFmdGVyID0gdHJlZV92aXNpdEFmdGVyO1xudHJlZVByb3RvLnggPSB0cmVlX3g7XG50cmVlUHJvdG8ueSA9IHRyZWVfeTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYW5kb20pIHtcbiAgcmV0dXJuIChyYW5kb20oKSAtIDAuNSkgKiAxZS02O1xufVxuIiwgImltcG9ydCB7cXVhZHRyZWV9IGZyb20gXCJkMy1xdWFkdHJlZVwiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgamlnZ2xlIGZyb20gXCIuL2ppZ2dsZS5qc1wiO1xuXG5mdW5jdGlvbiB4KGQpIHtcbiAgcmV0dXJuIGQueCArIGQudng7XG59XG5cbmZ1bmN0aW9uIHkoZCkge1xuICByZXR1cm4gZC55ICsgZC52eTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocmFkaXVzKSB7XG4gIHZhciBub2RlcyxcbiAgICAgIHJhZGlpLFxuICAgICAgcmFuZG9tLFxuICAgICAgc3RyZW5ndGggPSAxLFxuICAgICAgaXRlcmF0aW9ucyA9IDE7XG5cbiAgaWYgKHR5cGVvZiByYWRpdXMgIT09IFwiZnVuY3Rpb25cIikgcmFkaXVzID0gY29uc3RhbnQocmFkaXVzID09IG51bGwgPyAxIDogK3JhZGl1cyk7XG5cbiAgZnVuY3Rpb24gZm9yY2UoKSB7XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgIHRyZWUsXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHhpLFxuICAgICAgICB5aSxcbiAgICAgICAgcmksXG4gICAgICAgIHJpMjtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7XG4gICAgICB0cmVlID0gcXVhZHRyZWUobm9kZXMsIHgsIHkpLnZpc2l0QWZ0ZXIocHJlcGFyZSk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgcmkgPSByYWRpaVtub2RlLmluZGV4XSwgcmkyID0gcmkgKiByaTtcbiAgICAgICAgeGkgPSBub2RlLnggKyBub2RlLnZ4O1xuICAgICAgICB5aSA9IG5vZGUueSArIG5vZGUudnk7XG4gICAgICAgIHRyZWUudmlzaXQoYXBwbHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5KHF1YWQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgICB2YXIgZGF0YSA9IHF1YWQuZGF0YSwgcmogPSBxdWFkLnIsIHIgPSByaSArIHJqO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuaW5kZXggPiBub2RlLmluZGV4KSB7XG4gICAgICAgICAgdmFyIHggPSB4aSAtIGRhdGEueCAtIGRhdGEudngsXG4gICAgICAgICAgICAgIHkgPSB5aSAtIGRhdGEueSAtIGRhdGEudnksXG4gICAgICAgICAgICAgIGwgPSB4ICogeCArIHkgKiB5O1xuICAgICAgICAgIGlmIChsIDwgciAqIHIpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geCAqIHg7XG4gICAgICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZShyYW5kb20pLCBsICs9IHkgKiB5O1xuICAgICAgICAgICAgbCA9IChyIC0gKGwgPSBNYXRoLnNxcnQobCkpKSAvIGwgKiBzdHJlbmd0aDtcbiAgICAgICAgICAgIG5vZGUudnggKz0gKHggKj0gbCkgKiAociA9IChyaiAqPSByaikgLyAocmkyICsgcmopKTtcbiAgICAgICAgICAgIG5vZGUudnkgKz0gKHkgKj0gbCkgKiByO1xuICAgICAgICAgICAgZGF0YS52eCAtPSB4ICogKHIgPSAxIC0gcik7XG4gICAgICAgICAgICBkYXRhLnZ5IC09IHkgKiByO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4geDAgPiB4aSArIHIgfHwgeDEgPCB4aSAtIHIgfHwgeTAgPiB5aSArIHIgfHwgeTEgPCB5aSAtIHI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZShxdWFkKSB7XG4gICAgaWYgKHF1YWQuZGF0YSkgcmV0dXJuIHF1YWQuciA9IHJhZGlpW3F1YWQuZGF0YS5pbmRleF07XG4gICAgZm9yICh2YXIgaSA9IHF1YWQuciA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgIGlmIChxdWFkW2ldICYmIHF1YWRbaV0uciA+IHF1YWQucikge1xuICAgICAgICBxdWFkLnIgPSBxdWFkW2ldLnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7XG4gICAgcmFkaWkgPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCByYWRpaVtub2RlLmluZGV4XSA9ICtyYWRpdXMobm9kZSwgaSwgbm9kZXMpO1xuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF9ub2RlcywgX3JhbmRvbSkge1xuICAgIG5vZGVzID0gX25vZGVzO1xuICAgIHJhbmRvbSA9IF9yYW5kb207XG4gICAgaW5pdGlhbGl6ZSgpO1xuICB9O1xuXG4gIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaXRlcmF0aW9ucyA9ICtfLCBmb3JjZSkgOiBpdGVyYXRpb25zO1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gK18sIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiByYWRpdXM7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwgImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGUuanNcIjtcblxuZnVuY3Rpb24gaW5kZXgoZCkge1xuICByZXR1cm4gZC5pbmRleDtcbn1cblxuZnVuY3Rpb24gZmluZChub2RlQnlJZCwgbm9kZUlkKSB7XG4gIHZhciBub2RlID0gbm9kZUJ5SWQuZ2V0KG5vZGVJZCk7XG4gIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKFwibm9kZSBub3QgZm91bmQ6IFwiICsgbm9kZUlkKTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxpbmtzKSB7XG4gIHZhciBpZCA9IGluZGV4LFxuICAgICAgc3RyZW5ndGggPSBkZWZhdWx0U3RyZW5ndGgsXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICBkaXN0YW5jZSA9IGNvbnN0YW50KDMwKSxcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIG5vZGVzLFxuICAgICAgY291bnQsXG4gICAgICBiaWFzLFxuICAgICAgcmFuZG9tLFxuICAgICAgaXRlcmF0aW9ucyA9IDE7XG5cbiAgaWYgKGxpbmtzID09IG51bGwpIGxpbmtzID0gW107XG5cbiAgZnVuY3Rpb24gZGVmYXVsdFN0cmVuZ3RoKGxpbmspIHtcbiAgICByZXR1cm4gMSAvIE1hdGgubWluKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSwgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7XG4gICAgZm9yICh2YXIgayA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGsgPCBpdGVyYXRpb25zOyArK2spIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsaW5rLCBzb3VyY2UsIHRhcmdldCwgeCwgeSwgbCwgYjsgaSA8IG47ICsraSkge1xuICAgICAgICBsaW5rID0gbGlua3NbaV0sIHNvdXJjZSA9IGxpbmsuc291cmNlLCB0YXJnZXQgPSBsaW5rLnRhcmdldDtcbiAgICAgICAgeCA9IHRhcmdldC54ICsgdGFyZ2V0LnZ4IC0gc291cmNlLnggLSBzb3VyY2UudnggfHwgamlnZ2xlKHJhbmRvbSk7XG4gICAgICAgIHkgPSB0YXJnZXQueSArIHRhcmdldC52eSAtIHNvdXJjZS55IC0gc291cmNlLnZ5IHx8IGppZ2dsZShyYW5kb20pO1xuICAgICAgICBsID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgICBsID0gKGwgLSBkaXN0YW5jZXNbaV0pIC8gbCAqIGFscGhhICogc3RyZW5ndGhzW2ldO1xuICAgICAgICB4ICo9IGwsIHkgKj0gbDtcbiAgICAgICAgdGFyZ2V0LnZ4IC09IHggKiAoYiA9IGJpYXNbaV0pO1xuICAgICAgICB0YXJnZXQudnkgLT0geSAqIGI7XG4gICAgICAgIHNvdXJjZS52eCArPSB4ICogKGIgPSAxIC0gYik7XG4gICAgICAgIHNvdXJjZS52eSArPSB5ICogYjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIHZhciBpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBtID0gbGlua3MubGVuZ3RoLFxuICAgICAgICBub2RlQnlJZCA9IG5ldyBNYXAobm9kZXMubWFwKChkLCBpKSA9PiBbaWQoZCwgaSwgbm9kZXMpLCBkXSkpLFxuICAgICAgICBsaW5rO1xuXG4gICAgZm9yIChpID0gMCwgY291bnQgPSBuZXcgQXJyYXkobik7IGkgPCBtOyArK2kpIHtcbiAgICAgIGxpbmsgPSBsaW5rc1tpXSwgbGluay5pbmRleCA9IGk7XG4gICAgICBpZiAodHlwZW9mIGxpbmsuc291cmNlICE9PSBcIm9iamVjdFwiKSBsaW5rLnNvdXJjZSA9IGZpbmQobm9kZUJ5SWQsIGxpbmsuc291cmNlKTtcbiAgICAgIGlmICh0eXBlb2YgbGluay50YXJnZXQgIT09IFwib2JqZWN0XCIpIGxpbmsudGFyZ2V0ID0gZmluZChub2RlQnlJZCwgbGluay50YXJnZXQpO1xuICAgICAgY291bnRbbGluay5zb3VyY2UuaW5kZXhdID0gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSB8fCAwKSArIDE7XG4gICAgICBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0gPSAoY291bnRbbGluay50YXJnZXQuaW5kZXhdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBiaWFzID0gbmV3IEFycmF5KG0pOyBpIDwgbTsgKytpKSB7XG4gICAgICBsaW5rID0gbGlua3NbaV0sIGJpYXNbaV0gPSBjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gLyAoY291bnRbbGluay5zb3VyY2UuaW5kZXhdICsgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTtcbiAgICB9XG5cbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVTdHJlbmd0aCgpO1xuICAgIGRpc3RhbmNlcyA9IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplU3RyZW5ndGgoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHN0cmVuZ3Roc1tpXSA9ICtzdHJlbmd0aChsaW5rc1tpXSwgaSwgbGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVEaXN0YW5jZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgZGlzdGFuY2VzW2ldID0gK2Rpc3RhbmNlKGxpbmtzW2ldLCBpLCBsaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF9ub2RlcywgX3JhbmRvbSkge1xuICAgIG5vZGVzID0gX25vZGVzO1xuICAgIHJhbmRvbSA9IF9yYW5kb207XG4gICAgaW5pdGlhbGl6ZSgpO1xuICB9O1xuXG4gIGZvcmNlLmxpbmtzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmtzID0gXywgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBsaW5rcztcbiAgfTtcblxuICBmb3JjZS5pZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IF8sIGZvcmNlKSA6IGlkO1xuICB9O1xuXG4gIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaXRlcmF0aW9ucyA9ICtfLCBmb3JjZSkgOiBpdGVyYXRpb25zO1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemVTdHJlbmd0aCgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplRGlzdGFuY2UoKSwgZm9yY2UpIDogZGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwgIi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpbmVhcl9jb25ncnVlbnRpYWxfZ2VuZXJhdG9yI1BhcmFtZXRlcnNfaW5fY29tbW9uX3VzZVxuY29uc3QgYSA9IDE2NjQ1MjU7XG5jb25zdCBjID0gMTAxMzkwNDIyMztcbmNvbnN0IG0gPSA0Mjk0OTY3Mjk2OyAvLyAyXjMyXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgcyA9IDE7XG4gIHJldHVybiAoKSA9PiAocyA9IChhICogcyArIGMpICUgbSkgLyBtO1xufVxuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lcn0gZnJvbSBcImQzLXRpbWVyXCI7XG5pbXBvcnQgbGNnIGZyb20gXCIuL2xjZy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24geChkKSB7XG4gIHJldHVybiBkLng7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5KGQpIHtcbiAgcmV0dXJuIGQueTtcbn1cblxudmFyIGluaXRpYWxSYWRpdXMgPSAxMCxcbiAgICBpbml0aWFsQW5nbGUgPSBNYXRoLlBJICogKDMgLSBNYXRoLnNxcnQoNSkpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2Rlcykge1xuICB2YXIgc2ltdWxhdGlvbixcbiAgICAgIGFscGhhID0gMSxcbiAgICAgIGFscGhhTWluID0gMC4wMDEsXG4gICAgICBhbHBoYURlY2F5ID0gMSAtIE1hdGgucG93KGFscGhhTWluLCAxIC8gMzAwKSxcbiAgICAgIGFscGhhVGFyZ2V0ID0gMCxcbiAgICAgIHZlbG9jaXR5RGVjYXkgPSAwLjYsXG4gICAgICBmb3JjZXMgPSBuZXcgTWFwKCksXG4gICAgICBzdGVwcGVyID0gdGltZXIoc3RlcCksXG4gICAgICBldmVudCA9IGRpc3BhdGNoKFwidGlja1wiLCBcImVuZFwiKSxcbiAgICAgIHJhbmRvbSA9IGxjZygpO1xuXG4gIGlmIChub2RlcyA9PSBudWxsKSBub2RlcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIHN0ZXAoKSB7XG4gICAgdGljaygpO1xuICAgIGV2ZW50LmNhbGwoXCJ0aWNrXCIsIHNpbXVsYXRpb24pO1xuICAgIGlmIChhbHBoYSA8IGFscGhhTWluKSB7XG4gICAgICBzdGVwcGVyLnN0b3AoKTtcbiAgICAgIGV2ZW50LmNhbGwoXCJlbmRcIiwgc2ltdWxhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGljayhpdGVyYXRpb25zKSB7XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7XG5cbiAgICBpZiAoaXRlcmF0aW9ucyA9PT0gdW5kZWZpbmVkKSBpdGVyYXRpb25zID0gMTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7XG4gICAgICBhbHBoYSArPSAoYWxwaGFUYXJnZXQgLSBhbHBoYSkgKiBhbHBoYURlY2F5O1xuXG4gICAgICBmb3JjZXMuZm9yRWFjaChmdW5jdGlvbihmb3JjZSkge1xuICAgICAgICBmb3JjZShhbHBoYSk7XG4gICAgICB9KTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLmZ4ID09IG51bGwpIG5vZGUueCArPSBub2RlLnZ4ICo9IHZlbG9jaXR5RGVjYXk7XG4gICAgICAgIGVsc2Ugbm9kZS54ID0gbm9kZS5meCwgbm9kZS52eCA9IDA7XG4gICAgICAgIGlmIChub2RlLmZ5ID09IG51bGwpIG5vZGUueSArPSBub2RlLnZ5ICo9IHZlbG9jaXR5RGVjYXk7XG4gICAgICAgIGVsc2Ugbm9kZS55ID0gbm9kZS5meSwgbm9kZS52eSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpbXVsYXRpb247XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplTm9kZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS5pbmRleCA9IGk7XG4gICAgICBpZiAobm9kZS5meCAhPSBudWxsKSBub2RlLnggPSBub2RlLmZ4O1xuICAgICAgaWYgKG5vZGUuZnkgIT0gbnVsbCkgbm9kZS55ID0gbm9kZS5meTtcbiAgICAgIGlmIChpc05hTihub2RlLngpIHx8IGlzTmFOKG5vZGUueSkpIHtcbiAgICAgICAgdmFyIHJhZGl1cyA9IGluaXRpYWxSYWRpdXMgKiBNYXRoLnNxcnQoMC41ICsgaSksIGFuZ2xlID0gaSAqIGluaXRpYWxBbmdsZTtcbiAgICAgICAgbm9kZS54ID0gcmFkaXVzICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICBub2RlLnkgPSByYWRpdXMgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNOYU4obm9kZS52eCkgfHwgaXNOYU4obm9kZS52eSkpIHtcbiAgICAgICAgbm9kZS52eCA9IG5vZGUudnkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSkge1xuICAgIGlmIChmb3JjZS5pbml0aWFsaXplKSBmb3JjZS5pbml0aWFsaXplKG5vZGVzLCByYW5kb20pO1xuICAgIHJldHVybiBmb3JjZTtcbiAgfVxuXG4gIGluaXRpYWxpemVOb2RlcygpO1xuXG4gIHJldHVybiBzaW11bGF0aW9uID0ge1xuICAgIHRpY2s6IHRpY2ssXG5cbiAgICByZXN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGVwcGVyLnJlc3RhcnQoc3RlcCksIHNpbXVsYXRpb247XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHN0ZXBwZXIuc3RvcCgpLCBzaW11bGF0aW9uO1xuICAgIH0sXG5cbiAgICBub2RlczogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZXMgPSBfLCBpbml0aWFsaXplTm9kZXMoKSwgZm9yY2VzLmZvckVhY2goaW5pdGlhbGl6ZUZvcmNlKSwgc2ltdWxhdGlvbikgOiBub2RlcztcbiAgICB9LFxuXG4gICAgYWxwaGE6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhID0gK18sIHNpbXVsYXRpb24pIDogYWxwaGE7XG4gICAgfSxcblxuICAgIGFscGhhTWluOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYU1pbiA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhTWluO1xuICAgIH0sXG5cbiAgICBhbHBoYURlY2F5OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYURlY2F5ID0gK18sIHNpbXVsYXRpb24pIDogK2FscGhhRGVjYXk7XG4gICAgfSxcblxuICAgIGFscGhhVGFyZ2V0OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYVRhcmdldCA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhVGFyZ2V0O1xuICAgIH0sXG5cbiAgICB2ZWxvY2l0eURlY2F5OiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2ZWxvY2l0eURlY2F5ID0gMSAtIF8sIHNpbXVsYXRpb24pIDogMSAtIHZlbG9jaXR5RGVjYXk7XG4gICAgfSxcblxuICAgIHJhbmRvbVNvdXJjZTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZG9tID0gXywgZm9yY2VzLmZvckVhY2goaW5pdGlhbGl6ZUZvcmNlKSwgc2ltdWxhdGlvbikgOiByYW5kb207XG4gICAgfSxcblxuICAgIGZvcmNlOiBmdW5jdGlvbihuYW1lLCBfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoKF8gPT0gbnVsbCA/IGZvcmNlcy5kZWxldGUobmFtZSkgOiBmb3JjZXMuc2V0KG5hbWUsIGluaXRpYWxpemVGb3JjZShfKSkpLCBzaW11bGF0aW9uKSA6IGZvcmNlcy5nZXQobmFtZSk7XG4gICAgfSxcblxuICAgIGZpbmQ6IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykge1xuICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgICAgZHgsXG4gICAgICAgICAgZHksXG4gICAgICAgICAgZDIsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBjbG9zZXN0O1xuXG4gICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5O1xuICAgICAgZWxzZSByYWRpdXMgKj0gcmFkaXVzO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgZHggPSB4IC0gbm9kZS54O1xuICAgICAgICBkeSA9IHkgLSBub2RlLnk7XG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgIGlmIChkMiA8IHJhZGl1cykgY2xvc2VzdCA9IG5vZGUsIHJhZGl1cyA9IGQyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xvc2VzdDtcbiAgICB9LFxuXG4gICAgb246IGZ1bmN0aW9uKG5hbWUsIF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1lKTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHtxdWFkdHJlZX0gZnJvbSBcImQzLXF1YWR0cmVlXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5pbXBvcnQge3gsIHl9IGZyb20gXCIuL3NpbXVsYXRpb24uanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlcyxcbiAgICAgIG5vZGUsXG4gICAgICByYW5kb20sXG4gICAgICBhbHBoYSxcbiAgICAgIHN0cmVuZ3RoID0gY29uc3RhbnQoLTMwKSxcbiAgICAgIHN0cmVuZ3RocyxcbiAgICAgIGRpc3RhbmNlTWluMiA9IDEsXG4gICAgICBkaXN0YW5jZU1heDIgPSBJbmZpbml0eSxcbiAgICAgIHRoZXRhMiA9IDAuODE7XG5cbiAgZnVuY3Rpb24gZm9yY2UoXykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCB0cmVlID0gcXVhZHRyZWUobm9kZXMsIHgsIHkpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7XG4gICAgZm9yIChhbHBoYSA9IF8sIGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHRyZWUudmlzaXQoYXBwbHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7XG4gICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgc3RyZW5ndGhzW25vZGUuaW5kZXhdID0gK3N0cmVuZ3RoKG5vZGUsIGksIG5vZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY3VtdWxhdGUocXVhZCkge1xuICAgIHZhciBzdHJlbmd0aCA9IDAsIHEsIGMsIHdlaWdodCA9IDAsIHgsIHksIGk7XG5cbiAgICAvLyBGb3IgaW50ZXJuYWwgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY2hpbGQgcXVhZHJhbnRzLlxuICAgIGlmIChxdWFkLmxlbmd0aCkge1xuICAgICAgZm9yICh4ID0geSA9IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgIGlmICgocSA9IHF1YWRbaV0pICYmIChjID0gTWF0aC5hYnMocS52YWx1ZSkpKSB7XG4gICAgICAgICAgc3RyZW5ndGggKz0gcS52YWx1ZSwgd2VpZ2h0ICs9IGMsIHggKz0gYyAqIHEueCwgeSArPSBjICogcS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWFkLnggPSB4IC8gd2VpZ2h0O1xuICAgICAgcXVhZC55ID0geSAvIHdlaWdodDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbGVhZiBub2RlcywgYWNjdW11bGF0ZSBmb3JjZXMgZnJvbSBjb2luY2lkZW50IHF1YWRyYW50cy5cbiAgICBlbHNlIHtcbiAgICAgIHEgPSBxdWFkO1xuICAgICAgcS54ID0gcS5kYXRhLng7XG4gICAgICBxLnkgPSBxLmRhdGEueTtcbiAgICAgIGRvIHN0cmVuZ3RoICs9IHN0cmVuZ3Roc1txLmRhdGEuaW5kZXhdO1xuICAgICAgd2hpbGUgKHEgPSBxLm5leHQpO1xuICAgIH1cblxuICAgIHF1YWQudmFsdWUgPSBzdHJlbmd0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5KHF1YWQsIHgxLCBfLCB4Mikge1xuICAgIGlmICghcXVhZC52YWx1ZSkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgeCA9IHF1YWQueCAtIG5vZGUueCxcbiAgICAgICAgeSA9IHF1YWQueSAtIG5vZGUueSxcbiAgICAgICAgdyA9IHgyIC0geDEsXG4gICAgICAgIGwgPSB4ICogeCArIHkgKiB5O1xuXG4gICAgLy8gQXBwbHkgdGhlIEJhcm5lcy1IdXQgYXBwcm94aW1hdGlvbiBpZiBwb3NzaWJsZS5cbiAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC5cbiAgICBpZiAodyAqIHcgLyB0aGV0YTIgPCBsKSB7XG4gICAgICBpZiAobCA8IGRpc3RhbmNlTWF4Mikge1xuICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZShyYW5kb20pLCBsICs9IHkgKiB5O1xuICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTtcbiAgICAgICAgbm9kZS52eCArPSB4ICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDtcbiAgICAgICAgbm9kZS52eSArPSB5ICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgcHJvY2VzcyBwb2ludHMgZGlyZWN0bHkuXG4gICAgZWxzZSBpZiAocXVhZC5sZW5ndGggfHwgbCA+PSBkaXN0YW5jZU1heDIpIHJldHVybjtcblxuICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBjbG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LlxuICAgIGlmIChxdWFkLmRhdGEgIT09IG5vZGUgfHwgcXVhZC5uZXh0KSB7XG4gICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgIGlmIChsIDwgZGlzdGFuY2VNaW4yKSBsID0gTWF0aC5zcXJ0KGRpc3RhbmNlTWluMiAqIGwpO1xuICAgIH1cblxuICAgIGRvIGlmIChxdWFkLmRhdGEgIT09IG5vZGUpIHtcbiAgICAgIHcgPSBzdHJlbmd0aHNbcXVhZC5kYXRhLmluZGV4XSAqIGFscGhhIC8gbDtcbiAgICAgIG5vZGUudnggKz0geCAqIHc7XG4gICAgICBub2RlLnZ5ICs9IHkgKiB3O1xuICAgIH0gd2hpbGUgKHF1YWQgPSBxdWFkLm5leHQpO1xuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF9ub2RlcywgX3JhbmRvbSkge1xuICAgIG5vZGVzID0gX25vZGVzO1xuICAgIHJhbmRvbSA9IF9yYW5kb207XG4gICAgaW5pdGlhbGl6ZSgpO1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2VNaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNaW4yID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1pbjIpO1xuICB9O1xuXG4gIGZvcmNlLmRpc3RhbmNlTWF4ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlTWF4MiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQoZGlzdGFuY2VNYXgyKTtcbiAgfTtcblxuICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGV0YTIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KHRoZXRhMik7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE1hdGguYWJzKHggPSBNYXRoLnJvdW5kKHgpKSA+PSAxZTIxXG4gICAgICA/IHgudG9Mb2NhbGVTdHJpbmcoXCJlblwiKS5yZXBsYWNlKC8sL2csIFwiXCIpXG4gICAgICA6IHgudG9TdHJpbmcoMTApO1xufVxuXG4vLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoXG4vLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC5cbi8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsUGFydHMoMS4yMykgcmV0dXJucyBbXCIxMjNcIiwgMF0uXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGVjaW1hbFBhcnRzKHgsIHApIHtcbiAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKFwiZVwiKSkgPCAwKSByZXR1cm4gbnVsbDsgLy8gTmFOLCBcdTAwQjFJbmZpbml0eVxuICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpO1xuXG4gIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxcZFxcLlxcZCtlWy0rXVxcZCtcbiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXFxkZVstK11cXGQrIChlLmcuLCAxZSszKS5cbiAgcmV0dXJuIFtcbiAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LFxuICAgICt4LnNsaWNlKGkgKyAxKVxuICBdO1xufVxuIiwgImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsUGFydHMoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCxcbiAgICAgICAgdCA9IFtdLFxuICAgICAgICBqID0gMCxcbiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLFxuICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XG4gICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpO1xuICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xuICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG51bWVyYWxzKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gbnVtZXJhbHNbK2ldO1xuICAgIH0pO1xuICB9O1xufVxuIiwgIi8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bc3ltYm9sXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bfl1bdHlwZV1cbnZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcXC0oIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuXFxkKyk/KH4pPyhbYS16JV0pPyQvaTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikge1xuICBpZiAoIShtYXRjaCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0OiBcIiArIHNwZWNpZmllcik7XG4gIHZhciBtYXRjaDtcbiAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIoe1xuICAgIGZpbGw6IG1hdGNoWzFdLFxuICAgIGFsaWduOiBtYXRjaFsyXSxcbiAgICBzaWduOiBtYXRjaFszXSxcbiAgICBzeW1ib2w6IG1hdGNoWzRdLFxuICAgIHplcm86IG1hdGNoWzVdLFxuICAgIHdpZHRoOiBtYXRjaFs2XSxcbiAgICBjb21tYTogbWF0Y2hbN10sXG4gICAgcHJlY2lzaW9uOiBtYXRjaFs4XSAmJiBtYXRjaFs4XS5zbGljZSgxKSxcbiAgICB0cmltOiBtYXRjaFs5XSxcbiAgICB0eXBlOiBtYXRjaFsxMF1cbiAgfSk7XG59XG5cbmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mXG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7XG4gIHRoaXMuZmlsbCA9IHNwZWNpZmllci5maWxsID09PSB1bmRlZmluZWQgPyBcIiBcIiA6IHNwZWNpZmllci5maWxsICsgXCJcIjtcbiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9PT0gdW5kZWZpbmVkID8gXCI+XCIgOiBzcGVjaWZpZXIuYWxpZ24gKyBcIlwiO1xuICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gXCItXCIgOiBzcGVjaWZpZXIuc2lnbiArIFwiXCI7XG4gIHRoaXMuc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IHNwZWNpZmllci5zeW1ib2wgKyBcIlwiO1xuICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvO1xuICB0aGlzLndpZHRoID0gc3BlY2lmaWVyLndpZHRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLndpZHRoO1xuICB0aGlzLmNvbW1hID0gISFzcGVjaWZpZXIuY29tbWE7XG4gIHRoaXMucHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci5wcmVjaXNpb247XG4gIHRoaXMudHJpbSA9ICEhc3BlY2lmaWVyLnRyaW07XG4gIHRoaXMudHlwZSA9IHNwZWNpZmllci50eXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogc3BlY2lmaWVyLnR5cGUgKyBcIlwiO1xufVxuXG5Gb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmZpbGxcbiAgICAgICsgdGhpcy5hbGlnblxuICAgICAgKyB0aGlzLnNpZ25cbiAgICAgICsgdGhpcy5zeW1ib2xcbiAgICAgICsgKHRoaXMuemVybyA/IFwiMFwiIDogXCJcIilcbiAgICAgICsgKHRoaXMud2lkdGggPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpXG4gICAgICArICh0aGlzLmNvbW1hID8gXCIsXCIgOiBcIlwiKVxuICAgICAgKyAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIi5cIiArIE1hdGgubWF4KDAsIHRoaXMucHJlY2lzaW9uIHwgMCkpXG4gICAgICArICh0aGlzLnRyaW0gPyBcIn5cIiA6IFwiXCIpXG4gICAgICArIHRoaXMudHlwZTtcbn07XG4iLCAiLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFjZXMgMS4yMDAwayB3aXRoIDEuMmsuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzKSB7XG4gIG91dDogZm9yICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHtcbiAgICBzd2l0Y2ggKHNbaV0pIHtcbiAgICAgIGNhc2UgXCIuXCI6IGkwID0gaTEgPSBpOyBicmVhaztcbiAgICAgIGNhc2UgXCIwXCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogaWYgKCErc1tpXSkgYnJlYWsgb3V0OyBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaTAgPiAwID8gcy5zbGljZSgwLCBpMCkgKyBzLnNsaWNlKGkxICsgMSkgOiBzO1xufVxuIiwgImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCB2YXIgcHJlZml4RXhwb25lbnQ7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdLFxuICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLFxuICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDtcbiAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudFxuICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbihcIjBcIilcbiAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArIFwiLlwiICsgY29lZmZpY2llbnQuc2xpY2UoaSlcbiAgICAgIDogXCIwLlwiICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKFwiMFwiKSArIGZvcm1hdERlY2ltYWxQYXJ0cyh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IVxufVxuIiwgImltcG9ydCB7Zm9ybWF0RGVjaW1hbFBhcnRzfSBmcm9tIFwiLi9mb3JtYXREZWNpbWFsLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHApIHtcbiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsUGFydHMoeCwgcCk7XG4gIGlmICghZCkgcmV0dXJuIHggKyBcIlwiO1xuICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLFxuICAgICAgZXhwb25lbnQgPSBkWzFdO1xuICByZXR1cm4gZXhwb25lbnQgPCAwID8gXCIwLlwiICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbihcIjBcIikgKyBjb2VmZmljaWVudFxuICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgXCIuXCIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpXG4gICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbihcIjBcIik7XG59XG4iLCAiaW1wb3J0IGZvcm1hdERlY2ltYWwgZnJvbSBcIi4vZm9ybWF0RGVjaW1hbC5qc1wiO1xuaW1wb3J0IGZvcm1hdFByZWZpeEF1dG8gZnJvbSBcIi4vZm9ybWF0UHJlZml4QXV0by5qc1wiO1xuaW1wb3J0IGZvcm1hdFJvdW5kZWQgZnJvbSBcIi4vZm9ybWF0Um91bmRlZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFwiJVwiOiAoeCwgcCkgPT4gKHggKiAxMDApLnRvRml4ZWQocCksXG4gIFwiYlwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKSxcbiAgXCJjXCI6ICh4KSA9PiB4ICsgXCJcIixcbiAgXCJkXCI6IGZvcm1hdERlY2ltYWwsXG4gIFwiZVwiOiAoeCwgcCkgPT4geC50b0V4cG9uZW50aWFsKHApLFxuICBcImZcIjogKHgsIHApID0+IHgudG9GaXhlZChwKSxcbiAgXCJnXCI6ICh4LCBwKSA9PiB4LnRvUHJlY2lzaW9uKHApLFxuICBcIm9cIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCksXG4gIFwicFwiOiAoeCwgcCkgPT4gZm9ybWF0Um91bmRlZCh4ICogMTAwLCBwKSxcbiAgXCJyXCI6IGZvcm1hdFJvdW5kZWQsXG4gIFwic1wiOiBmb3JtYXRQcmVmaXhBdXRvLFxuICBcIlhcIjogKHgpID0+IE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksXG4gIFwieFwiOiAoeCkgPT4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNilcbn07XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn1cbiIsICJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcbmltcG9ydCBmb3JtYXRHcm91cCBmcm9tIFwiLi9mb3JtYXRHcm91cC5qc1wiO1xuaW1wb3J0IGZvcm1hdE51bWVyYWxzIGZyb20gXCIuL2Zvcm1hdE51bWVyYWxzLmpzXCI7XG5pbXBvcnQgZm9ybWF0U3BlY2lmaWVyIGZyb20gXCIuL2Zvcm1hdFNwZWNpZmllci5qc1wiO1xuaW1wb3J0IGZvcm1hdFRyaW0gZnJvbSBcIi4vZm9ybWF0VHJpbS5qc1wiO1xuaW1wb3J0IGZvcm1hdFR5cGVzIGZyb20gXCIuL2Zvcm1hdFR5cGVzLmpzXCI7XG5pbXBvcnQge3ByZWZpeEV4cG9uZW50fSBmcm9tIFwiLi9mb3JtYXRQcmVmaXhBdXRvLmpzXCI7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcblxudmFyIG1hcCA9IEFycmF5LnByb3RvdHlwZS5tYXAsXG4gICAgcHJlZml4ZXMgPSBbXCJ5XCIsXCJ6XCIsXCJhXCIsXCJmXCIsXCJwXCIsXCJuXCIsXCJcdTAwQjVcIixcIm1cIixcIlwiLFwia1wiLFwiTVwiLFwiR1wiLFwiVFwiLFwiUFwiLFwiRVwiLFwiWlwiLFwiWVwiXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyA9PT0gdW5kZWZpbmVkIHx8IGxvY2FsZS50aG91c2FuZHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0R3JvdXAobWFwLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgXCJcIiksXG4gICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArIFwiXCIsXG4gICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArIFwiXCIsXG4gICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/IFwiLlwiIDogbG9jYWxlLmRlY2ltYWwgKyBcIlwiLFxuICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5IDogZm9ybWF0TnVtZXJhbHMobWFwLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSxcbiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCA9PT0gdW5kZWZpbmVkID8gXCIlXCIgOiBsb2NhbGUucGVyY2VudCArIFwiXCIsXG4gICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gXCJcdTIyMTJcIiA6IGxvY2FsZS5taW51cyArIFwiXCIsXG4gICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyBcIk5hTlwiIDogbG9jYWxlLm5hbiArIFwiXCI7XG5cbiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikge1xuICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpO1xuXG4gICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCxcbiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sXG4gICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbixcbiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCxcbiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLFxuICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCxcbiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsXG4gICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sXG4gICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSxcbiAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlO1xuXG4gICAgLy8gVGhlIFwiblwiIHR5cGUgaXMgYW4gYWxpYXMgZm9yIFwiLGdcIi5cbiAgICBpZiAodHlwZSA9PT0gXCJuXCIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gVGhlIFwiXCIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciBcIi4xMn5nXCIuXG4gICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9IFwiZ1wiO1xuXG4gICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuXG4gICAgaWYgKHplcm8gfHwgKGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikpIHplcm8gPSB0cnVlLCBmaWxsID0gXCIwXCIsIGFsaWduID0gXCI9XCI7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC5cbiAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC5cbiAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSBcIiRcIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSBcIiNcIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gXCIwXCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiBcIlwiLFxuICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09IFwiJFwiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiBcIlwiO1xuXG4gICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT9cbiAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT9cbiAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uP1xuICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sXG4gICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS5cbiAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uXG4gICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLlxuICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNlxuICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSlcbiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHtcbiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCxcbiAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCxcbiAgICAgICAgICBpLCBuLCBjO1xuXG4gICAgICBpZiAodHlwZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4O1xuICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHNpZ24uIC0wIGlzIG5vdCBsZXNzIHRoYW4gMCwgYnV0IDEgLyAtMCBpcyFcbiAgICAgICAgdmFyIHZhbHVlTmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDtcblxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuXG4gICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7XG5cbiAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLlxuICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTtcblxuICAgICAgICAvLyBJZiBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyB0byB6ZXJvIGFmdGVyIGZvcm1hdHRpbmcsIGFuZCBubyBleHBsaWNpdCBwb3NpdGl2ZSBzaWduIGlzIHJlcXVlc3RlZCwgaGlkZSB0aGUgc2lnbi5cbiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3ZhbHVlID09PSAwICYmIHNpZ24gIT09IFwiK1wiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguXG4gICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gXCIoXCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gXCItXCIgfHwgc2lnbiA9PT0gXCIoXCIgPyBcIlwiIDogc2lnbikgKyB2YWx1ZVByZWZpeDtcbiAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gXCJzXCIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6IFwiXCIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSBcIihcIiA/IFwiKVwiIDogXCJcIik7XG5cbiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIFx1MjAxQ3ZhbHVlXHUyMDFEIHBhcnQgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwgXHUyMDFDc3VmZml4XHUyMDFEIHBhcnQgdGhhdCBpcyBub3QuXG4gICAgICAgIGlmIChtYXliZVN1ZmZpeCkge1xuICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7XG4gICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCBcIjBcIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy5cbiAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpO1xuXG4gICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLlxuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCxcbiAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcblxuICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIFwiMFwiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuXG4gICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSBcIlwiO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC5cbiAgICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgICAgY2FzZSBcIjxcIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHZhbHVlICsgdmFsdWVTdWZmaXggKyBwYWRkaW5nOyBicmVhaztcbiAgICAgICAgY2FzZSBcIj1cIjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgICAgY2FzZSBcIl5cIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZXIgKyBcIlwiO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHtcbiAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gXCJmXCIsIHNwZWNpZmllcikpLFxuICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsXG4gICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLFxuICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdO1xuICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCxcbiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeFxuICB9O1xufVxuIiwgImltcG9ydCBmb3JtYXRMb2NhbGUgZnJvbSBcIi4vbG9jYWxlLmpzXCI7XG5cbnZhciBsb2NhbGU7XG5leHBvcnQgdmFyIGZvcm1hdDtcbmV4cG9ydCB2YXIgZm9ybWF0UHJlZml4O1xuXG5kZWZhdWx0TG9jYWxlKHtcbiAgdGhvdXNhbmRzOiBcIixcIixcbiAgZ3JvdXBpbmc6IFszXSxcbiAgY3VycmVuY3k6IFtcIiRcIiwgXCJcIl1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHtcbiAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pO1xuICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0O1xuICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4O1xuICByZXR1cm4gbG9jYWxlO1xufVxuIiwgImltcG9ydCBleHBvbmVudCBmcm9tIFwiLi9leHBvbmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzdGVwKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCAtZXhwb25lbnQoTWF0aC5hYnMoc3RlcCkpKTtcbn1cbiIsICJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCwgdmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50KHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQoTWF0aC5hYnMoc3RlcCkpKTtcbn1cbiIsICJpbXBvcnQgZXhwb25lbnQgZnJvbSBcIi4vZXhwb25lbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc3RlcCwgbWF4KSB7XG4gIHN0ZXAgPSBNYXRoLmFicyhzdGVwKSwgbWF4ID0gTWF0aC5hYnMobWF4KSAtIHN0ZXA7XG4gIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudChtYXgpIC0gZXhwb25lbnQoc3RlcCkpICsgMTtcbn1cbiIsICJmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7XG4gIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjtcbn1cblxuZnVuY3Rpb24gbWVhblgoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShtZWFuWFJlZHVjZSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIG1lYW5YUmVkdWNlKHgsIGMpIHtcbiAgcmV0dXJuIHggKyBjLng7XG59XG5cbmZ1bmN0aW9uIG1heFkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIDEgKyBjaGlsZHJlbi5yZWR1Y2UobWF4WVJlZHVjZSwgMCk7XG59XG5cbmZ1bmN0aW9uIG1heFlSZWR1Y2UoeSwgYykge1xuICByZXR1cm4gTWF0aC5tYXgoeSwgYy55KTtcbn1cblxuZnVuY3Rpb24gbGVhZkxlZnQobm9kZSkge1xuICB2YXIgY2hpbGRyZW47XG4gIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlblswXTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGxlYWZSaWdodChub2RlKSB7XG4gIHZhciBjaGlsZHJlbjtcbiAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gbm9kZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24sXG4gICAgICBkeCA9IDEsXG4gICAgICBkeSA9IDEsXG4gICAgICBub2RlU2l6ZSA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGNsdXN0ZXIocm9vdCkge1xuICAgIHZhciBwcmV2aW91c05vZGUsXG4gICAgICAgIHggPSAwO1xuXG4gICAgLy8gRmlyc3Qgd2FsaywgY29tcHV0aW5nIHRoZSBpbml0aWFsIHggJiB5IHZhbHVlcy5cbiAgICByb290LmVhY2hBZnRlcihmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIG5vZGUueCA9IG1lYW5YKGNoaWxkcmVuKTtcbiAgICAgICAgbm9kZS55ID0gbWF4WShjaGlsZHJlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnggPSBwcmV2aW91c05vZGUgPyB4ICs9IHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNOb2RlKSA6IDA7XG4gICAgICAgIG5vZGUueSA9IDA7XG4gICAgICAgIHByZXZpb3VzTm9kZSA9IG5vZGU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbGVmdCA9IGxlYWZMZWZ0KHJvb3QpLFxuICAgICAgICByaWdodCA9IGxlYWZSaWdodChyb290KSxcbiAgICAgICAgeDAgPSBsZWZ0LnggLSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsXG4gICAgICAgIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMjtcblxuICAgIC8vIFNlY29uZCB3YWxrLCBub3JtYWxpemluZyB4ICYgeSB0byB0aGUgZGVzaXJlZCBzaXplLlxuICAgIHJldHVybiByb290LmVhY2hBZnRlcihub2RlU2l6ZSA/IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIG5vZGUueCA9IChub2RlLnggLSByb290LngpICogZHg7XG4gICAgICBub2RlLnkgPSAocm9vdC55IC0gbm9kZS55KSAqIGR5O1xuICAgIH0gOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogZHg7XG4gICAgICBub2RlLnkgPSAoMSAtIChyb290LnkgPyBub2RlLnkgLyByb290LnkgOiAxKSkgKiBkeTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsdXN0ZXIuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZXBhcmF0aW9uID0geCwgY2x1c3RlcikgOiBzZXBhcmF0aW9uO1xuICB9O1xuXG4gIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7XG4gIH07XG5cbiAgY2x1c3Rlci5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTtcbiAgfTtcblxuICByZXR1cm4gY2x1c3Rlcjtcbn1cbiIsICJmdW5jdGlvbiBjb3VudChub2RlKSB7XG4gIHZhciBzdW0gPSAwLFxuICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLFxuICAgICAgaSA9IGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKCFpKSBzdW0gPSAxO1xuICBlbHNlIHdoaWxlICgtLWkgPj0gMCkgc3VtICs9IGNoaWxkcmVuW2ldLnZhbHVlO1xuICBub2RlLnZhbHVlID0gc3VtO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGNvdW50KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgdGhhdCkge1xuICBsZXQgaW5kZXggPSAtMTtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpIHtcbiAgICBjYWxsYmFjay5jYWxsKHRoYXQsIG5vZGUsICsraW5kZXgsIHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGF0KSB7XG4gIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBpbmRleCA9IC0xO1xuICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7XG4gICAgY2FsbGJhY2suY2FsbCh0aGF0LCBub2RlLCArK2luZGV4LCB0aGlzKTtcbiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIHRoYXQpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXSwgbmV4dCA9IFtdLCBjaGlsZHJlbiwgaSwgbiwgaW5kZXggPSAtMTtcbiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkge1xuICAgIG5leHQucHVzaChub2RlKTtcbiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB3aGlsZSAobm9kZSA9IG5leHQucG9wKCkpIHtcbiAgICBjYWxsYmFjay5jYWxsKHRoYXQsIG5vZGUsICsraW5kZXgsIHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGF0KSB7XG4gIGxldCBpbmRleCA9IC0xO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykge1xuICAgIGlmIChjYWxsYmFjay5jYWxsKHRoYXQsIG5vZGUsICsraW5kZXgsIHRoaXMpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLFxuICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7XG4gICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7XG4gICAgbm9kZS52YWx1ZSA9IHN1bTtcbiAgfSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICByZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpO1xuICAgIH1cbiAgfSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZW5kKSB7XG4gIHZhciBzdGFydCA9IHRoaXMsXG4gICAgICBhbmNlc3RvciA9IGxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksXG4gICAgICBub2RlcyA9IFtzdGFydF07XG4gIHdoaWxlIChzdGFydCAhPT0gYW5jZXN0b3IpIHtcbiAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDtcbiAgICBub2Rlcy5wdXNoKHN0YXJ0KTtcbiAgfVxuICB2YXIgayA9IG5vZGVzLmxlbmd0aDtcbiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHtcbiAgICBub2Rlcy5zcGxpY2UoaywgMCwgZW5kKTtcbiAgICBlbmQgPSBlbmQucGFyZW50O1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cblxuZnVuY3Rpb24gbGVhc3RDb21tb25BbmNlc3RvcihhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gYTtcbiAgdmFyIGFOb2RlcyA9IGEuYW5jZXN0b3JzKCksXG4gICAgICBiTm9kZXMgPSBiLmFuY2VzdG9ycygpLFxuICAgICAgYyA9IG51bGw7XG4gIGEgPSBhTm9kZXMucG9wKCk7XG4gIGIgPSBiTm9kZXMucG9wKCk7XG4gIHdoaWxlIChhID09PSBiKSB7XG4gICAgYyA9IGE7XG4gICAgYSA9IGFOb2Rlcy5wb3AoKTtcbiAgICBiID0gYk5vZGVzLnBvcCgpO1xuICB9XG4gIHJldHVybiBjO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdO1xuICB3aGlsZSAobm9kZSA9IG5vZGUucGFyZW50KSB7XG4gICAgbm9kZXMucHVzaChub2RlKTtcbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbGVhdmVzID0gW107XG4gIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICBsZWF2ZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGVhdmVzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgcm9vdCA9IHRoaXMsIGxpbmtzID0gW107XG4gIHJvb3QuZWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgaWYgKG5vZGUgIT09IHJvb3QpIHsgLy8gRG9uXHUyMDE5dCBpbmNsdWRlIHRoZSByb290XHUyMDE5cyBwYXJlbnQsIGlmIGFueS5cbiAgICAgIGxpbmtzLnB1c2goe3NvdXJjZTogbm9kZS5wYXJlbnQsIHRhcmdldDogbm9kZX0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW5rcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIHZhciBub2RlID0gdGhpcywgY3VycmVudCwgbmV4dCA9IFtub2RlXSwgY2hpbGRyZW4sIGksIG47XG4gIGRvIHtcbiAgICBjdXJyZW50ID0gbmV4dC5yZXZlcnNlKCksIG5leHQgPSBbXTtcbiAgICB3aGlsZSAobm9kZSA9IGN1cnJlbnQucG9wKCkpIHtcbiAgICAgIHlpZWxkIG5vZGU7XG4gICAgICBpZiAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICBuZXh0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlIChuZXh0Lmxlbmd0aCk7XG59XG4iLCAiaW1wb3J0IG5vZGVfY291bnQgZnJvbSBcIi4vY291bnQuanNcIjtcbmltcG9ydCBub2RlX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IG5vZGVfZWFjaEJlZm9yZSBmcm9tIFwiLi9lYWNoQmVmb3JlLmpzXCI7XG5pbXBvcnQgbm9kZV9lYWNoQWZ0ZXIgZnJvbSBcIi4vZWFjaEFmdGVyLmpzXCI7XG5pbXBvcnQgbm9kZV9maW5kIGZyb20gXCIuL2ZpbmQuanNcIjtcbmltcG9ydCBub2RlX3N1bSBmcm9tIFwiLi9zdW0uanNcIjtcbmltcG9ydCBub2RlX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IG5vZGVfcGF0aCBmcm9tIFwiLi9wYXRoLmpzXCI7XG5pbXBvcnQgbm9kZV9hbmNlc3RvcnMgZnJvbSBcIi4vYW5jZXN0b3JzLmpzXCI7XG5pbXBvcnQgbm9kZV9kZXNjZW5kYW50cyBmcm9tIFwiLi9kZXNjZW5kYW50cy5qc1wiO1xuaW1wb3J0IG5vZGVfbGVhdmVzIGZyb20gXCIuL2xlYXZlcy5qc1wiO1xuaW1wb3J0IG5vZGVfbGlua3MgZnJvbSBcIi4vbGlua3MuanNcIjtcbmltcG9ydCBub2RlX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhpZXJhcmNoeShkYXRhLCBjaGlsZHJlbikge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGRhdGEgPSBbdW5kZWZpbmVkLCBkYXRhXTtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkgY2hpbGRyZW4gPSBtYXBDaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2hpbGRyZW4gPSBvYmplY3RDaGlsZHJlbjtcbiAgfVxuXG4gIHZhciByb290ID0gbmV3IE5vZGUoZGF0YSksXG4gICAgICBub2RlLFxuICAgICAgbm9kZXMgPSBbcm9vdF0sXG4gICAgICBjaGlsZCxcbiAgICAgIGNoaWxkcyxcbiAgICAgIGksXG4gICAgICBuO1xuXG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBpZiAoKGNoaWxkcyA9IGNoaWxkcmVuKG5vZGUuZGF0YSkpICYmIChuID0gKGNoaWxkcyA9IEFycmF5LmZyb20oY2hpbGRzKSkubGVuZ3RoKSkge1xuICAgICAgbm9kZS5jaGlsZHJlbiA9IGNoaWxkcztcbiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gY2hpbGRzW2ldID0gbmV3IE5vZGUoY2hpbGRzW2ldKSk7XG4gICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7XG4gICAgICAgIGNoaWxkLmRlcHRoID0gbm9kZS5kZXB0aCArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3QuZWFjaEJlZm9yZShjb21wdXRlSGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gbm9kZV9jb3B5KCkge1xuICByZXR1cm4gaGllcmFyY2h5KHRoaXMpLmVhY2hCZWZvcmUoY29weURhdGEpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RDaGlsZHJlbihkKSB7XG4gIHJldHVybiBkLmNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihkKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGQpID8gZFsxXSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvcHlEYXRhKG5vZGUpIHtcbiAgaWYgKG5vZGUuZGF0YS52YWx1ZSAhPT0gdW5kZWZpbmVkKSBub2RlLnZhbHVlID0gbm9kZS5kYXRhLnZhbHVlO1xuICBub2RlLmRhdGEgPSBub2RlLmRhdGEuZGF0YTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQobm9kZSkge1xuICB2YXIgaGVpZ2h0ID0gMDtcbiAgZG8gbm9kZS5oZWlnaHQgPSBoZWlnaHQ7XG4gIHdoaWxlICgobm9kZSA9IG5vZGUucGFyZW50KSAmJiAobm9kZS5oZWlnaHQgPCArK2hlaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTm9kZShkYXRhKSB7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMuZGVwdGggPVxuICB0aGlzLmhlaWdodCA9IDA7XG4gIHRoaXMucGFyZW50ID0gbnVsbDtcbn1cblxuTm9kZS5wcm90b3R5cGUgPSBoaWVyYXJjaHkucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogTm9kZSxcbiAgY291bnQ6IG5vZGVfY291bnQsXG4gIGVhY2g6IG5vZGVfZWFjaCxcbiAgZWFjaEFmdGVyOiBub2RlX2VhY2hBZnRlcixcbiAgZWFjaEJlZm9yZTogbm9kZV9lYWNoQmVmb3JlLFxuICBmaW5kOiBub2RlX2ZpbmQsXG4gIHN1bTogbm9kZV9zdW0sXG4gIHNvcnQ6IG5vZGVfc29ydCxcbiAgcGF0aDogbm9kZV9wYXRoLFxuICBhbmNlc3RvcnM6IG5vZGVfYW5jZXN0b3JzLFxuICBkZXNjZW5kYW50czogbm9kZV9kZXNjZW5kYW50cyxcbiAgbGVhdmVzOiBub2RlX2xlYXZlcyxcbiAgbGlua3M6IG5vZGVfbGlua3MsXG4gIGNvcHk6IG5vZGVfY29weSxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IG5vZGVfaXRlcmF0b3Jcbn07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsKGYpIHtcbiAgcmV0dXJuIGYgPT0gbnVsbCA/IG51bGwgOiByZXF1aXJlZChmKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkKGYpIHtcbiAgaWYgKHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGY7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGNvbnN0YW50WmVybygpIHtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB4O1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgbm9kZS54MCA9IE1hdGgucm91bmQobm9kZS54MCk7XG4gIG5vZGUueTAgPSBNYXRoLnJvdW5kKG5vZGUueTApO1xuICBub2RlLngxID0gTWF0aC5yb3VuZChub2RlLngxKTtcbiAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICBub2RlLFxuICAgICAgaSA9IC0xLFxuICAgICAgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHgxIC0geDApIC8gcGFyZW50LnZhbHVlO1xuXG4gIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MTtcbiAgICBub2RlLngwID0geDAsIG5vZGUueDEgPSB4MCArPSBub2RlLnZhbHVlICogaztcbiAgfVxufVxuIiwgImltcG9ydCByb3VuZE5vZGUgZnJvbSBcIi4vdHJlZW1hcC9yb3VuZC5qc1wiO1xuaW1wb3J0IHRyZWVtYXBEaWNlIGZyb20gXCIuL3RyZWVtYXAvZGljZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGR4ID0gMSxcbiAgICAgIGR5ID0gMSxcbiAgICAgIHBhZGRpbmcgPSAwLFxuICAgICAgcm91bmQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwYXJ0aXRpb24ocm9vdCkge1xuICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxO1xuICAgIHJvb3QueDAgPVxuICAgIHJvb3QueTAgPSBwYWRkaW5nO1xuICAgIHJvb3QueDEgPSBkeDtcbiAgICByb290LnkxID0gZHkgLyBuO1xuICAgIHJvb3QuZWFjaEJlZm9yZShwb3NpdGlvbk5vZGUoZHksIG4pKTtcbiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKGR5LCBuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHRyZWVtYXBEaWNlKG5vZGUsIG5vZGUueDAsIGR5ICogKG5vZGUuZGVwdGggKyAxKSAvIG4sIG5vZGUueDEsIGR5ICogKG5vZGUuZGVwdGggKyAyKSAvIG4pO1xuICAgICAgfVxuICAgICAgdmFyIHgwID0gbm9kZS54MCxcbiAgICAgICAgICB5MCA9IG5vZGUueTAsXG4gICAgICAgICAgeDEgPSBub2RlLngxIC0gcGFkZGluZyxcbiAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nO1xuICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyO1xuICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgICAgbm9kZS54MCA9IHgwO1xuICAgICAgbm9kZS55MCA9IHkwO1xuICAgICAgbm9kZS54MSA9IHgxO1xuICAgICAgbm9kZS55MSA9IHkxO1xuICAgIH07XG4gIH1cblxuICBwYXJ0aXRpb24ucm91bmQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIXgsIHBhcnRpdGlvbikgOiByb3VuZDtcbiAgfTtcblxuICBwYXJ0aXRpb24uc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYXJ0aXRpb24pIDogW2R4LCBkeV07XG4gIH07XG5cbiAgcGFydGl0aW9uLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZyA9ICt4LCBwYXJ0aXRpb24pIDogcGFkZGluZztcbiAgfTtcblxuICByZXR1cm4gcGFydGl0aW9uO1xufVxuIiwgImltcG9ydCB7cmVxdWlyZWR9IGZyb20gXCIuL2FjY2Vzc29ycy5qc1wiO1xuaW1wb3J0IHtOb2RlLCBjb21wdXRlSGVpZ2h0fSBmcm9tIFwiLi9oaWVyYXJjaHkvaW5kZXguanNcIjtcblxudmFyIHByZXJvb3QgPSB7ZGVwdGg6IC0xfSxcbiAgICBhbWJpZ3VvdXMgPSB7fTtcblxuZnVuY3Rpb24gZGVmYXVsdElkKGQpIHtcbiAgcmV0dXJuIGQuaWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQYXJlbnRJZChkKSB7XG4gIHJldHVybiBkLnBhcmVudElkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGlkID0gZGVmYXVsdElkLFxuICAgICAgcGFyZW50SWQgPSBkZWZhdWx0UGFyZW50SWQ7XG5cbiAgZnVuY3Rpb24gc3RyYXRpZnkoZGF0YSkge1xuICAgIHZhciBub2RlcyA9IEFycmF5LmZyb20oZGF0YSksXG4gICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgIGQsXG4gICAgICAgIGksXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbm9kZUlkLFxuICAgICAgICBub2RlS2V5LFxuICAgICAgICBub2RlQnlLZXkgPSBuZXcgTWFwO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgZCA9IG5vZGVzW2ldLCBub2RlID0gbm9kZXNbaV0gPSBuZXcgTm9kZShkKTtcbiAgICAgIGlmICgobm9kZUlkID0gaWQoZCwgaSwgZGF0YSkpICE9IG51bGwgJiYgKG5vZGVJZCArPSBcIlwiKSkge1xuICAgICAgICBub2RlS2V5ID0gbm9kZS5pZCA9IG5vZGVJZDtcbiAgICAgICAgbm9kZUJ5S2V5LnNldChub2RlS2V5LCBub2RlQnlLZXkuaGFzKG5vZGVLZXkpID8gYW1iaWd1b3VzIDogbm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoKG5vZGVJZCA9IHBhcmVudElkKGQsIGksIGRhdGEpKSAhPSBudWxsICYmIChub2RlSWQgKz0gXCJcIikpIHtcbiAgICAgICAgbm9kZS5wYXJlbnQgPSBub2RlSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGVJZCA9IG5vZGUucGFyZW50KSB7XG4gICAgICAgIHBhcmVudCA9IG5vZGVCeUtleS5nZXQobm9kZUlkKTtcbiAgICAgICAgaWYgKCFwYXJlbnQpIHRocm93IG5ldyBFcnJvcihcIm1pc3Npbmc6IFwiICsgbm9kZUlkKTtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gYW1iaWd1b3VzKSB0aHJvdyBuZXcgRXJyb3IoXCJhbWJpZ3VvdXM6IFwiICsgbm9kZUlkKTtcbiAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIGVsc2UgcGFyZW50LmNoaWxkcmVuID0gW25vZGVdO1xuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJtdWx0aXBsZSByb290c1wiKTtcbiAgICAgICAgcm9vdCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoXCJubyByb290XCIpO1xuICAgIHJvb3QucGFyZW50ID0gcHJlcm9vdDtcbiAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgeyBub2RlLmRlcHRoID0gbm9kZS5wYXJlbnQuZGVwdGggKyAxOyAtLW47IH0pLmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7XG4gICAgcm9vdC5wYXJlbnQgPSBudWxsO1xuICAgIGlmIChuID4gMCkgdGhyb3cgbmV3IEVycm9yKFwiY3ljbGVcIik7XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIHN0cmF0aWZ5LmlkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlkID0gcmVxdWlyZWQoeCksIHN0cmF0aWZ5KSA6IGlkO1xuICB9O1xuXG4gIHN0cmF0aWZ5LnBhcmVudElkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhcmVudElkID0gcmVxdWlyZWQoeCksIHN0cmF0aWZ5KSA6IHBhcmVudElkO1xuICB9O1xuXG4gIHJldHVybiBzdHJhdGlmeTtcbn1cbiIsICJpbXBvcnQge05vZGV9IGZyb20gXCIuL2hpZXJhcmNoeS9pbmRleC5qc1wiO1xuXG5mdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7XG4gIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjtcbn1cblxuLy8gZnVuY3Rpb24gcmFkaWFsU2VwYXJhdGlvbihhLCBiKSB7XG4vLyAgIHJldHVybiAoYS5wYXJlbnQgPT09IGIucGFyZW50ID8gMSA6IDIpIC8gYS5kZXB0aDtcbi8vIH1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsZWZ0IGNvbnRvdXIgb2YgYSBzdWJ0cmVlIChvclxuLy8gc3ViZm9yZXN0KS4gSXQgcmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHYgb24gdGhpcyBjb250b3VyLiBUaGlzIHN1Y2Nlc3NvciBpc1xuLy8gZWl0aGVyIGdpdmVuIGJ5IHRoZSBsZWZ0bW9zdCBjaGlsZCBvZiB2IG9yIGJ5IHRoZSB0aHJlYWQgb2Ygdi4gVGhlIGZ1bmN0aW9uXG4vLyByZXR1cm5zIG51bGwgaWYgYW5kIG9ubHkgaWYgdiBpcyBvbiB0aGUgaGlnaGVzdCBsZXZlbCBvZiBpdHMgc3VidHJlZS5cbmZ1bmN0aW9uIG5leHRMZWZ0KHYpIHtcbiAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjtcbiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bMF0gOiB2LnQ7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gd29ya3MgYW5hbG9nb3VzbHkgdG8gbmV4dExlZnQuXG5mdW5jdGlvbiBuZXh0UmlnaHQodikge1xuICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuO1xuICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA6IHYudDtcbn1cblxuLy8gU2hpZnRzIHRoZSBjdXJyZW50IHN1YnRyZWUgcm9vdGVkIGF0IHcrLiBUaGlzIGlzIGRvbmUgYnkgaW5jcmVhc2luZ1xuLy8gcHJlbGltKHcrKSBhbmQgbW9kKHcrKSBieSBzaGlmdC5cbmZ1bmN0aW9uIG1vdmVTdWJ0cmVlKHdtLCB3cCwgc2hpZnQpIHtcbiAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKHdwLmkgLSB3bS5pKTtcbiAgd3AuYyAtPSBjaGFuZ2U7XG4gIHdwLnMgKz0gc2hpZnQ7XG4gIHdtLmMgKz0gY2hhbmdlO1xuICB3cC56ICs9IHNoaWZ0O1xuICB3cC5tICs9IHNoaWZ0O1xufVxuXG4vLyBBbGwgb3RoZXIgc2hpZnRzLCBhcHBsaWVkIHRvIHRoZSBzbWFsbGVyIHN1YnRyZWVzIGJldHdlZW4gdy0gYW5kIHcrLCBhcmVcbi8vIHBlcmZvcm1lZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBwcmVwYXJlIHRoZSBzaGlmdHMsIHdlIGhhdmUgdG8gYWRqdXN0XG4vLyBjaGFuZ2UodyspLCBzaGlmdCh3KyksIGFuZCBjaGFuZ2Uody0pLlxuZnVuY3Rpb24gZXhlY3V0ZVNoaWZ0cyh2KSB7XG4gIHZhciBzaGlmdCA9IDAsXG4gICAgICBjaGFuZ2UgPSAwLFxuICAgICAgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLFxuICAgICAgaSA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIHc7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIHcgPSBjaGlsZHJlbltpXTtcbiAgICB3LnogKz0gc2hpZnQ7XG4gICAgdy5tICs9IHNoaWZ0O1xuICAgIHNoaWZ0ICs9IHcucyArIChjaGFuZ2UgKz0gdy5jKTtcbiAgfVxufVxuXG4vLyBJZiB2aS1cdTIwMTlzIGFuY2VzdG9yIGlzIGEgc2libGluZyBvZiB2LCByZXR1cm5zIHZpLVx1MjAxOXMgYW5jZXN0b3IuIE90aGVyd2lzZSxcbi8vIHJldHVybnMgdGhlIHNwZWNpZmllZCAoZGVmYXVsdCkgYW5jZXN0b3IuXG5mdW5jdGlvbiBuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3Rvcikge1xuICByZXR1cm4gdmltLmEucGFyZW50ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7XG59XG5cbmZ1bmN0aW9uIFRyZWVOb2RlKG5vZGUsIGkpIHtcbiAgdGhpcy5fID0gbm9kZTtcbiAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICB0aGlzLmNoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5BID0gbnVsbDsgLy8gZGVmYXVsdCBhbmNlc3RvclxuICB0aGlzLmEgPSB0aGlzOyAvLyBhbmNlc3RvclxuICB0aGlzLnogPSAwOyAvLyBwcmVsaW1cbiAgdGhpcy5tID0gMDsgLy8gbW9kXG4gIHRoaXMuYyA9IDA7IC8vIGNoYW5nZVxuICB0aGlzLnMgPSAwOyAvLyBzaGlmdFxuICB0aGlzLnQgPSBudWxsOyAvLyB0aHJlYWRcbiAgdGhpcy5pID0gaTsgLy8gbnVtYmVyXG59XG5cblRyZWVOb2RlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTm9kZS5wcm90b3R5cGUpO1xuXG5mdW5jdGlvbiB0cmVlUm9vdChyb290KSB7XG4gIHZhciB0cmVlID0gbmV3IFRyZWVOb2RlKHJvb3QsIDApLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVzID0gW3RyZWVdLFxuICAgICAgY2hpbGQsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGksXG4gICAgICBuO1xuXG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBpZiAoY2hpbGRyZW4gPSBub2RlLl8uY2hpbGRyZW4pIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkobiA9IGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgVHJlZU5vZGUoY2hpbGRyZW5baV0sIGkpKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAodHJlZS5wYXJlbnQgPSBuZXcgVHJlZU5vZGUobnVsbCwgMCkpLmNoaWxkcmVuID0gW3RyZWVdO1xuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gTm9kZS1saW5rIHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCBcInRpZHlcIiBhbGdvcml0aG1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VwYXJhdGlvbiA9IGRlZmF1bHRTZXBhcmF0aW9uLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgbm9kZVNpemUgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHRyZWUocm9vdCkge1xuICAgIHZhciB0ID0gdHJlZVJvb3Qocm9vdCk7XG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwuXHUyMDE5cyBhbGdvcml0aG0uXG4gICAgdC5lYWNoQWZ0ZXIoZmlyc3RXYWxrKSwgdC5wYXJlbnQubSA9IC10Lno7XG4gICAgdC5lYWNoQmVmb3JlKHNlY29uZFdhbGspO1xuXG4gICAgLy8gSWYgYSBmaXhlZCBub2RlIHNpemUgaXMgc3BlY2lmaWVkLCBzY2FsZSB4IGFuZCB5LlxuICAgIGlmIChub2RlU2l6ZSkgcm9vdC5lYWNoQmVmb3JlKHNpemVOb2RlKTtcblxuICAgIC8vIElmIGEgZml4ZWQgdHJlZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeSBiYXNlZCBvbiB0aGUgZXh0ZW50LlxuICAgIC8vIENvbXB1dGUgdGhlIGxlZnQtbW9zdCwgcmlnaHQtbW9zdCwgYW5kIGRlcHRoLW1vc3Qgbm9kZXMgZm9yIGV4dGVudHMuXG4gICAgZWxzZSB7XG4gICAgICB2YXIgbGVmdCA9IHJvb3QsXG4gICAgICAgICAgcmlnaHQgPSByb290LFxuICAgICAgICAgIGJvdHRvbSA9IHJvb3Q7XG4gICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS54IDwgbGVmdC54KSBsZWZ0ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUueCA+IHJpZ2h0LngpIHJpZ2h0ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7XG4gICAgICB9KTtcbiAgICAgIHZhciBzID0gbGVmdCA9PT0gcmlnaHQgPyAxIDogc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLFxuICAgICAgICAgIHR4ID0gcyAtIGxlZnQueCxcbiAgICAgICAgICBreCA9IGR4IC8gKHJpZ2h0LnggKyBzICsgdHgpLFxuICAgICAgICAgIGt5ID0gZHkgLyAoYm90dG9tLmRlcHRoIHx8IDEpO1xuICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS54ID0gKG5vZGUueCArIHR4KSAqIGt4O1xuICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICoga3k7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8vIENvbXB1dGVzIGEgcHJlbGltaW5hcnkgeC1jb29yZGluYXRlIGZvciB2LiBCZWZvcmUgdGhhdCwgRklSU1QgV0FMSyBpc1xuICAvLyBhcHBsaWVkIHJlY3Vyc2l2ZWx5IHRvIHRoZSBjaGlsZHJlbiBvZiB2LCBhcyB3ZWxsIGFzIHRoZSBmdW5jdGlvblxuICAvLyBBUFBPUlRJT04uIEFmdGVyIHNwYWNpbmcgb3V0IHRoZSBjaGlsZHJlbiBieSBjYWxsaW5nIEVYRUNVVEUgU0hJRlRTLCB0aGVcbiAgLy8gbm9kZSB2IGlzIHBsYWNlZCB0byB0aGUgbWlkcG9pbnQgb2YgaXRzIG91dGVybW9zdCBjaGlsZHJlbi5cbiAgZnVuY3Rpb24gZmlyc3RXYWxrKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLFxuICAgICAgICBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLFxuICAgICAgICB3ID0gdi5pID8gc2libGluZ3Nbdi5pIC0gMV0gOiBudWxsO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgZXhlY3V0ZVNoaWZ0cyh2KTtcbiAgICAgIHZhciBtaWRwb2ludCA9IChjaGlsZHJlblswXS56ICsgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0ueikgLyAyO1xuICAgICAgaWYgKHcpIHtcbiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XG4gICAgICAgIHYubSA9IHYueiAtIG1pZHBvaW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdi56ID0gbWlkcG9pbnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3KSB7XG4gICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTtcbiAgICB9XG4gICAgdi5wYXJlbnQuQSA9IGFwcG9ydGlvbih2LCB3LCB2LnBhcmVudC5BIHx8IHNpYmxpbmdzWzBdKTtcbiAgfVxuXG4gIC8vIENvbXB1dGVzIGFsbCByZWFsIHgtY29vcmRpbmF0ZXMgYnkgc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIHJlY3Vyc2l2ZWx5LlxuICBmdW5jdGlvbiBzZWNvbmRXYWxrKHYpIHtcbiAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07XG4gICAgdi5tICs9IHYucGFyZW50Lm07XG4gIH1cblxuICAvLyBUaGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLiBIZXJlLCBhIG5ldyBzdWJ0cmVlIGlzIGNvbWJpbmVkIHdpdGggdGhlXG4gIC8vIHByZXZpb3VzIHN1YnRyZWVzLiBUaHJlYWRzIGFyZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBpbnNpZGUgYW5kIG91dHNpZGVcbiAgLy8gY29udG91cnMgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWUgdXAgdG8gdGhlIGhpZ2hlc3QgY29tbW9uIGxldmVsLiBUaGVcbiAgLy8gdmVydGljZXMgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbHMgYXJlIHZpKywgdmktLCB2by0sIGFuZCB2byssIHdoZXJlIHRoZVxuICAvLyBzdXBlcnNjcmlwdCBvIG1lYW5zIG91dHNpZGUgYW5kIGkgbWVhbnMgaW5zaWRlLCB0aGUgc3Vic2NyaXB0IC0gbWVhbnMgbGVmdFxuICAvLyBzdWJ0cmVlIGFuZCArIG1lYW5zIHJpZ2h0IHN1YnRyZWUuIEZvciBzdW1taW5nIHVwIHRoZSBtb2RpZmllcnMgYWxvbmcgdGhlXG4gIC8vIGNvbnRvdXIsIHdlIHVzZSByZXNwZWN0aXZlIHZhcmlhYmxlcyBzaSssIHNpLSwgc28tLCBhbmQgc28rLiBXaGVuZXZlciB0d29cbiAgLy8gbm9kZXMgb2YgdGhlIGluc2lkZSBjb250b3VycyBjb25mbGljdCwgd2UgY29tcHV0ZSB0aGUgbGVmdCBvbmUgb2YgdGhlXG4gIC8vIGdyZWF0ZXN0IHVuY29tbW9uIGFuY2VzdG9ycyB1c2luZyB0aGUgZnVuY3Rpb24gQU5DRVNUT1IgYW5kIGNhbGwgTU9WRVxuICAvLyBTVUJUUkVFIHRvIHNoaWZ0IHRoZSBzdWJ0cmVlIGFuZCBwcmVwYXJlIHRoZSBzaGlmdHMgb2Ygc21hbGxlciBzdWJ0cmVlcy5cbiAgLy8gRmluYWxseSwgd2UgYWRkIGEgbmV3IHRocmVhZCAoaWYgbmVjZXNzYXJ5KS5cbiAgZnVuY3Rpb24gYXBwb3J0aW9uKHYsIHcsIGFuY2VzdG9yKSB7XG4gICAgaWYgKHcpIHtcbiAgICAgIHZhciB2aXAgPSB2LFxuICAgICAgICAgIHZvcCA9IHYsXG4gICAgICAgICAgdmltID0gdyxcbiAgICAgICAgICB2b20gPSB2aXAucGFyZW50LmNoaWxkcmVuWzBdLFxuICAgICAgICAgIHNpcCA9IHZpcC5tLFxuICAgICAgICAgIHNvcCA9IHZvcC5tLFxuICAgICAgICAgIHNpbSA9IHZpbS5tLFxuICAgICAgICAgIHNvbSA9IHZvbS5tLFxuICAgICAgICAgIHNoaWZ0O1xuICAgICAgd2hpbGUgKHZpbSA9IG5leHRSaWdodCh2aW0pLCB2aXAgPSBuZXh0TGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7XG4gICAgICAgIHZvbSA9IG5leHRMZWZ0KHZvbSk7XG4gICAgICAgIHZvcCA9IG5leHRSaWdodCh2b3ApO1xuICAgICAgICB2b3AuYSA9IHY7XG4gICAgICAgIHNoaWZ0ID0gdmltLnogKyBzaW0gLSB2aXAueiAtIHNpcCArIHNlcGFyYXRpb24odmltLl8sIHZpcC5fKTtcbiAgICAgICAgaWYgKHNoaWZ0ID4gMCkge1xuICAgICAgICAgIG1vdmVTdWJ0cmVlKG5leHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSwgdiwgc2hpZnQpO1xuICAgICAgICAgIHNpcCArPSBzaGlmdDtcbiAgICAgICAgICBzb3AgKz0gc2hpZnQ7XG4gICAgICAgIH1cbiAgICAgICAgc2ltICs9IHZpbS5tO1xuICAgICAgICBzaXAgKz0gdmlwLm07XG4gICAgICAgIHNvbSArPSB2b20ubTtcbiAgICAgICAgc29wICs9IHZvcC5tO1xuICAgICAgfVxuICAgICAgaWYgKHZpbSAmJiAhbmV4dFJpZ2h0KHZvcCkpIHtcbiAgICAgICAgdm9wLnQgPSB2aW07XG4gICAgICAgIHZvcC5tICs9IHNpbSAtIHNvcDtcbiAgICAgIH1cbiAgICAgIGlmICh2aXAgJiYgIW5leHRMZWZ0KHZvbSkpIHtcbiAgICAgICAgdm9tLnQgPSB2aXA7XG4gICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTtcbiAgICAgICAgYW5jZXN0b3IgPSB2O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBzaXplTm9kZShub2RlKSB7XG4gICAgbm9kZS54ICo9IGR4O1xuICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTtcbiAgfVxuXG4gIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZXBhcmF0aW9uID0geCwgdHJlZSkgOiBzZXBhcmF0aW9uO1xuICB9O1xuXG4gIHRyZWUuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7XG4gIH07XG5cbiAgdHJlZS5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTtcbiAgfTtcblxuICByZXR1cm4gdHJlZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbixcbiAgICAgIG5vZGUsXG4gICAgICBpID0gLTEsXG4gICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeTEgLSB5MCkgLyBwYXJlbnQudmFsdWU7XG5cbiAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgxO1xuICAgIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkwICs9IG5vZGUudmFsdWUgKiBrO1xuICB9XG59XG4iLCAiaW1wb3J0IHRyZWVtYXBEaWNlIGZyb20gXCIuL2RpY2UuanNcIjtcbmltcG9ydCB0cmVlbWFwU2xpY2UgZnJvbSBcIi4vc2xpY2UuanNcIjtcblxuZXhwb3J0IHZhciBwaGkgPSAoMSArIE1hdGguc3FydCg1KSkgLyAyO1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSkge1xuICB2YXIgcm93cyA9IFtdLFxuICAgICAgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sXG4gICAgICByb3csXG4gICAgICBub2RlVmFsdWUsXG4gICAgICBpMCA9IDAsXG4gICAgICBpMSA9IDAsXG4gICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgZHgsIGR5LFxuICAgICAgdmFsdWUgPSBwYXJlbnQudmFsdWUsXG4gICAgICBzdW1WYWx1ZSxcbiAgICAgIG1pblZhbHVlLFxuICAgICAgbWF4VmFsdWUsXG4gICAgICBuZXdSYXRpbyxcbiAgICAgIG1pblJhdGlvLFxuICAgICAgYWxwaGEsXG4gICAgICBiZXRhO1xuXG4gIHdoaWxlIChpMCA8IG4pIHtcbiAgICBkeCA9IHgxIC0geDAsIGR5ID0geTEgLSB5MDtcblxuICAgIC8vIEZpbmQgdGhlIG5leHQgbm9uLWVtcHR5IG5vZGUuXG4gICAgZG8gc3VtVmFsdWUgPSBub2Rlc1tpMSsrXS52YWx1ZTsgd2hpbGUgKCFzdW1WYWx1ZSAmJiBpMSA8IG4pO1xuICAgIG1pblZhbHVlID0gbWF4VmFsdWUgPSBzdW1WYWx1ZTtcbiAgICBhbHBoYSA9IE1hdGgubWF4KGR5IC8gZHgsIGR4IC8gZHkpIC8gKHZhbHVlICogcmF0aW8pO1xuICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1bVZhbHVlICogYWxwaGE7XG4gICAgbWluUmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7XG5cbiAgICAvLyBLZWVwIGFkZGluZyBub2RlcyB3aGlsZSB0aGUgYXNwZWN0IHJhdGlvIG1haW50YWlucyBvciBpbXByb3Zlcy5cbiAgICBmb3IgKDsgaTEgPCBuOyArK2kxKSB7XG4gICAgICBzdW1WYWx1ZSArPSBub2RlVmFsdWUgPSBub2Rlc1tpMV0udmFsdWU7XG4gICAgICBpZiAobm9kZVZhbHVlIDwgbWluVmFsdWUpIG1pblZhbHVlID0gbm9kZVZhbHVlO1xuICAgICAgaWYgKG5vZGVWYWx1ZSA+IG1heFZhbHVlKSBtYXhWYWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1bVZhbHVlICogYWxwaGE7XG4gICAgICBuZXdSYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTtcbiAgICAgIGlmIChuZXdSYXRpbyA+IG1pblJhdGlvKSB7IHN1bVZhbHVlIC09IG5vZGVWYWx1ZTsgYnJlYWs7IH1cbiAgICAgIG1pblJhdGlvID0gbmV3UmF0aW87XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gYW5kIHJlY29yZCB0aGUgcm93IG9yaWVudGF0aW9uLlxuICAgIHJvd3MucHVzaChyb3cgPSB7dmFsdWU6IHN1bVZhbHVlLCBkaWNlOiBkeCA8IGR5LCBjaGlsZHJlbjogbm9kZXMuc2xpY2UoaTAsIGkxKX0pO1xuICAgIGlmIChyb3cuZGljZSkgdHJlZW1hcERpY2Uocm93LCB4MCwgeTAsIHgxLCB2YWx1ZSA/IHkwICs9IGR5ICogc3VtVmFsdWUgLyB2YWx1ZSA6IHkxKTtcbiAgICBlbHNlIHRyZWVtYXBTbGljZShyb3csIHgwLCB5MCwgdmFsdWUgPyB4MCArPSBkeCAqIHN1bVZhbHVlIC8gdmFsdWUgOiB4MSwgeTEpO1xuICAgIHZhbHVlIC09IHN1bVZhbHVlLCBpMCA9IGkxO1xuICB9XG5cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHtcblxuICBmdW5jdGlvbiBzcXVhcmlmeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7XG4gIH1cblxuICBzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTtcbiAgfTtcblxuICByZXR1cm4gc3F1YXJpZnk7XG59KShwaGkpO1xuIiwgImltcG9ydCByb3VuZE5vZGUgZnJvbSBcIi4vcm91bmQuanNcIjtcbmltcG9ydCBzcXVhcmlmeSBmcm9tIFwiLi9zcXVhcmlmeS5qc1wiO1xuaW1wb3J0IHtyZXF1aXJlZH0gZnJvbSBcIi4uL2FjY2Vzc29ycy5qc1wiO1xuaW1wb3J0IGNvbnN0YW50LCB7Y29uc3RhbnRaZXJvfSBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciB0aWxlID0gc3F1YXJpZnksXG4gICAgICByb3VuZCA9IGZhbHNlLFxuICAgICAgZHggPSAxLFxuICAgICAgZHkgPSAxLFxuICAgICAgcGFkZGluZ1N0YWNrID0gWzBdLFxuICAgICAgcGFkZGluZ0lubmVyID0gY29uc3RhbnRaZXJvLFxuICAgICAgcGFkZGluZ1RvcCA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdSaWdodCA9IGNvbnN0YW50WmVybyxcbiAgICAgIHBhZGRpbmdCb3R0b20gPSBjb25zdGFudFplcm8sXG4gICAgICBwYWRkaW5nTGVmdCA9IGNvbnN0YW50WmVybztcblxuICBmdW5jdGlvbiB0cmVlbWFwKHJvb3QpIHtcbiAgICByb290LngwID1cbiAgICByb290LnkwID0gMDtcbiAgICByb290LngxID0gZHg7XG4gICAgcm9vdC55MSA9IGR5O1xuICAgIHJvb3QuZWFjaEJlZm9yZShwb3NpdGlvbk5vZGUpO1xuICAgIHBhZGRpbmdTdGFjayA9IFswXTtcbiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKG5vZGUpIHtcbiAgICB2YXIgcCA9IHBhZGRpbmdTdGFja1tub2RlLmRlcHRoXSxcbiAgICAgICAgeDAgPSBub2RlLngwICsgcCxcbiAgICAgICAgeTAgPSBub2RlLnkwICsgcCxcbiAgICAgICAgeDEgPSBub2RlLngxIC0gcCxcbiAgICAgICAgeTEgPSBub2RlLnkxIC0gcDtcbiAgICBpZiAoeDEgPCB4MCkgeDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7XG4gICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyO1xuICAgIG5vZGUueDAgPSB4MDtcbiAgICBub2RlLnkwID0geTA7XG4gICAgbm9kZS54MSA9IHgxO1xuICAgIG5vZGUueTEgPSB5MTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgcCA9IHBhZGRpbmdTdGFja1tub2RlLmRlcHRoICsgMV0gPSBwYWRkaW5nSW5uZXIobm9kZSkgLyAyO1xuICAgICAgeDAgKz0gcGFkZGluZ0xlZnQobm9kZSkgLSBwO1xuICAgICAgeTAgKz0gcGFkZGluZ1RvcChub2RlKSAtIHA7XG4gICAgICB4MSAtPSBwYWRkaW5nUmlnaHQobm9kZSkgLSBwO1xuICAgICAgeTEgLT0gcGFkZGluZ0JvdHRvbShub2RlKSAtIHA7XG4gICAgICBpZiAoeDEgPCB4MCkgeDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7XG4gICAgICBpZiAoeTEgPCB5MCkgeTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICB0aWxlKG5vZGUsIHgwLCB5MCwgeDEsIHkxKTtcbiAgICB9XG4gIH1cblxuICB0cmVlbWFwLnJvdW5kID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCB0cmVlbWFwKSA6IHJvdW5kO1xuICB9O1xuXG4gIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlbWFwKSA6IFtkeCwgZHldO1xuICB9O1xuXG4gIHRyZWVtYXAudGlsZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWxlID0gcmVxdWlyZWQoeCksIHRyZWVtYXApIDogdGlsZTtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdJbm5lcih4KS5wYWRkaW5nT3V0ZXIoeCkgOiB0cmVlbWFwLnBhZGRpbmdJbm5lcigpO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdJbm5lcjtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRyZWVtYXAucGFkZGluZ1RvcCh4KS5wYWRkaW5nUmlnaHQoeCkucGFkZGluZ0JvdHRvbSh4KS5wYWRkaW5nTGVmdCh4KSA6IHRyZWVtYXAucGFkZGluZ1RvcCgpO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ1RvcCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nVG9wID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDtcbiAgfTtcblxuICB0cmVlbWFwLnBhZGRpbmdSaWdodCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nUmlnaHQgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nUmlnaHQ7XG4gIH07XG5cbiAgdHJlZW1hcC5wYWRkaW5nQm90dG9tID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdCb3R0b20gPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nQm90dG9tO1xuICB9O1xuXG4gIHRyZWVtYXAucGFkZGluZ0xlZnQgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0xlZnQgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nTGVmdDtcbiAgfTtcblxuICByZXR1cm4gdHJlZW1hcDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbixcbiAgICAgIGksIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICBzdW0sIHN1bXMgPSBuZXcgQXJyYXkobiArIDEpO1xuXG4gIGZvciAoc3Vtc1swXSA9IHN1bSA9IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgc3Vtc1tpICsgMV0gPSBzdW0gKz0gbm9kZXNbaV0udmFsdWU7XG4gIH1cblxuICBwYXJ0aXRpb24oMCwgbiwgcGFyZW50LnZhbHVlLCB4MCwgeTAsIHgxLCB5MSk7XG5cbiAgZnVuY3Rpb24gcGFydGl0aW9uKGksIGosIHZhbHVlLCB4MCwgeTAsIHgxLCB5MSkge1xuICAgIGlmIChpID49IGogLSAxKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgbm9kZS54MCA9IHgwLCBub2RlLnkwID0geTA7XG4gICAgICBub2RlLngxID0geDEsIG5vZGUueTEgPSB5MTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVPZmZzZXQgPSBzdW1zW2ldLFxuICAgICAgICB2YWx1ZVRhcmdldCA9ICh2YWx1ZSAvIDIpICsgdmFsdWVPZmZzZXQsXG4gICAgICAgIGsgPSBpICsgMSxcbiAgICAgICAgaGkgPSBqIC0gMTtcblxuICAgIHdoaWxlIChrIDwgaGkpIHtcbiAgICAgIHZhciBtaWQgPSBrICsgaGkgPj4+IDE7XG4gICAgICBpZiAoc3Vtc1ttaWRdIDwgdmFsdWVUYXJnZXQpIGsgPSBtaWQgKyAxO1xuICAgICAgZWxzZSBoaSA9IG1pZDtcbiAgICB9XG5cbiAgICBpZiAoKHZhbHVlVGFyZ2V0IC0gc3Vtc1trIC0gMV0pIDwgKHN1bXNba10gLSB2YWx1ZVRhcmdldCkgJiYgaSArIDEgPCBrKSAtLWs7XG5cbiAgICB2YXIgdmFsdWVMZWZ0ID0gc3Vtc1trXSAtIHZhbHVlT2Zmc2V0LFxuICAgICAgICB2YWx1ZVJpZ2h0ID0gdmFsdWUgLSB2YWx1ZUxlZnQ7XG5cbiAgICBpZiAoKHgxIC0geDApID4gKHkxIC0geTApKSB7XG4gICAgICB2YXIgeGsgPSB2YWx1ZSA/ICh4MCAqIHZhbHVlUmlnaHQgKyB4MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZSA6IHgxO1xuICAgICAgcGFydGl0aW9uKGksIGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4aywgeTEpO1xuICAgICAgcGFydGl0aW9uKGssIGosIHZhbHVlUmlnaHQsIHhrLCB5MCwgeDEsIHkxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHlrID0gdmFsdWUgPyAoeTAgKiB2YWx1ZVJpZ2h0ICsgeTEgKiB2YWx1ZUxlZnQpIC8gdmFsdWUgOiB5MTtcbiAgICAgIHBhcnRpdGlvbihpLCBrLCB2YWx1ZUxlZnQsIHgwLCB5MCwgeDEsIHlrKTtcbiAgICAgIHBhcnRpdGlvbihrLCBqLCB2YWx1ZVJpZ2h0LCB4MCwgeWssIHgxLCB5MSk7XG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGluaXRSYW5nZShkb21haW4sIHJhbmdlKSB7XG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogYnJlYWs7XG4gICAgY2FzZSAxOiB0aGlzLnJhbmdlKGRvbWFpbik7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4pOyBicmVhaztcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHtcbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiBicmVhaztcbiAgICBjYXNlIDE6IHtcbiAgICAgIGlmICh0eXBlb2YgZG9tYWluID09PSBcImZ1bmN0aW9uXCIpIHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7XG4gICAgICBlbHNlIHRoaXMucmFuZ2UoZG9tYWluKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aGlzLmRvbWFpbihkb21haW4pO1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcnBvbGF0b3IgPT09IFwiZnVuY3Rpb25cIikgdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTtcbiAgICAgIGVsc2UgdGhpcy5yYW5nZShpbnRlcnBvbGF0b3IpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCB7aW5pdFJhbmdlfSBmcm9tIFwiLi9pbml0LmpzXCI7XG5cbmV4cG9ydCBjb25zdCBpbXBsaWNpdCA9IFN5bWJvbChcImltcGxpY2l0XCIpO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRpbmFsKCkge1xuICB2YXIgaW5kZXggPSBuZXcgTWFwKCksXG4gICAgICBkb21haW4gPSBbXSxcbiAgICAgIHJhbmdlID0gW10sXG4gICAgICB1bmtub3duID0gaW1wbGljaXQ7XG5cbiAgZnVuY3Rpb24gc2NhbGUoZCkge1xuICAgIHZhciBrZXkgPSBkICsgXCJcIiwgaSA9IGluZGV4LmdldChrZXkpO1xuICAgIGlmICghaSkge1xuICAgICAgaWYgKHVua25vd24gIT09IGltcGxpY2l0KSByZXR1cm4gdW5rbm93bjtcbiAgICAgIGluZGV4LnNldChrZXksIGkgPSBkb21haW4ucHVzaChkKSk7XG4gICAgfVxuICAgIHJldHVybiByYW5nZVsoaSAtIDEpICUgcmFuZ2UubGVuZ3RoXTtcbiAgfVxuXG4gIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTtcbiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBfKSB7XG4gICAgICBjb25zdCBrZXkgPSB2YWx1ZSArIFwiXCI7XG4gICAgICBpZiAoaW5kZXguaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaW5kZXguc2V0KGtleSwgZG9tYWluLnB1c2godmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9O1xuXG4gIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gQXJyYXkuZnJvbShfKSwgc2NhbGUpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb3JkaW5hbChkb21haW4sIHJhbmdlKS51bmtub3duKHVua25vd24pO1xuICB9O1xuXG4gIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcblxuICByZXR1cm4gc2NhbGU7XG59XG4iLCAiaW1wb3J0IHtyYW5nZSBhcyBzZXF1ZW5jZX0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuaW1wb3J0IG9yZGluYWwgZnJvbSBcIi4vb3JkaW5hbC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiYW5kKCkge1xuICB2YXIgc2NhbGUgPSBvcmRpbmFsKCkudW5rbm93bih1bmRlZmluZWQpLFxuICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLFxuICAgICAgb3JkaW5hbFJhbmdlID0gc2NhbGUucmFuZ2UsXG4gICAgICByMCA9IDAsXG4gICAgICByMSA9IDEsXG4gICAgICBzdGVwLFxuICAgICAgYmFuZHdpZHRoLFxuICAgICAgcm91bmQgPSBmYWxzZSxcbiAgICAgIHBhZGRpbmdJbm5lciA9IDAsXG4gICAgICBwYWRkaW5nT3V0ZXIgPSAwLFxuICAgICAgYWxpZ24gPSAwLjU7XG5cbiAgZGVsZXRlIHNjYWxlLnVua25vd247XG5cbiAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICB2YXIgbiA9IGRvbWFpbigpLmxlbmd0aCxcbiAgICAgICAgcmV2ZXJzZSA9IHIxIDwgcjAsXG4gICAgICAgIHN0YXJ0ID0gcmV2ZXJzZSA/IHIxIDogcjAsXG4gICAgICAgIHN0b3AgPSByZXZlcnNlID8gcjAgOiByMTtcbiAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgxLCBuIC0gcGFkZGluZ0lubmVyICsgcGFkZGluZ091dGVyICogMik7XG4gICAgaWYgKHJvdW5kKSBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTtcbiAgICBzdGFydCArPSAoc3RvcCAtIHN0YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjtcbiAgICBiYW5kd2lkdGggPSBzdGVwICogKDEgLSBwYWRkaW5nSW5uZXIpO1xuICAgIGlmIChyb3VuZCkgc3RhcnQgPSBNYXRoLnJvdW5kKHN0YXJ0KSwgYmFuZHdpZHRoID0gTWF0aC5yb3VuZChiYW5kd2lkdGgpO1xuICAgIHZhciB2YWx1ZXMgPSBzZXF1ZW5jZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVwICogaTsgfSk7XG4gICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7XG4gIH1cblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoW3IwLCByMV0gPSBfLCByMCA9ICtyMCwgcjEgPSArcjEsIHJlc2NhbGUoKSkgOiBbcjAsIHIxXTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBbcjAsIHIxXSA9IF8sIHIwID0gK3IwLCByMSA9ICtyMSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7XG4gIH07XG5cbiAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGJhbmR3aWR0aDtcbiAgfTtcblxuICBzY2FsZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH07XG5cbiAgc2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIHBhZGRpbmdPdXRlciA9ICtfKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjtcbiAgfTtcblxuICBzY2FsZS5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5taW4oMSwgXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7XG4gIH07XG5cbiAgc2NhbGUucGFkZGluZ091dGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdPdXRlciA9ICtfLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyO1xuICB9O1xuXG4gIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFsaWduID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogYWxpZ247XG4gIH07XG5cbiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBiYW5kKGRvbWFpbigpLCBbcjAsIHIxXSlcbiAgICAgICAgLnJvdW5kKHJvdW5kKVxuICAgICAgICAucGFkZGluZ0lubmVyKHBhZGRpbmdJbm5lcilcbiAgICAgICAgLnBhZGRpbmdPdXRlcihwYWRkaW5nT3V0ZXIpXG4gICAgICAgIC5hbGlnbihhbGlnbik7XG4gIH07XG5cbiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShyZXNjYWxlKCksIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIHBvaW50aXNoKHNjYWxlKSB7XG4gIHZhciBjb3B5ID0gc2NhbGUuY29weTtcblxuICBzY2FsZS5wYWRkaW5nID0gc2NhbGUucGFkZGluZ091dGVyO1xuICBkZWxldGUgc2NhbGUucGFkZGluZ0lubmVyO1xuICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludCgpIHtcbiAgcmV0dXJuIHBvaW50aXNoKGJhbmQuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnN0YW50cyh4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBudW1iZXIoeCkge1xuICByZXR1cm4gK3g7XG59XG4iLCAiaW1wb3J0IHtiaXNlY3R9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZSBhcyBpbnRlcnBvbGF0ZVZhbHVlLCBpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSb3VuZH0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciB1bml0ID0gWzAsIDFdO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGEsIGIpIHtcbiAgcmV0dXJuIChiIC09IChhID0gK2EpKVxuICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAtIGEpIC8gYjsgfVxuICAgICAgOiBjb25zdGFudChpc05hTihiKSA/IE5hTiA6IDAuNSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1wZXIoYSwgYikge1xuICB2YXIgdDtcbiAgaWYgKGEgPiBiKSB0ID0gYSwgYSA9IGIsIGIgPSB0O1xuICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5tYXgoYSwgTWF0aC5taW4oYiwgeCkpOyB9O1xufVxuXG4vLyBub3JtYWxpemUoYSwgYikoeCkgdGFrZXMgYSBkb21haW4gdmFsdWUgeCBpbiBbYSxiXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIgdCBpbiBbMCwxXS5cbi8vIGludGVycG9sYXRlKGEsIGIpKHQpIHRha2VzIGEgcGFyYW1ldGVyIHQgaW4gWzAsMV0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmFuZ2UgdmFsdWUgeCBpbiBbYSxiXS5cbmZ1bmN0aW9uIGJpbWFwKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlKSB7XG4gIHZhciBkMCA9IGRvbWFpblswXSwgZDEgPSBkb21haW5bMV0sIHIwID0gcmFuZ2VbMF0sIHIxID0gcmFuZ2VbMV07XG4gIGlmIChkMSA8IGQwKSBkMCA9IG5vcm1hbGl6ZShkMSwgZDApLCByMCA9IGludGVycG9sYXRlKHIxLCByMCk7XG4gIGVsc2UgZDAgPSBub3JtYWxpemUoZDAsIGQxKSwgcjAgPSBpbnRlcnBvbGF0ZShyMCwgcjEpO1xuICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gcjAoZDAoeCkpOyB9O1xufVxuXG5mdW5jdGlvbiBwb2x5bWFwKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlKSB7XG4gIHZhciBqID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDEsXG4gICAgICBkID0gbmV3IEFycmF5KGopLFxuICAgICAgciA9IG5ldyBBcnJheShqKSxcbiAgICAgIGkgPSAtMTtcblxuICAvLyBSZXZlcnNlIGRlc2NlbmRpbmcgZG9tYWlucy5cbiAgaWYgKGRvbWFpbltqXSA8IGRvbWFpblswXSkge1xuICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTtcbiAgICByYW5nZSA9IHJhbmdlLnNsaWNlKCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgd2hpbGUgKCsraSA8IGopIHtcbiAgICBkW2ldID0gbm9ybWFsaXplKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7XG4gICAgcltpXSA9IGludGVycG9sYXRlKHJhbmdlW2ldLCByYW5nZVtpICsgMV0pO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaSA9IGJpc2VjdChkb21haW4sIHgsIDEsIGopIC0gMTtcbiAgICByZXR1cm4gcltpXShkW2ldKHgpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldFxuICAgICAgLmRvbWFpbihzb3VyY2UuZG9tYWluKCkpXG4gICAgICAucmFuZ2Uoc291cmNlLnJhbmdlKCkpXG4gICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpXG4gICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpXG4gICAgICAudW5rbm93bihzb3VyY2UudW5rbm93bigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybWVyKCkge1xuICB2YXIgZG9tYWluID0gdW5pdCxcbiAgICAgIHJhbmdlID0gdW5pdCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVWYWx1ZSxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHVudHJhbnNmb3JtLFxuICAgICAgdW5rbm93bixcbiAgICAgIGNsYW1wID0gaWRlbnRpdHksXG4gICAgICBwaWVjZXdpc2UsXG4gICAgICBvdXRwdXQsXG4gICAgICBpbnB1dDtcblxuICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgIHZhciBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKTtcbiAgICBpZiAoY2xhbXAgIT09IGlkZW50aXR5KSBjbGFtcCA9IGNsYW1wZXIoZG9tYWluWzBdLCBkb21haW5bbiAtIDFdKTtcbiAgICBwaWVjZXdpc2UgPSBuID4gMiA/IHBvbHltYXAgOiBiaW1hcDtcbiAgICBvdXRwdXQgPSBpbnB1dCA9IG51bGw7XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgIHJldHVybiB4ID09IG51bGwgfHwgaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiAob3V0cHV0IHx8IChvdXRwdXQgPSBwaWVjZXdpc2UoZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCByYW5nZSwgaW50ZXJwb2xhdGUpKSkodHJhbnNmb3JtKGNsYW1wKHgpKSk7XG4gIH1cblxuICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIGNsYW1wKHVudHJhbnNmb3JtKChpbnB1dCB8fCAoaW5wdXQgPSBwaWVjZXdpc2UocmFuZ2UsIGRvbWFpbi5tYXAodHJhbnNmb3JtKSwgaW50ZXJwb2xhdGVOdW1iZXIpKSkoeSkpKTtcbiAgfTtcblxuICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gQXJyYXkuZnJvbShfLCBudW1iZXIpLCByZXNjYWxlKCkpIDogZG9tYWluLnNsaWNlKCk7XG4gIH07XG5cbiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBBcnJheS5mcm9tKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTtcbiAgfTtcblxuICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiByYW5nZSA9IEFycmF5LmZyb20oXyksIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVSb3VuZCwgcmVzY2FsZSgpO1xuICB9O1xuXG4gIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gXyA/IHRydWUgOiBpZGVudGl0eSwgcmVzY2FsZSgpKSA6IGNsYW1wICE9PSBpZGVudGl0eTtcbiAgfTtcblxuICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHJlc2NhbGUoKSkgOiBpbnRlcnBvbGF0ZTtcbiAgfTtcblxuICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbih0LCB1KSB7XG4gICAgdHJhbnNmb3JtID0gdCwgdW50cmFuc2Zvcm0gPSB1O1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRpbnVvdXMoKSB7XG4gIHJldHVybiB0cmFuc2Zvcm1lcigpKGlkZW50aXR5LCBpZGVudGl0eSk7XG59XG4iLCAiaW1wb3J0IHt0aWNrU3RlcH0gZnJvbSBcImQzLWFycmF5XCI7XG5pbXBvcnQge2Zvcm1hdCwgZm9ybWF0UHJlZml4LCBmb3JtYXRTcGVjaWZpZXIsIHByZWNpc2lvbkZpeGVkLCBwcmVjaXNpb25QcmVmaXgsIHByZWNpc2lvblJvdW5kfSBmcm9tIFwiZDMtZm9ybWF0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpY2tGb3JtYXQoc3RhcnQsIHN0b3AsIGNvdW50LCBzcGVjaWZpZXIpIHtcbiAgdmFyIHN0ZXAgPSB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpLFxuICAgICAgcHJlY2lzaW9uO1xuICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyID09IG51bGwgPyBcIixmXCIgOiBzcGVjaWZpZXIpO1xuICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7XG4gICAgY2FzZSBcInNcIjoge1xuICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSk7XG4gICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbjtcbiAgICAgIHJldHVybiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSk7XG4gICAgfVxuICAgIGNhc2UgXCJcIjpcbiAgICBjYXNlIFwiZVwiOlxuICAgIGNhc2UgXCJnXCI6XG4gICAgY2FzZSBcInBcIjpcbiAgICBjYXNlIFwiclwiOiB7XG4gICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25Sb3VuZChzdGVwLCBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSBcImVcIik7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZcIjpcbiAgICBjYXNlIFwiJVwiOiB7XG4gICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25GaXhlZChzdGVwKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09IFwiJVwiKSAqIDI7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChzcGVjaWZpZXIpO1xufVxuIiwgImltcG9ydCB7dGlja3MsIHRpY2tJbmNyZW1lbnR9IGZyb20gXCJkMy1hcnJheVwiO1xuaW1wb3J0IGNvbnRpbnVvdXMsIHtjb3B5fSBmcm9tIFwiLi9jb250aW51b3VzLmpzXCI7XG5pbXBvcnQge2luaXRSYW5nZX0gZnJvbSBcIi4vaW5pdC5qc1wiO1xuaW1wb3J0IHRpY2tGb3JtYXQgZnJvbSBcIi4vdGlja0Zvcm1hdC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZWFyaXNoKHNjYWxlKSB7XG4gIHZhciBkb21haW4gPSBzY2FsZS5kb21haW47XG5cbiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIHZhciBkID0gZG9tYWluKCk7XG4gICAgcmV0dXJuIHRpY2tzKGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQpO1xuICB9O1xuXG4gIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7XG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICByZXR1cm4gdGlja0Zvcm1hdChkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50LCBzcGVjaWZpZXIpO1xuICB9O1xuXG4gIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihjb3VudCkge1xuICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwO1xuXG4gICAgdmFyIGQgPSBkb21haW4oKTtcbiAgICB2YXIgaTAgPSAwO1xuICAgIHZhciBpMSA9IGQubGVuZ3RoIC0gMTtcbiAgICB2YXIgc3RhcnQgPSBkW2kwXTtcbiAgICB2YXIgc3RvcCA9IGRbaTFdO1xuICAgIHZhciBwcmVzdGVwO1xuICAgIHZhciBzdGVwO1xuICAgIHZhciBtYXhJdGVyID0gMTA7XG5cbiAgICBpZiAoc3RvcCA8IHN0YXJ0KSB7XG4gICAgICBzdGVwID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IHN0ZXA7XG4gICAgICBzdGVwID0gaTAsIGkwID0gaTEsIGkxID0gc3RlcDtcbiAgICB9XG4gICAgXG4gICAgd2hpbGUgKG1heEl0ZXItLSA+IDApIHtcbiAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgICBpZiAoc3RlcCA9PT0gcHJlc3RlcCkge1xuICAgICAgICBkW2kwXSA9IHN0YXJ0XG4gICAgICAgIGRbaTFdID0gc3RvcFxuICAgICAgICByZXR1cm4gZG9tYWluKGQpO1xuICAgICAgfSBlbHNlIGlmIChzdGVwID4gMCkge1xuICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICAgIHN0b3AgPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHByZXN0ZXAgPSBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiBzY2FsZTtcbiAgfTtcblxuICByZXR1cm4gc2NhbGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmVhcigpIHtcbiAgdmFyIHNjYWxlID0gY29udGludW91cygpO1xuXG4gIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY29weShzY2FsZSwgbGluZWFyKCkpO1xuICB9O1xuXG4gIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTtcblxuICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgdmFyIG4gPSBzcGVjaWZpZXIubGVuZ3RoIC8gNiB8IDAsIGNvbG9ycyA9IG5ldyBBcnJheShuKSwgaSA9IDA7XG4gIHdoaWxlIChpIDwgbikgY29sb3JzW2ldID0gXCIjXCIgKyBzcGVjaWZpZXIuc2xpY2UoaSAqIDYsICsraSAqIDYpO1xuICByZXR1cm4gY29sb3JzO1xufVxuIiwgImltcG9ydCBjb2xvcnMgZnJvbSBcIi4uL2NvbG9ycy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjb2xvcnMoXCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2ZcIik7XG4iLCAiaW1wb3J0IHtjdWJlaGVsaXh9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgdmFyIHdhcm0gPSBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpO1xuXG5leHBvcnQgdmFyIGNvb2wgPSBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KDI2MCwgMC43NSwgMC4zNSksIGN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7XG5cbnZhciBjID0gY3ViZWhlbGl4KCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHQpIHtcbiAgaWYgKHQgPCAwIHx8IHQgPiAxKSB0IC09IE1hdGguZmxvb3IodCk7XG4gIHZhciB0cyA9IE1hdGguYWJzKHQgLSAwLjUpO1xuICBjLmggPSAzNjAgKiB0IC0gMTAwO1xuICBjLnMgPSAxLjUgLSAxLjUgKiB0cztcbiAgYy5sID0gMC44IC0gMC45ICogdHM7XG4gIHJldHVybiBjICsgXCJcIjtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJleHBvcnQgdmFyIGFicyA9IE1hdGguYWJzO1xuZXhwb3J0IHZhciBhdGFuMiA9IE1hdGguYXRhbjI7XG5leHBvcnQgdmFyIGNvcyA9IE1hdGguY29zO1xuZXhwb3J0IHZhciBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCB2YXIgbWluID0gTWF0aC5taW47XG5leHBvcnQgdmFyIHNpbiA9IE1hdGguc2luO1xuZXhwb3J0IHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG5leHBvcnQgdmFyIGVwc2lsb24gPSAxZS0xMjtcbmV4cG9ydCB2YXIgcGkgPSBNYXRoLlBJO1xuZXhwb3J0IHZhciBoYWxmUGkgPSBwaSAvIDI7XG5leHBvcnQgdmFyIHRhdSA9IDIgKiBwaTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjb3MoeCkge1xuICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gcGkgOiBNYXRoLmFjb3MoeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2luKHgpIHtcbiAgcmV0dXJuIHggPj0gMSA/IGhhbGZQaSA6IHggPD0gLTEgPyAtaGFsZlBpIDogTWF0aC5hc2luKHgpO1xufVxuIiwgImltcG9ydCB7cGF0aH0gZnJvbSBcImQzLXBhdGhcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IHthYnMsIGFjb3MsIGFzaW4sIGF0YW4yLCBjb3MsIGVwc2lsb24sIGhhbGZQaSwgbWF4LCBtaW4sIHBpLCBzaW4sIHNxcnQsIHRhdX0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBhcmNJbm5lclJhZGl1cyhkKSB7XG4gIHJldHVybiBkLmlubmVyUmFkaXVzO1xufVxuXG5mdW5jdGlvbiBhcmNPdXRlclJhZGl1cyhkKSB7XG4gIHJldHVybiBkLm91dGVyUmFkaXVzO1xufVxuXG5mdW5jdGlvbiBhcmNTdGFydEFuZ2xlKGQpIHtcbiAgcmV0dXJuIGQuc3RhcnRBbmdsZTtcbn1cblxuZnVuY3Rpb24gYXJjRW5kQW5nbGUoZCkge1xuICByZXR1cm4gZC5lbmRBbmdsZTtcbn1cblxuZnVuY3Rpb24gYXJjUGFkQW5nbGUoZCkge1xuICByZXR1cm4gZCAmJiBkLnBhZEFuZ2xlOyAvLyBOb3RlOiBvcHRpb25hbCFcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mykge1xuICB2YXIgeDEwID0geDEgLSB4MCwgeTEwID0geTEgLSB5MCxcbiAgICAgIHgzMiA9IHgzIC0geDIsIHkzMiA9IHkzIC0geTIsXG4gICAgICB0ID0geTMyICogeDEwIC0geDMyICogeTEwO1xuICBpZiAodCAqIHQgPCBlcHNpbG9uKSByZXR1cm47XG4gIHQgPSAoeDMyICogKHkwIC0geTIpIC0geTMyICogKHgwIC0geDIpKSAvIHQ7XG4gIHJldHVybiBbeDAgKyB0ICogeDEwLCB5MCArIHQgKiB5MTBdO1xufVxuXG4vLyBDb21wdXRlIHBlcnBlbmRpY3VsYXIgb2Zmc2V0IGxpbmUgb2YgbGVuZ3RoIHJjLlxuLy8gaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9DaXJjbGUtTGluZUludGVyc2VjdGlvbi5odG1sXG5mdW5jdGlvbiBjb3JuZXJUYW5nZW50cyh4MCwgeTAsIHgxLCB5MSwgcjEsIHJjLCBjdykge1xuICB2YXIgeDAxID0geDAgLSB4MSxcbiAgICAgIHkwMSA9IHkwIC0geTEsXG4gICAgICBsbyA9IChjdyA/IHJjIDogLXJjKSAvIHNxcnQoeDAxICogeDAxICsgeTAxICogeTAxKSxcbiAgICAgIG94ID0gbG8gKiB5MDEsXG4gICAgICBveSA9IC1sbyAqIHgwMSxcbiAgICAgIHgxMSA9IHgwICsgb3gsXG4gICAgICB5MTEgPSB5MCArIG95LFxuICAgICAgeDEwID0geDEgKyBveCxcbiAgICAgIHkxMCA9IHkxICsgb3ksXG4gICAgICB4MDAgPSAoeDExICsgeDEwKSAvIDIsXG4gICAgICB5MDAgPSAoeTExICsgeTEwKSAvIDIsXG4gICAgICBkeCA9IHgxMCAtIHgxMSxcbiAgICAgIGR5ID0geTEwIC0geTExLFxuICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSxcbiAgICAgIHIgPSByMSAtIHJjLFxuICAgICAgRCA9IHgxMSAqIHkxMCAtIHgxMCAqIHkxMSxcbiAgICAgIGQgPSAoZHkgPCAwID8gLTEgOiAxKSAqIHNxcnQobWF4KDAsIHIgKiByICogZDIgLSBEICogRCkpLFxuICAgICAgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMixcbiAgICAgIGN5MCA9ICgtRCAqIGR4IC0gZHkgKiBkKSAvIGQyLFxuICAgICAgY3gxID0gKEQgKiBkeSArIGR4ICogZCkgLyBkMixcbiAgICAgIGN5MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLFxuICAgICAgZHgwID0gY3gwIC0geDAwLFxuICAgICAgZHkwID0gY3kwIC0geTAwLFxuICAgICAgZHgxID0gY3gxIC0geDAwLFxuICAgICAgZHkxID0gY3kxIC0geTAwO1xuXG4gIC8vIFBpY2sgdGhlIGNsb3NlciBvZiB0aGUgdHdvIGludGVyc2VjdGlvbiBwb2ludHMuXG4gIC8vIFRPRE8gSXMgdGhlcmUgYSBmYXN0ZXIgd2F5IHRvIGRldGVybWluZSB3aGljaCBpbnRlcnNlY3Rpb24gdG8gdXNlP1xuICBpZiAoZHgwICogZHgwICsgZHkwICogZHkwID4gZHgxICogZHgxICsgZHkxICogZHkxKSBjeDAgPSBjeDEsIGN5MCA9IGN5MTtcblxuICByZXR1cm4ge1xuICAgIGN4OiBjeDAsXG4gICAgY3k6IGN5MCxcbiAgICB4MDE6IC1veCxcbiAgICB5MDE6IC1veSxcbiAgICB4MTE6IGN4MCAqIChyMSAvIHIgLSAxKSxcbiAgICB5MTE6IGN5MCAqIChyMSAvIHIgLSAxKVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGlubmVyUmFkaXVzID0gYXJjSW5uZXJSYWRpdXMsXG4gICAgICBvdXRlclJhZGl1cyA9IGFyY091dGVyUmFkaXVzLFxuICAgICAgY29ybmVyUmFkaXVzID0gY29uc3RhbnQoMCksXG4gICAgICBwYWRSYWRpdXMgPSBudWxsLFxuICAgICAgc3RhcnRBbmdsZSA9IGFyY1N0YXJ0QW5nbGUsXG4gICAgICBlbmRBbmdsZSA9IGFyY0VuZEFuZ2xlLFxuICAgICAgcGFkQW5nbGUgPSBhcmNQYWRBbmdsZSxcbiAgICAgIGNvbnRleHQgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGFyYygpIHtcbiAgICB2YXIgYnVmZmVyLFxuICAgICAgICByLFxuICAgICAgICByMCA9ICtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICByMSA9ICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICBhMCA9IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGZQaSxcbiAgICAgICAgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpLFxuICAgICAgICBkYSA9IGFicyhhMSAtIGEwKSxcbiAgICAgICAgY3cgPSBhMSA+IGEwO1xuXG4gICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpO1xuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIG91dGVyIHJhZGl1cyBpcyBhbHdheXMgbGFyZ2VyIHRoYW4gdGhlIGlubmVyIHJhZGl1cy5cbiAgICBpZiAocjEgPCByMCkgciA9IHIxLCByMSA9IHIwLCByMCA9IHI7XG5cbiAgICAvLyBJcyBpdCBhIHBvaW50P1xuICAgIGlmICghKHIxID4gZXBzaWxvbikpIGNvbnRleHQubW92ZVRvKDAsIDApO1xuXG4gICAgLy8gT3IgaXMgaXQgYSBjaXJjbGUgb3IgYW5udWx1cz9cbiAgICBlbHNlIGlmIChkYSA+IHRhdSAtIGVwc2lsb24pIHtcbiAgICAgIGNvbnRleHQubW92ZVRvKHIxICogY29zKGEwKSwgcjEgKiBzaW4oYTApKTtcbiAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhMCwgYTEsICFjdyk7XG4gICAgICBpZiAocjAgPiBlcHNpbG9uKSB7XG4gICAgICAgIGNvbnRleHQubW92ZVRvKHIwICogY29zKGExKSwgcjAgKiBzaW4oYTEpKTtcbiAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjAsIGExLCBhMCwgY3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9yIGlzIGl0IGEgY2lyY3VsYXIgb3IgYW5udWxhciBzZWN0b3I/XG4gICAgZWxzZSB7XG4gICAgICB2YXIgYTAxID0gYTAsXG4gICAgICAgICAgYTExID0gYTEsXG4gICAgICAgICAgYTAwID0gYTAsXG4gICAgICAgICAgYTEwID0gYTEsXG4gICAgICAgICAgZGEwID0gZGEsXG4gICAgICAgICAgZGExID0gZGEsXG4gICAgICAgICAgYXAgPSBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC8gMixcbiAgICAgICAgICBycCA9IChhcCA+IGVwc2lsb24pICYmIChwYWRSYWRpdXMgPyArcGFkUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzcXJ0KHIwICogcjAgKyByMSAqIHIxKSksXG4gICAgICAgICAgcmMgPSBtaW4oYWJzKHIxIC0gcjApIC8gMiwgK2Nvcm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSxcbiAgICAgICAgICByYzAgPSByYyxcbiAgICAgICAgICByYzEgPSByYyxcbiAgICAgICAgICB0MCxcbiAgICAgICAgICB0MTtcblxuICAgICAgLy8gQXBwbHkgcGFkZGluZz8gTm90ZSB0aGF0IHNpbmNlIHIxIFx1MjI2NSByMCwgZGExIFx1MjI2NSBkYTAuXG4gICAgICBpZiAocnAgPiBlcHNpbG9uKSB7XG4gICAgICAgIHZhciBwMCA9IGFzaW4ocnAgLyByMCAqIHNpbihhcCkpLFxuICAgICAgICAgICAgcDEgPSBhc2luKHJwIC8gcjEgKiBzaW4oYXApKTtcbiAgICAgICAgaWYgKChkYTAgLT0gcDAgKiAyKSA+IGVwc2lsb24pIHAwICo9IChjdyA/IDEgOiAtMSksIGEwMCArPSBwMCwgYTEwIC09IHAwO1xuICAgICAgICBlbHNlIGRhMCA9IDAsIGEwMCA9IGExMCA9IChhMCArIGExKSAvIDI7XG4gICAgICAgIGlmICgoZGExIC09IHAxICogMikgPiBlcHNpbG9uKSBwMSAqPSAoY3cgPyAxIDogLTEpLCBhMDEgKz0gcDEsIGExMSAtPSBwMTtcbiAgICAgICAgZWxzZSBkYTEgPSAwLCBhMDEgPSBhMTEgPSAoYTAgKyBhMSkgLyAyO1xuICAgICAgfVxuXG4gICAgICB2YXIgeDAxID0gcjEgKiBjb3MoYTAxKSxcbiAgICAgICAgICB5MDEgPSByMSAqIHNpbihhMDEpLFxuICAgICAgICAgIHgxMCA9IHIwICogY29zKGExMCksXG4gICAgICAgICAgeTEwID0gcjAgKiBzaW4oYTEwKTtcblxuICAgICAgLy8gQXBwbHkgcm91bmRlZCBjb3JuZXJzP1xuICAgICAgaWYgKHJjID4gZXBzaWxvbikge1xuICAgICAgICB2YXIgeDExID0gcjEgKiBjb3MoYTExKSxcbiAgICAgICAgICAgIHkxMSA9IHIxICogc2luKGExMSksXG4gICAgICAgICAgICB4MDAgPSByMCAqIGNvcyhhMDApLFxuICAgICAgICAgICAgeTAwID0gcjAgKiBzaW4oYTAwKSxcbiAgICAgICAgICAgIG9jO1xuXG4gICAgICAgIC8vIFJlc3RyaWN0IHRoZSBjb3JuZXIgcmFkaXVzIGFjY29yZGluZyB0byB0aGUgc2VjdG9yIGFuZ2xlLlxuICAgICAgICBpZiAoZGEgPCBwaSAmJiAob2MgPSBpbnRlcnNlY3QoeDAxLCB5MDEsIHgwMCwgeTAwLCB4MTEsIHkxMSwgeDEwLCB5MTApKSkge1xuICAgICAgICAgIHZhciBheCA9IHgwMSAtIG9jWzBdLFxuICAgICAgICAgICAgICBheSA9IHkwMSAtIG9jWzFdLFxuICAgICAgICAgICAgICBieCA9IHgxMSAtIG9jWzBdLFxuICAgICAgICAgICAgICBieSA9IHkxMSAtIG9jWzFdLFxuICAgICAgICAgICAgICBrYyA9IDEgLyBzaW4oYWNvcygoYXggKiBieCArIGF5ICogYnkpIC8gKHNxcnQoYXggKiBheCArIGF5ICogYXkpICogc3FydChieCAqIGJ4ICsgYnkgKiBieSkpKSAvIDIpLFxuICAgICAgICAgICAgICBsYyA9IHNxcnQob2NbMF0gKiBvY1swXSArIG9jWzFdICogb2NbMV0pO1xuICAgICAgICAgIHJjMCA9IG1pbihyYywgKHIwIC0gbGMpIC8gKGtjIC0gMSkpO1xuICAgICAgICAgIHJjMSA9IG1pbihyYywgKHIxIC0gbGMpIC8gKGtjICsgMSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElzIHRoZSBzZWN0b3IgY29sbGFwc2VkIHRvIGEgbGluZT9cbiAgICAgIGlmICghKGRhMSA+IGVwc2lsb24pKSBjb250ZXh0Lm1vdmVUbyh4MDEsIHkwMSk7XG5cbiAgICAgIC8vIERvZXMgdGhlIHNlY3Rvclx1MjAxOXMgb3V0ZXIgcmluZyBoYXZlIHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGVsc2UgaWYgKHJjMSA+IGVwc2lsb24pIHtcbiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MDAsIHkwMCwgeDAxLCB5MDEsIHIxLCByYzEsIGN3KTtcbiAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MTEsIHkxMSwgeDEwLCB5MTAsIHIxLCByYzEsIGN3KTtcblxuICAgICAgICBjb250ZXh0Lm1vdmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpO1xuXG4gICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkP1xuICAgICAgICBpZiAocmMxIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGRyYXcgdGhlIHR3byBjb3JuZXJzIGFuZCB0aGUgcmluZy5cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhdGFuMih0MC5jeSArIHQwLnkxMSwgdDAuY3ggKyB0MC54MTEpLCBhdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCAhY3cpO1xuICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBhdGFuMih0MS55MTEsIHQxLngxMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjP1xuICAgICAgZWxzZSBjb250ZXh0Lm1vdmVUbyh4MDEsIHkwMSksIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhMDEsIGExMSwgIWN3KTtcblxuICAgICAgLy8gSXMgdGhlcmUgbm8gaW5uZXIgcmluZywgYW5kIGl0XHUyMDE5cyBhIGNpcmN1bGFyIHNlY3Rvcj9cbiAgICAgIC8vIE9yIHBlcmhhcHMgaXRcdTIwMTlzIGFuIGFubnVsYXIgc2VjdG9yIGNvbGxhcHNlZCBkdWUgdG8gcGFkZGluZz9cbiAgICAgIGlmICghKHIwID4gZXBzaWxvbikgfHwgIShkYTAgPiBlcHNpbG9uKSkgY29udGV4dC5saW5lVG8oeDEwLCB5MTApO1xuXG4gICAgICAvLyBEb2VzIHRoZSBzZWN0b3JcdTIwMTlzIGlubmVyIHJpbmcgKG9yIHBvaW50KSBoYXZlIHJvdW5kZWQgY29ybmVycz9cbiAgICAgIGVsc2UgaWYgKHJjMCA+IGVwc2lsb24pIHtcbiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MTAsIHkxMCwgeDExLCB5MTEsIHIwLCAtcmMwLCBjdyk7XG4gICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMoeDAxLCB5MDEsIHgwMCwgeTAwLCByMCwgLXJjMCwgY3cpO1xuXG4gICAgICAgIGNvbnRleHQubGluZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7XG5cbiAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/XG4gICAgICAgIGlmIChyYzAgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLlxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MC55MTEsIHQwLngxMSksICFjdyk7XG4gICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjAsIGF0YW4yKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yKHQxLmN5ICsgdDEueTExLCB0MS5jeCArIHQxLngxMSksIGN3KTtcbiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMCwgYXRhbjIodDEueTExLCB0MS54MTEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gT3IgaXMgdGhlIGlubmVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz9cbiAgICAgIGVsc2UgY29udGV4dC5hcmMoMCwgMCwgcjAsIGExMCwgYTAwLCBjdyk7XG4gICAgfVxuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHIgPSAoK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyLFxuICAgICAgICBhID0gKCtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyIC0gcGkgLyAyO1xuICAgIHJldHVybiBbY29zKGEpICogciwgc2luKGEpICogcl07XG4gIH07XG5cbiAgYXJjLmlubmVyUmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlubmVyUmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBpbm5lclJhZGl1cztcbiAgfTtcblxuICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3V0ZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IG91dGVyUmFkaXVzO1xuICB9O1xuXG4gIGFyYy5jb3JuZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29ybmVyUmFkaXVzID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBjb3JuZXJSYWRpdXM7XG4gIH07XG5cbiAgYXJjLnBhZFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRSYWRpdXMgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRSYWRpdXM7XG4gIH07XG5cbiAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogc3RhcnRBbmdsZTtcbiAgfTtcblxuICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW5kQW5nbGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGVuZEFuZ2xlO1xuICB9O1xuXG4gIGFyYy5wYWRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogcGFkQW5nbGU7XG4gIH07XG5cbiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGFyYykgOiBjb250ZXh0O1xuICB9O1xuXG4gIHJldHVybiBhcmM7XG59XG4iLCAiZXhwb3J0IHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiB4XG4gICAgPyB4IC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbSh4KTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsICJmdW5jdGlvbiBMaW5lYXIoY29udGV4dCkge1xuICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbn1cblxuTGluZWFyLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9wb2ludCA9IDA7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7XG4gIH0sXG4gIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgeCA9ICt4LCB5ID0gK3k7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhaztcbiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkXG4gICAgICBkZWZhdWx0OiB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgTGluZWFyKGNvbnRleHQpO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiB4KHApIHtcbiAgcmV0dXJuIHBbMF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5KHApIHtcbiAgcmV0dXJuIHBbMV07XG59XG4iLCAiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuL2FycmF5LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBjdXJ2ZUxpbmVhciBmcm9tIFwiLi9jdXJ2ZS9saW5lYXIuanNcIjtcbmltcG9ydCB7eCBhcyBwb2ludFgsIHkgYXMgcG9pbnRZfSBmcm9tIFwiLi9wb2ludC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4LCB5KSB7XG4gIHZhciBkZWZpbmVkID0gY29uc3RhbnQodHJ1ZSksXG4gICAgICBjb250ZXh0ID0gbnVsbCxcbiAgICAgIGN1cnZlID0gY3VydmVMaW5lYXIsXG4gICAgICBvdXRwdXQgPSBudWxsO1xuXG4gIHggPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6ICh4ID09PSB1bmRlZmluZWQpID8gcG9pbnRYIDogY29uc3RhbnQoeCk7XG4gIHkgPSB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geSA6ICh5ID09PSB1bmRlZmluZWQpID8gcG9pbnRZIDogY29uc3RhbnQoeSk7XG5cbiAgZnVuY3Rpb24gbGluZShkYXRhKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSAoZGF0YSA9IGFycmF5KGRhdGEpKS5sZW5ndGgsXG4gICAgICAgIGQsXG4gICAgICAgIGRlZmluZWQwID0gZmFsc2UsXG4gICAgICAgIGJ1ZmZlcjtcblxuICAgIGlmIChjb250ZXh0ID09IG51bGwpIG91dHB1dCA9IGN1cnZlKGJ1ZmZlciA9IHBhdGgoKSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkge1xuICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkge1xuICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIG91dHB1dC5saW5lU3RhcnQoKTtcbiAgICAgICAgZWxzZSBvdXRwdXQubGluZUVuZCgpO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmluZWQwKSBvdXRwdXQucG9pbnQoK3goZCwgaSwgZGF0YSksICt5KGQsIGksIGRhdGEpKTtcbiAgICB9XG5cbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVmZmVyICsgXCJcIiB8fCBudWxsO1xuICB9XG5cbiAgbGluZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB4O1xuICB9O1xuXG4gIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmUpIDogeTtcbiAgfTtcblxuICBsaW5lLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVmaW5lZCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgbGluZSkgOiBkZWZpbmVkO1xuICB9O1xuXG4gIGxpbmUuY3VydmUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgbGluZSkgOiBjdXJ2ZTtcbiAgfTtcblxuICBsaW5lLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGxpbmUpIDogY29udGV4dDtcbiAgfTtcblxuICByZXR1cm4gbGluZTtcbn1cbiIsICJpbXBvcnQgY3VydmVMaW5lYXIgZnJvbSBcIi4vbGluZWFyLmpzXCI7XG5cbmV4cG9ydCB2YXIgY3VydmVSYWRpYWxMaW5lYXIgPSBjdXJ2ZVJhZGlhbChjdXJ2ZUxpbmVhcik7XG5cbmZ1bmN0aW9uIFJhZGlhbChjdXJ2ZSkge1xuICB0aGlzLl9jdXJ2ZSA9IGN1cnZlO1xufVxuXG5SYWRpYWwucHJvdG90eXBlID0ge1xuICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmFyZWFTdGFydCgpO1xuICB9LFxuICBhcmVhRW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9jdXJ2ZS5hcmVhRW5kKCk7XG4gIH0sXG4gIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fY3VydmUubGluZVN0YXJ0KCk7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2N1cnZlLmxpbmVFbmQoKTtcbiAgfSxcbiAgcG9pbnQ6IGZ1bmN0aW9uKGEsIHIpIHtcbiAgICB0aGlzLl9jdXJ2ZS5wb2ludChyICogTWF0aC5zaW4oYSksIHIgKiAtTWF0aC5jb3MoYSkpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJ2ZVJhZGlhbChjdXJ2ZSkge1xuXG4gIGZ1bmN0aW9uIHJhZGlhbChjb250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBSYWRpYWwoY3VydmUoY29udGV4dCkpO1xuICB9XG5cbiAgcmFkaWFsLl9jdXJ2ZSA9IGN1cnZlO1xuXG4gIHJldHVybiByYWRpYWw7XG59XG4iLCAiaW1wb3J0IGN1cnZlUmFkaWFsLCB7Y3VydmVSYWRpYWxMaW5lYXJ9IGZyb20gXCIuL2N1cnZlL3JhZGlhbC5qc1wiO1xuaW1wb3J0IGxpbmUgZnJvbSBcIi4vbGluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluZVJhZGlhbChsKSB7XG4gIHZhciBjID0gbC5jdXJ2ZTtcblxuICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54O1xuICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTtcblxuICBsLmN1cnZlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gYyhjdXJ2ZVJhZGlhbChfKSkgOiBjKCkuX2N1cnZlO1xuICB9O1xuXG4gIHJldHVybiBsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGxpbmVSYWRpYWwobGluZSgpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyKSk7XG59XG4iLCAiaW1wb3J0IHtwYXRofSBmcm9tIFwiZDMtcGF0aFwiO1xuaW1wb3J0IHtzbGljZX0gZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQge3ggYXMgcG9pbnRYLCB5IGFzIHBvaW50WX0gZnJvbSBcIi4uL3BvaW50LmpzXCI7XG5pbXBvcnQgcG9pbnRSYWRpYWwgZnJvbSBcIi4uL3BvaW50UmFkaWFsLmpzXCI7XG5cbmZ1bmN0aW9uIGxpbmtTb3VyY2UoZCkge1xuICByZXR1cm4gZC5zb3VyY2U7XG59XG5cbmZ1bmN0aW9uIGxpbmtUYXJnZXQoZCkge1xuICByZXR1cm4gZC50YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIGxpbmsoY3VydmUpIHtcbiAgdmFyIHNvdXJjZSA9IGxpbmtTb3VyY2UsXG4gICAgICB0YXJnZXQgPSBsaW5rVGFyZ2V0LFxuICAgICAgeCA9IHBvaW50WCxcbiAgICAgIHkgPSBwb2ludFksXG4gICAgICBjb250ZXh0ID0gbnVsbDtcblxuICBmdW5jdGlvbiBsaW5rKCkge1xuICAgIHZhciBidWZmZXIsIGFyZ3YgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyksIHMgPSBzb3VyY2UuYXBwbHkodGhpcywgYXJndiksIHQgPSB0YXJnZXQuYXBwbHkodGhpcywgYXJndik7XG4gICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpO1xuICAgIGN1cnZlKGNvbnRleHQsICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gcywgYXJndikpLCAreS5hcHBseSh0aGlzLCBhcmd2KSwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksICt5LmFwcGx5KHRoaXMsIGFyZ3YpKTtcbiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArIFwiXCIgfHwgbnVsbDtcbiAgfVxuXG4gIGxpbmsuc291cmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvdXJjZSA9IF8sIGxpbmspIDogc291cmNlO1xuICB9O1xuXG4gIGxpbmsudGFyZ2V0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldCA9IF8sIGxpbmspIDogdGFyZ2V0O1xuICB9O1xuXG4gIGxpbmsueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmspIDogeDtcbiAgfTtcblxuICBsaW5rLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5rKSA6IHk7XG4gIH07XG5cbiAgbGluay5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCBsaW5rKSA6IGNvbnRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIGxpbms7XG59XG5cbmZ1bmN0aW9uIGN1cnZlSG9yaXpvbnRhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkge1xuICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApO1xuICBjb250ZXh0LmJlemllckN1cnZlVG8oeDAgPSAoeDAgKyB4MSkgLyAyLCB5MCwgeDAsIHkxLCB4MSwgeTEpO1xufVxuXG5mdW5jdGlvbiBjdXJ2ZVZlcnRpY2FsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7XG4gIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyLCB4MSwgeTAsIHgxLCB5MSk7XG59XG5cbmZ1bmN0aW9uIGN1cnZlUmFkaWFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7XG4gIHZhciBwMCA9IHBvaW50UmFkaWFsKHgwLCB5MCksXG4gICAgICBwMSA9IHBvaW50UmFkaWFsKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIpLFxuICAgICAgcDIgPSBwb2ludFJhZGlhbCh4MSwgeTApLFxuICAgICAgcDMgPSBwb2ludFJhZGlhbCh4MSwgeTEpO1xuICBjb250ZXh0Lm1vdmVUbyhwMFswXSwgcDBbMV0pO1xuICBjb250ZXh0LmJlemllckN1cnZlVG8ocDFbMF0sIHAxWzFdLCBwMlswXSwgcDJbMV0sIHAzWzBdLCBwM1sxXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rSG9yaXpvbnRhbCgpIHtcbiAgcmV0dXJuIGxpbmsoY3VydmVIb3Jpem9udGFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtWZXJ0aWNhbCgpIHtcbiAgcmV0dXJuIGxpbmsoY3VydmVWZXJ0aWNhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rUmFkaWFsKCkge1xuICB2YXIgbCA9IGxpbmsoY3VydmVSYWRpYWwpO1xuICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54O1xuICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTtcbiAgcmV0dXJuIGw7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHBvaW50KHRoYXQsIHgsIHkpIHtcbiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKFxuICAgICgyICogdGhhdC5feDAgKyB0aGF0Ll94MSkgLyAzLFxuICAgICgyICogdGhhdC5feTAgKyB0aGF0Ll95MSkgLyAzLFxuICAgICh0aGF0Ll94MCArIDIgKiB0aGF0Ll94MSkgLyAzLFxuICAgICh0aGF0Ll95MCArIDIgKiB0aGF0Ll95MSkgLyAzLFxuICAgICh0aGF0Ll94MCArIDQgKiB0aGF0Ll94MSArIHgpIC8gNixcbiAgICAodGhhdC5feTAgKyA0ICogdGhhdC5feTEgKyB5KSAvIDZcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHtcbiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbkJhc2lzLnByb3RvdHlwZSA9IHtcbiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9saW5lID0gMDtcbiAgfSxcbiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fbGluZSA9IE5hTjtcbiAgfSxcbiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID1cbiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOO1xuICAgIHRoaXMuX3BvaW50ID0gMDtcbiAgfSxcbiAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgc3dpdGNoICh0aGlzLl9wb2ludCkge1xuICAgICAgY2FzZSAzOiBwb2ludCh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyAvLyBwcm9jZWVkXG4gICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHggPSAreCwgeSA9ICt5O1xuICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHtcbiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7XG4gICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7XG4gICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fY29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5feTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZFxuICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7XG4gICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5O1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHJldHVybiBuZXcgQmFzaXMoY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHtCYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZnVuY3Rpb24gQnVuZGxlKGNvbnRleHQsIGJldGEpIHtcbiAgdGhpcy5fYmFzaXMgPSBuZXcgQmFzaXMoY29udGV4dCk7XG4gIHRoaXMuX2JldGEgPSBiZXRhO1xufVxuXG5CdW5kbGUucHJvdG90eXBlID0ge1xuICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3ggPSBbXTtcbiAgICB0aGlzLl95ID0gW107XG4gICAgdGhpcy5fYmFzaXMubGluZVN0YXJ0KCk7XG4gIH0sXG4gIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgIHZhciB4ID0gdGhpcy5feCxcbiAgICAgICAgeSA9IHRoaXMuX3ksXG4gICAgICAgIGogPSB4Lmxlbmd0aCAtIDE7XG5cbiAgICBpZiAoaiA+IDApIHtcbiAgICAgIHZhciB4MCA9IHhbMF0sXG4gICAgICAgICAgeTAgPSB5WzBdLFxuICAgICAgICAgIGR4ID0geFtqXSAtIHgwLFxuICAgICAgICAgIGR5ID0geVtqXSAtIHkwLFxuICAgICAgICAgIGkgPSAtMSxcbiAgICAgICAgICB0O1xuXG4gICAgICB3aGlsZSAoKytpIDw9IGopIHtcbiAgICAgICAgdCA9IGkgLyBqO1xuICAgICAgICB0aGlzLl9iYXNpcy5wb2ludChcbiAgICAgICAgICB0aGlzLl9iZXRhICogeFtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeDAgKyB0ICogZHgpLFxuICAgICAgICAgIHRoaXMuX2JldGEgKiB5W2ldICsgKDEgLSB0aGlzLl9iZXRhKSAqICh5MCArIHQgKiBkeSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7XG4gICAgdGhpcy5fYmFzaXMubGluZUVuZCgpO1xuICB9LFxuICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgIHRoaXMuX3gucHVzaCgreCk7XG4gICAgdGhpcy5feS5wdXNoKCt5KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIGN1c3RvbShiZXRhKSB7XG5cbiAgZnVuY3Rpb24gYnVuZGxlKGNvbnRleHQpIHtcbiAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNpcyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7XG4gIH1cblxuICBidW5kbGUuYmV0YSA9IGZ1bmN0aW9uKGJldGEpIHtcbiAgICByZXR1cm4gY3VzdG9tKCtiZXRhKTtcbiAgfTtcblxuICByZXR1cm4gYnVuZGxlO1xufSkoMC44NSk7XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFpvb21FdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICB0YXJnZXQsXG4gIHRyYW5zZm9ybSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRyYW5zZm9ybToge3ZhbHVlOiB0cmFuc2Zvcm0sIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVab29tfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbi8vIGV4Y2VwdCBmb3IgcGluY2gtdG8tem9vbSwgd2hpY2ggaXMgc2VudCBhcyBhIHdoZWVsK2N0cmxLZXkgZXZlbnRcbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICghZXZlbnQuY3RybEtleSB8fCBldmVudC50eXBlID09PSAnd2hlZWwnKSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXM7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDtcbiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07XG4gICAgfVxuICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKGV2ZW50KSB7XG4gIHJldHVybiAtZXZlbnQuZGVsdGFZICogKGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDAuMDUgOiBldmVudC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpICogKGV2ZW50LmN0cmxLZXkgPyAxMCA6IDEpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29uc3RyYWluKHRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpIHtcbiAgdmFyIGR4MCA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFswXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMF0sXG4gICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLFxuICAgICAgZHkwID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzBdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVsxXSxcbiAgICAgIGR5MSA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFsxXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMV07XG4gIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKFxuICAgIGR4MSA+IGR4MCA/IChkeDAgKyBkeDEpIC8gMiA6IE1hdGgubWluKDAsIGR4MCkgfHwgTWF0aC5tYXgoMCwgZHgxKSxcbiAgICBkeTEgPiBkeTAgPyAoZHkwICsgZHkxKSAvIDIgOiBNYXRoLm1pbigwLCBkeTApIHx8IE1hdGgubWF4KDAsIGR5MSlcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCxcbiAgICAgIGNvbnN0cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sXG4gICAgICB3aGVlbERlbHRhID0gZGVmYXVsdFdoZWVsRGVsdGEsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLFxuICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSxcbiAgICAgIGR1cmF0aW9uID0gMjUwLFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiem9vbVwiLCBcImVuZFwiKSxcbiAgICAgIHRvdWNoc3RhcnRpbmcsXG4gICAgICB0b3VjaGZpcnN0LFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICB0b3VjaERlbGF5ID0gNTAwLFxuICAgICAgd2hlZWxEZWxheSA9IDE1MCxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMCxcbiAgICAgIHRhcERpc3RhbmNlID0gMTA7XG5cbiAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pXG4gICAgICAgIC5vbihcIndoZWVsLnpvb21cIiwgd2hlZWxlZClcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vkb3duZWQpXG4gICAgICAgIC5vbihcImRibGNsaWNrLnpvb21cIiwgZGJsY2xpY2tlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuem9vbVwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb21cIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24uaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgLmV2ZW50KGV2ZW50KVxuICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgLnpvb20obnVsbCwgdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pXG4gICAgICAgICAgLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHpvb20uc2NhbGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBrMCAqIGsxO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnNjYWxlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHAsXG4gICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB5XG4gICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBudWxsLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteVxuICAgICAgKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7XG4gICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpO1xuICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkge1xuICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAqIHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rO1xuICAgIHJldHVybiB4ID09PSB0cmFuc2Zvcm0ueCAmJiB5ID09PSB0cmFuc2Zvcm0ueSA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0odHJhbnNmb3JtLmssIHgsIHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7XG4gICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUodHJhbnNpdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB0cmFuc2l0aW9uXG4gICAgICAgIC5vbihcInN0YXJ0Lnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuc3RhcnQoKTsgfSlcbiAgICAgICAgLm9uKFwiaW50ZXJydXB0Lnpvb20gZW5kLnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuZW5kKCk7IH0pXG4gICAgICAgIC50d2VlbihcInpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0LCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IHBvaW50LmFwcGx5KHRoYXQsIGFyZ3MpIDogcG9pbnQsXG4gICAgICAgICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0pLFxuICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sXG4gICAgICAgICAgICAgIGIgPSB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLlxuICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH1cbiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhhdCwgYXJncyk7XG4gIH1cblxuICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuc291cmNlRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgIHRoaXMudGFwcyA9IDA7XG4gIH1cblxuICBHZXN0dXJlLnByb3RvdHlwZSA9IHtcbiAgICBldmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCkgdGhpcy5zb3VyY2VFdmVudCA9IGV2ZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkge1xuICAgICAgICB0aGlzLnRoYXQuX196b29taW5nID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWl0KFwic3RhcnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7XG4gICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09IFwibW91c2VcIikgdGhpcy5tb3VzZVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDAgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMFswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7XG4gICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtO1xuICAgICAgdGhpcy5lbWl0KFwiem9vbVwiKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nO1xuICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBab29tRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiB0aGlzLnNvdXJjZUV2ZW50LFxuICAgICAgICAgIHRhcmdldDogem9vbSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy50aGF0Ll9fem9vbSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiB3aGVlbGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgdC5rICogTWF0aC5wb3coMiwgd2hlZWxEZWx0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSkpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCk7XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlLCByZXVzZSBpdC5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuXG4gICAgaWYgKGcud2hlZWwpIHtcbiAgICAgIGlmIChnLm1vdXNlWzBdWzBdICE9PSBwWzBdIHx8IGcubW91c2VbMF1bMV0gIT09IHBbMV0pIHtcbiAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dChnLndoZWVsKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIHdoZWVsIGV2ZW50IHdvblx1MjAxOXQgdHJpZ2dlciBhIHRyYW5zZm9ybSBjaGFuZ2UsIGlnbm9yZSBpdC5cbiAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjtcblxuICAgIC8vIE90aGVyd2lzZSwgY2FwdHVyZSB0aGUgbW91c2UgcG9pbnQgYW5kIGxvY2F0aW9uIGF0IHRoZSBzdGFydC5cbiAgICBlbHNlIHtcbiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpO1xuICAgIGcuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG5cbiAgICBmdW5jdGlvbiB3aGVlbGlkbGVkKCkge1xuICAgICAgZy53aGVlbCA9IG51bGw7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCB0cnVlKS5ldmVudChldmVudCksXG4gICAgICAgIHYgPSBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZW1vdmVkLCB0cnVlKS5vbihcIm1vdXNldXAuem9vbVwiLCBtb3VzZXVwcGVkLCB0cnVlKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLFxuICAgICAgICBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBnLm1vdXNlID0gW3AsIHRoaXMuX196b29tLmludmVydChwKV07XG4gICAgaW50ZXJydXB0KHRoaXMpO1xuICAgIGcuc3RhcnQoKTtcblxuICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy5ldmVudChldmVudClcbiAgICAgICAuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICAgIHYub24oXCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb21cIiwgbnVsbCk7XG4gICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIGcubW92ZWQpO1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBnLmV2ZW50KGV2ZW50KS5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkYmxjbGlja2VkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IHBvaW50ZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXMgPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50LCB0aGlzKSxcbiAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICBrMSA9IHQwLmsgKiAoZXZlbnQuc2hpZnRLZXkgPyAwLjUgOiAyKSxcbiAgICAgICAgdDEgPSBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGV4dGVudC5hcHBseSh0aGlzLCBhcmdzKSwgdHJhbnNsYXRlRXh0ZW50KTtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGlmIChkdXJhdGlvbiA+IDApIHNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pLmNhbGwoc2NoZWR1bGUsIHQxLCBwMCwgZXZlbnQpO1xuICAgIGVsc2Ugc2VsZWN0KHRoaXMpLmNhbGwoem9vbS50cmFuc2Zvcm0sIHQxLCBwMCwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4pLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRlZCwgaSwgdCwgcDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdO1xuICAgICAgaWYgKCFnLnRvdWNoMCkgZy50b3VjaDAgPSBwLCBzdGFydGVkID0gdHJ1ZSwgZy50YXBzID0gMSArICEhdG91Y2hzdGFydGluZztcbiAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBnLnRhcHMgPSAwO1xuICAgIH1cblxuICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpO1xuXG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGlmIChnLnRhcHMgPCAyKSB0b3VjaGZpcnN0ID0gcFswXSwgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwLCBsO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDtcbiAgICB9XG4gICAgdCA9IGcudGhhdC5fX3pvb207XG4gICAgaWYgKGcudG91Y2gxKSB7XG4gICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSxcbiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLFxuICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsXG4gICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDtcbiAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpO1xuICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTtcbiAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07XG4gICAgfVxuICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTtcbiAgICBlbHNlIHJldHVybjtcblxuICAgIGcuem9vbShcInRvdWNoXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICB9XG4gICAgaWYgKGcudG91Y2gxICYmICFnLnRvdWNoMCkgZy50b3VjaDAgPSBnLnRvdWNoMSwgZGVsZXRlIGcudG91Y2gxO1xuICAgIGlmIChnLnRvdWNoMCkgZy50b3VjaDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pO1xuICAgIGVsc2Uge1xuICAgICAgZy5lbmQoKTtcbiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAob3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci5cbiAgICAgIGlmIChnLnRhcHMgPT09IDIpIHtcbiAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICAgIGlmIChNYXRoLmh5cG90KHRvdWNoZmlyc3RbMF0gLSB0WzBdLCB0b3VjaGZpcnN0WzFdIC0gdFsxXSkgPCB0YXBEaXN0YW5jZSkge1xuICAgICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKFwiZGJsY2xpY2suem9vbVwiKTtcbiAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgem9vbSkgOiB3aGVlbERlbHRhO1xuICB9O1xuXG4gIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7XG4gIH07XG5cbiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZUV4dGVudFswXSA9ICtfWzBdLCBzY2FsZUV4dGVudFsxXSA9ICtfWzFdLCB6b29tKSA6IFtzY2FsZUV4dGVudFswXSwgc2NhbGVFeHRlbnRbMV1dO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTtcbiAgfTtcblxuICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjtcbiAgfTtcblxuICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR1cmF0aW9uID0gK18sIHpvb20pIDogZHVyYXRpb247XG4gIH07XG5cbiAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgem9vbS5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7XG4gIH07XG5cbiAgem9vbS5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgem9vbS50YXBEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXBEaXN0YW5jZSA9ICtfLCB6b29tKSA6IHRhcERpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufVxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgeyBNb2RhbCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBWaXNDb21wIGZyb20gXCIuLi9Db21wb25lbnRzL1Zpc0NvbXAuc3ZlbHRlXCI7XHJcbmltcG9ydCB0eXBlIHsgQWRqTGlzdEl0ZW0sIGQzR3JhcGggfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgdHlwZSBCQ1BsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQge1xyXG4gIGdldEluTmVpZ2hib3VycyxcclxuICBnZXRPdXROZWlnaGJvdXJzLFxyXG4gIGdldFNpbmtzLFxyXG59IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ3JhcGhsaWJUb0QzKGc6IEdyYXBoKTogZDNHcmFwaCB7XHJcbiAgY29uc3QgZDNHcmFwaDogZDNHcmFwaCA9IHsgbm9kZXM6IFtdLCBsaW5rczogW10gfTtcclxuICBjb25zdCBub2RlSURzID0ge307XHJcblxyXG4gIGcubm9kZXMoKS5mb3JFYWNoKChub2RlLCBpKSA9PiB7XHJcbiAgICBkM0dyYXBoLm5vZGVzLnB1c2goeyBpZDogaSwgbmFtZTogbm9kZSB9KTtcclxuICAgIG5vZGVJRHNbbm9kZV0gPSBpO1xyXG4gIH0pO1xyXG4gIGcuZm9yRWFjaEVkZ2UoKGssIGEsIHMsIHQpID0+IHtcclxuICAgIGQzR3JhcGgubGlua3MucHVzaCh7XHJcbiAgICAgIHNvdXJjZTogbm9kZUlEc1tzXSxcclxuICAgICAgdGFyZ2V0OiBub2RlSURzW3RdLFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBkM0dyYXBoO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmZzRnJvbUFsbFNpbmtzKGc6IEdyYXBoKSB7XHJcbiAgY29uc3QgcXVldWU6IHN0cmluZ1tdID0gZ2V0U2lua3MoZyk7XHJcbiAgY29uc3QgYWRqTGlzdDogQWRqTGlzdEl0ZW1bXSA9IFtdO1xyXG5cclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG5cclxuICAgIGNvbnN0IGN1cnJOb2RlID0gcXVldWUuc2hpZnQoKTtcclxuICAgIGNvbnN0IG5ld05vZGVzID0gZ2V0SW5OZWlnaGJvdXJzKGcsIGN1cnJOb2RlKTtcclxuXHJcbiAgICBpZiAobmV3Tm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIG5ld05vZGVzLmZvckVhY2goKHByZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5leHQ6IEFkakxpc3RJdGVtID0ge1xyXG4gICAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgICBwYXJlbnRJZDogcHJlLFxyXG4gICAgICAgICAgZGVwdGg6IGksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBxdWV1ZS5wdXNoKHByZSk7XHJcbiAgICAgICAgYWRqTGlzdC5wdXNoKG5leHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkakxpc3QucHVzaCh7XHJcbiAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgcGFyZW50SWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICBkZXB0aDogaSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBtYXhEZXB0aCA9IGFkakxpc3Quc29ydCgoYSwgYikgPT4gYS5kZXB0aCAtIGIuZGVwdGgpLmxhc3QoKS5kZXB0aDtcclxuICBhZGpMaXN0LmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmhlaWdodCA9IG1heERlcHRoIC0gaXRlbS5kZXB0aCkpO1xyXG4gIHJldHVybiBhZGpMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGZzQWRqTGlzdChnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpOiBBZGpMaXN0SXRlbVtdIHtcclxuICBjb25zdCBxdWV1ZTogc3RyaW5nW10gPSBbc3RhcnROb2RlXTtcclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gW107XHJcblxyXG4gIGxldCBpID0gMDtcclxuICB3aGlsZSAocXVldWUubGVuZ3RoICYmIGkgPCAxMDAwKSB7XHJcbiAgICBpKys7XHJcblxyXG4gICAgY29uc3QgY3Vyck5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgbmV3Tm9kZXMgPSBnZXRPdXROZWlnaGJvdXJzKGcsIGN1cnJOb2RlKTtcclxuXHJcbiAgICBpZiAobmV3Tm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIG5ld05vZGVzLmZvckVhY2goKHN1Y2MpID0+IHtcclxuICAgICAgICBjb25zdCBuZXh0OiBBZGpMaXN0SXRlbSA9IHtcclxuICAgICAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICAgICAgcGFyZW50SWQ6IHN1Y2MsXHJcbiAgICAgICAgICBkZXB0aDogaSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHF1ZXVlLnB1c2goc3VjYyk7XHJcbiAgICAgICAgYWRqTGlzdC5wdXNoKG5leHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFkakxpc3QucHVzaCh7XHJcbiAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgcGFyZW50SWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICBkZXB0aDogaSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0IG1heERlcHRoID0gYWRqTGlzdC5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCkubGFzdCgpLmRlcHRoO1xyXG4gIGFkakxpc3QuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaGVpZ2h0ID0gbWF4RGVwdGggLSBpdGVtLmRlcHRoKSk7XHJcblxyXG4gIHJldHVybiBhZGpMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmZzQWRqTGlzdChnOiBHcmFwaCwgc3RhcnROb2RlOiBzdHJpbmcpOiBBZGpMaXN0SXRlbVtdIHtcclxuICBjb25zdCBxdWV1ZTogc3RyaW5nW10gPSBbc3RhcnROb2RlXTtcclxuICBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gW107XHJcblxyXG4gIGxldCBpID0gMDtcclxuICB3aGlsZSAocXVldWUubGVuZ3RoICYmIGkgPCAxMDAwKSB7XHJcbiAgICBpKys7XHJcblxyXG4gICAgY29uc3QgY3Vyck5vZGUgPSBxdWV1ZS5zaGlmdCgpO1xyXG4gICAgY29uc3QgbmVpZ2hib3VycyA9IHtcclxuICAgICAgc3VjY3M6IGdldE91dE5laWdoYm91cnMoZywgY3Vyck5vZGUpLFxyXG4gICAgICBwcmVzOiBnZXRJbk5laWdoYm91cnMoZywgY3Vyck5vZGUpLFxyXG4gICAgfTtcclxuICAgIGNvbnNvbGUubG9nKHsgY3Vyck5vZGUsIG5laWdoYm91cnMgfSk7XHJcblxyXG4gICAgY29uc3QgbmV4dDogQWRqTGlzdEl0ZW0gPSB7XHJcbiAgICAgIG5hbWU6IGN1cnJOb2RlLFxyXG4gICAgICBwcmVzOiB1bmRlZmluZWQsXHJcbiAgICAgIHN1Y2NzOiB1bmRlZmluZWQsXHJcbiAgICAgIHBhcmVudElkOiBpLFxyXG4gICAgICBkZXB0aDogaSxcclxuICAgIH07XHJcbiAgICBpZiAobmVpZ2hib3Vycy5zdWNjcy5sZW5ndGgpIHtcclxuICAgICAgbmV4dC5zdWNjcyA9IG5laWdoYm91cnMuc3VjY3M7XHJcbiAgICAgIHF1ZXVlLnB1c2goLi4ubmVpZ2hib3Vycy5zdWNjcyk7XHJcbiAgICB9XHJcbiAgICBpZiAobmVpZ2hib3Vycy5wcmVzLmxlbmd0aCkge1xyXG4gICAgICBuZXh0LnByZXMgPSBuZWlnaGJvdXJzLnByZXM7XHJcbiAgICB9XHJcbiAgICBhZGpMaXN0LnB1c2gobmV4dCk7XHJcbiAgfVxyXG4gIGNvbnN0IG1heERlcHRoID0gYWRqTGlzdC5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCkubGFzdCgpLmRlcHRoO1xyXG4gIGFkakxpc3QuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaGVpZ2h0ID0gbWF4RGVwdGggLSBpdGVtLmRlcHRoKSk7XHJcblxyXG4gIHJldHVybiBhZGpMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGZzRmxhdEFkakxpc3QoZzogR3JhcGgsIHN0YXJ0Tm9kZTogc3RyaW5nKSB7XHJcbiAgY29uc3Qgbm9kZXMgPSBnLm5vZGVzKCk7XHJcbiAgY29uc3Qgbm9kZUNvdW50ID0gbm9kZXMubGVuZ3RoO1xyXG4gIGNvbnN0IHZpc2l0cyA9IHt9O1xyXG4gIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcclxuICAgIHZpc2l0c1tub2RlXSA9IG5vZGVDb3VudCAqIGk7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IFtzdGFydE5vZGVdO1xyXG4gIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBbXTtcclxuXHJcbiAgbGV0IGRlcHRoID0gMTtcclxuICBsZXQgaSA9IDA7XHJcbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAmJiBpIDwgMTAwMCkge1xyXG4gICAgaSsrO1xyXG5cclxuICAgIGNvbnN0IGN1cnJOb2RlID0gcXVldWUuc2hpZnQoKTtcclxuICAgIGNvbnN0IG5leHQgPSBnZXRPdXROZWlnaGJvdXJzKGcsIGN1cnJOb2RlKTtcclxuXHJcbiAgICBpZiAobmV4dC5sZW5ndGgpIHtcclxuICAgICAgcXVldWUudW5zaGlmdCguLi5uZXh0KTtcclxuICAgICAgbmV4dC5mb3JFYWNoKChzdWNjKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBub2RlQ291bnQgKiBub2Rlcy5pbmRleE9mKHN1Y2MpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICFhZGpMaXN0LnNvbWUoXHJcbiAgICAgICAgICAgIChhZGpJdGVtKSA9PlxyXG4gICAgICAgICAgICAgIGFkakl0ZW0ubmFtZSA9PT0gY3Vyck5vZGUgJiYgYWRqSXRlbS5wYXJlbnRJZCA9PT0gcGFyZW50SWRcclxuICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGFkakxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIGlkOiB2aXNpdHNbY3Vyck5vZGVdIGFzIG51bWJlcixcclxuICAgICAgICAgICAgbmFtZTogY3Vyck5vZGUsXHJcbiAgICAgICAgICAgIHBhcmVudElkLFxyXG4gICAgICAgICAgICBkZXB0aCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdmlzaXRzW2N1cnJOb2RlXSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGRlcHRoKys7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhZGpMaXN0LnB1c2goe1xyXG4gICAgICAgIGlkOiB2aXNpdHNbY3Vyck5vZGVdIGFzIG51bWJlcixcclxuICAgICAgICBuYW1lOiBjdXJyTm9kZSxcclxuICAgICAgICBwYXJlbnRJZDogOTk5OTk5OTk5LFxyXG4gICAgICAgIGRlcHRoLFxyXG4gICAgICB9KTtcclxuICAgICAgZGVwdGggPSAxO1xyXG4gICAgICB2aXNpdHNbY3Vyck5vZGVdKys7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkakxpc3QucHVzaCh7XHJcbiAgICBpZDogOTk5OTk5OTk5LFxyXG4gICAgbmFtZTogXCJDT05UQUlORVJcIixcclxuICAgIHBhcmVudElkOiB1bmRlZmluZWQsXHJcbiAgICBkZXB0aDogMCxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgbWF4RGVwdGggPSBhZGpMaXN0LnNvcnQoKGEsIGIpID0+IGEuZGVwdGggLSBiLmRlcHRoKS5sYXN0KCkuZGVwdGg7XHJcbiAgYWRqTGlzdC5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5oZWlnaHQgPSBtYXhEZXB0aCAtIGl0ZW0uZGVwdGgpKTtcclxuXHJcbiAgY29uc29sZS5sb2coeyB2aXNpdHMgfSk7XHJcbiAgcmV0dXJuIGFkakxpc3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBzdHJhdGlmeSA9IGQzXHJcbiAgLnN0cmF0aWZ5KClcclxuICAuaWQoZnVuY3Rpb24gKGQ6IEFkakxpc3RJdGVtKSB7XHJcbiAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgICByZXR1cm4gZC5uYW1lO1xyXG4gIH0pXHJcbiAgLnBhcmVudElkKGZ1bmN0aW9uIChkOiBBZGpMaXN0SXRlbSkge1xyXG4gICAgcmV0dXJuIGQucGFyZW50SWQ7XHJcbiAgfSk7XHJcbmV4cG9ydCBjbGFzcyBWaXNNb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICBwbHVnaW46IEJDUGx1Z2luO1xyXG4gIG1vZGFsOiBWaXNNb2RhbDtcclxuXHJcbiAgY29uc3RydWN0b3IocGx1Z2luOiBCQ1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgdGhpcy5tb2RhbCA9IHRoaXM7XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKSB7XHJcbiAgICBuZXcgTm90aWNlKFxyXG4gICAgICBcIkFsb3Qgb2YgdGhlc2UgZmVhdHVyZXMgbWF5IG5vdCB3b3JrLCBpdCBpcyBzdGlsbCB2ZXJ5IGV4cGVyaW1lbnRhbC5cIlxyXG4gICAgKTtcclxuICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG4gICAgY29udGVudEVsLmVtcHR5KCk7XHJcblxyXG4gICAgbmV3IFZpc0NvbXAoe1xyXG4gICAgICB0YXJnZXQ6IGNvbnRlbnRFbCxcclxuICAgICAgcHJvcHM6IHtcclxuICAgICAgICBtb2RhbDogdGhpcyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XHJcbiAgfVxyXG59XHJcbiIsIG51bGwsICI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxyXG4gIGltcG9ydCB7IHdhcm4gfSBmcm9tIFwibG9nbGV2ZWxcIjtcclxuICBpbXBvcnQgeyBBTExVTkxJTktFRCwgUkVBbENMT1NFRCwgUkVMQVRJT05TLCBWSVNUWVBFUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcclxuICBpbXBvcnQgdHlwZSB7IFZpc0dyYXBocywgVmlzVHlwZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbiAgaW1wb3J0IHtcclxuICAgIGNsb3NlSW1wbGllZExpbmtzLFxyXG4gICAgZ2V0U3ViSW5EaXJzLFxyXG4gICAgcmVtb3ZlVW5saW5rZWROb2RlcyxcclxuICB9IGZyb20gXCIuLi9VdGlscy9ncmFwaFV0aWxzXCI7XHJcbiAgaW1wb3J0IHsgYXJjRGlhZ3JhbSB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9BcmNEaWFncmFtXCI7XHJcbiAgaW1wb3J0IHsgY2lyY2xlUGFja2luZyB9IGZyb20gXCIuLi9WaXN1YWxpc2F0aW9ucy9DaXJjbGVQYWNraW5nXCI7XHJcbiAgaW1wb3J0IHsgZWRnZUJ1bmRsaW5nIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL0VkZ2VCdW5kbGluZ1wiO1xyXG4gIGltcG9ydCB7IGZvcmNlRGlyZWN0ZWRHIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL0ZvcmNlRGlyZWN0ZWRHXCI7XHJcbiAgaW1wb3J0IHsgaWNpY2xlIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL0ljaWNsZVwiO1xyXG4gIGltcG9ydCB7IHJhZGlhbFRyZWUgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvUmFkaWFsVHJlZVwiO1xyXG4gIGltcG9ydCB7IHN1bmJ1cnN0IH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1N1bmJ1cnN0XCI7XHJcbiAgaW1wb3J0IHsgdGlkeVRyZWUgfSBmcm9tIFwiLi4vVmlzdWFsaXNhdGlvbnMvVGlkeVRyZWVcIjtcclxuICBpbXBvcnQgeyB0cmVlTWFwIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1RyZWVNYXBcIjtcclxuICBpbXBvcnQgdHlwZSB7IFZpc01vZGFsIH0gZnJvbSBcIi4uL1Zpc3VhbGlzYXRpb25zL1Zpc01vZGFsXCI7XHJcbiAgaW1wb3J0IHsgZ2V0Q3VyckZpbGUgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuICBleHBvcnQgbGV0IG1vZGFsOiBWaXNNb2RhbDtcclxuXHJcbiAgY29uc3QgeyBwbHVnaW4gfSA9IG1vZGFsO1xyXG4gIGNvbnN0IHsgbWFpbkcsIHNldHRpbmdzIH0gPSBwbHVnaW47XHJcbiAgY29uc3QgeyB2aXNHcmFwaCwgdmlzUmVsYXRpb24sIHZpc0Nsb3NlZCwgdmlzQWxsIH0gPSBzZXR0aW5ncztcclxuXHJcbiAgY29uc3QgY3VyckZpbGUgPSBnZXRDdXJyRmlsZSgpO1xyXG5cclxuICBjb25zdCBzZWxlY3RvcnMgPSBbXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6IFwiVHlwZVwiLFxyXG4gICAgICBvcHRpb25zOiBWSVNUWVBFUyxcclxuICAgICAgdmFsOiB2aXNHcmFwaCxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQ6IFwiUmVsYXRpb25cIixcclxuICAgICAgb3B0aW9uczogUkVMQVRJT05TLFxyXG4gICAgICB2YWw6IHZpc1JlbGF0aW9uLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogXCJDbG9zZSBJbXBsaWVkXCIsXHJcbiAgICAgIG9wdGlvbnM6IFJFQWxDTE9TRUQsXHJcbiAgICAgIHZhbDogdmlzQ2xvc2VkLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGV4dDogXCJObyBVbmxpbmtlZFwiLFxyXG4gICAgICBvcHRpb25zOiBBTExVTkxJTktFRCxcclxuICAgICAgdmFsOiB2aXNBbGwsXHJcbiAgICB9LFxyXG4gIF07XHJcblxyXG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IFtcclxuICAgIE1hdGgucm91bmQod2luZG93LmlubmVyV2lkdGggLyAxLjMpLFxyXG4gICAgTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJIZWlnaHQgLyAxLjMpLFxyXG4gIF07XHJcblxyXG4gIGNvbnN0IFt1cCwgc2FtZSwgZG93bl0gPSBbXHJcbiAgICBnZXRTdWJJbkRpcnMobWFpbkcsIFwidXBcIiksXHJcbiAgICBnZXRTdWJJbkRpcnMobWFpbkcsIFwic2FtZVwiKSxcclxuICAgIGdldFN1YkluRGlycyhtYWluRywgXCJkb3duXCIpLFxyXG4gIF07XHJcblxyXG4gIGNvbnN0IFtjbG9zZWRQYXJlbnROb1NpbmdsZSwgY2xvc2VkU2libGluZ05vU2luZ2xlLCBjbG9zZWRDaGlsZE5vU2luZ2xlXSA9IFtcclxuICAgIGNsb3NlSW1wbGllZExpbmtzKHVwLCBkb3duKSxcclxuICAgIGNsb3NlSW1wbGllZExpbmtzKHNhbWUsIHNhbWUpLFxyXG4gICAgY2xvc2VJbXBsaWVkTGlua3MoZG93biwgdXApLFxyXG4gIF07XHJcblxyXG4gIGNvbnN0IGdyYXBoczogVmlzR3JhcGhzID0ge1xyXG4gICAgUGFyZW50OiB7XHJcbiAgICAgIFJlYWw6IHtcclxuICAgICAgICBBbGw6IHVwLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2Rlcyh1cCksXHJcbiAgICAgIH0sXHJcbiAgICAgIENsb3NlZDoge1xyXG4gICAgICAgIEFsbDogY2xvc2VkUGFyZW50Tm9TaW5nbGUsXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKGNsb3NlZFBhcmVudE5vU2luZ2xlKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBTaWJsaW5nOiB7XHJcbiAgICAgIFJlYWw6IHtcclxuICAgICAgICBBbGw6IHNhbWUsXHJcbiAgICAgICAgXCJObyBVbmxpbmtlZFwiOiByZW1vdmVVbmxpbmtlZE5vZGVzKHNhbWUpLFxyXG4gICAgICB9LFxyXG4gICAgICBDbG9zZWQ6IHtcclxuICAgICAgICBBbGw6IGNsb3NlZFNpYmxpbmdOb1NpbmdsZSxcclxuICAgICAgICBcIk5vIFVubGlua2VkXCI6IHJlbW92ZVVubGlua2VkTm9kZXMoY2xvc2VkU2libGluZ05vU2luZ2xlKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBDaGlsZDoge1xyXG4gICAgICBSZWFsOiB7XHJcbiAgICAgICAgQWxsOiBkb3duLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2Rlcyhkb3duKSxcclxuICAgICAgfSxcclxuICAgICAgQ2xvc2VkOiB7XHJcbiAgICAgICAgQWxsOiBjbG9zZWRDaGlsZE5vU2luZ2xlLFxyXG4gICAgICAgIFwiTm8gVW5saW5rZWRcIjogcmVtb3ZlVW5saW5rZWROb2RlcyhjbG9zZWRDaGlsZE5vU2luZ2xlKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgJDogYXJnQXJyID0gW1xyXG4gICAgZ3JhcGhzW3NlbGVjdG9yc1sxXS52YWxdW3NlbGVjdG9yc1syXS52YWxdW3NlbGVjdG9yc1szXS52YWxdLFxyXG4gICAgYXBwLFxyXG4gICAgY3VyckZpbGUsXHJcbiAgICBtb2RhbCxcclxuICAgIHdpZHRoLFxyXG4gICAgaGVpZ2h0LFxyXG4gIF07XHJcblxyXG4gIGNvbnN0IHR5cGVzOiB7XHJcbiAgICBbdmlzIGluIFZpc1R5cGVdOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XHJcbiAgfSA9IHtcclxuICAgIFwiRm9yY2UgRGlyZWN0ZWQgR3JhcGhcIjogZm9yY2VEaXJlY3RlZEcsXHJcbiAgICBcIlRpZHkgVHJlZVwiOiB0aWR5VHJlZSxcclxuICAgIFwiQ2lyY2xlIFBhY2tpbmdcIjogY2lyY2xlUGFja2luZyxcclxuICAgIFwiRWRnZSBCdW5kbGluZ1wiOiBlZGdlQnVuZGxpbmcsXHJcbiAgICBcIkFyYyBEaWFncmFtXCI6IGFyY0RpYWdyYW0sXHJcbiAgICBTdW5idXJzdDogc3VuYnVyc3QsXHJcbiAgICBcIlRyZWUgTWFwXCI6IHRyZWVNYXAsXHJcbiAgICBJY2ljbGU6IGljaWNsZSxcclxuICAgIFwiUmFkaWFsIFRyZWVcIjogcmFkaWFsVHJlZSxcclxuICB9O1xyXG5cclxuICBmdW5jdGlvbiBkcmF3KHR5cGU6IFZpc1R5cGUpIHtcclxuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5kMy1ncmFwaFwiKSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmQzLWdyYXBoXCIpPy5lbXB0eSgpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0eXBlc1t0eXBlXSguLi5hcmdBcnIpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICB3YXJuKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDEwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZDMtZ3JhcGhcIikuZW1wdHkoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0eXBlc1t0eXBlXSguLi5hcmdBcnIpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHdhcm4oZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAkOiBkcmF3KHNlbGVjdG9yc1swXS52YWwgYXMgVmlzVHlwZSk7XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdj5cclxuICB7I2VhY2ggc2VsZWN0b3JzIGFzIHsgdGV4dCwgb3B0aW9ucywgdmFsIH19XHJcbiAgICA8c3Bhbj5cclxuICAgICAge3RleHR9OlxyXG4gICAgICA8c2VsZWN0IGJpbmQ6dmFsdWU9e3ZhbH0+XHJcbiAgICAgICAgeyNlYWNoIG9wdGlvbnMgYXMgb3B9XHJcbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtvcH0+e29wfTwvb3B0aW9uPlxyXG4gICAgICAgIHsvZWFjaH1cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L3NwYW4+XHJcbiAgey9lYWNofVxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJkMy1ncmFwaFwiIC8+XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgdHlwZSB7IGQzTm9kZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IGdyYXBobGliVG9EMywgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGFyY0RpYWdyYW0gPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBkYXRhID0gZ3JhcGhsaWJUb0QzKGdyYXBoKTtcclxuXHJcbiAgY29uc3QgbWFyZ2luID0geyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDE1MCB9O1xyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKTtcclxuXHJcbiAgY29uc3Qgbm9kZXMgPSBkYXRhLm5vZGVzLm1hcCgoeyBpZCwgbmFtZSB9KSA9PiAoe1xyXG4gICAgaWQsXHJcbiAgICBuYW1lLFxyXG4gICAgc291cmNlTGlua3M6IFtdLFxyXG4gICAgdGFyZ2V0TGlua3M6IFtdLFxyXG4gIH0pKTtcclxuXHJcbiAgY29uc3Qgbm9kZUJ5SWQgPSBuZXcgTWFwKG5vZGVzLm1hcCgoZCkgPT4gW2QuaWQsIGRdKSk7XHJcblxyXG4gIGNvbnN0IGxpbmtzID0gZGF0YS5saW5rcy5tYXAoKHsgc291cmNlLCB0YXJnZXQgfSkgPT4gKHtcclxuICAgIHNvdXJjZTogbm9kZUJ5SWQuZ2V0KHNvdXJjZSBhcyBudW1iZXIpLFxyXG4gICAgdGFyZ2V0OiBub2RlQnlJZC5nZXQodGFyZ2V0IGFzIG51bWJlciksXHJcbiAgfSkpO1xyXG5cclxuICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcclxuICAgIGNvbnN0IHsgc291cmNlLCB0YXJnZXQgfSA9IGxpbms7XHJcbiAgICBzb3VyY2Uuc291cmNlTGlua3MucHVzaChsaW5rKTtcclxuICAgIHRhcmdldC50YXJnZXRMaW5rcy5wdXNoKGxpbmspO1xyXG4gIH1cclxuXHJcbiAgc3ZnLmFwcGVuZChcInN0eWxlXCIpLnRleHQoYFxyXG5cclxucGF0aCB7XHJcbiAgc3Ryb2tlOiAjODA4MDgwO1xyXG4gIG9wYWNpdHk6IDAuODtcclxufVxyXG5cclxudGV4dCB7XHJcbiAgc3Ryb2tlOiB2YXIoLS10ZXh0LWEpO1xyXG4gIG9wYWNpdHk6IDAuODtcclxufVxyXG5cclxuXHJcbi5ob3ZlciBnLnByaW1hcnkgdGV4dCB7XHJcbiAgZmlsbDogYmxhY2s7XHJcbn1cclxuXHJcbi5ob3ZlciBnLnNlY29uZGFyeSB0ZXh0IHtcclxuICBmaWxsOiAjMzMzO1xyXG59XHJcblxyXG4uaG92ZXIgLnNlY29uZGFyeSB7XHJcbiAgICBjb2xvcjogcmVkO1xyXG59XHJcblxyXG4uaG92ZXIgcGF0aC5wcmltYXJ5IHtcclxuICBzdHJva2U6ICMzMzM7XHJcbiAgc3Ryb2tlLW9wYWNpdHk6IDE7XHJcbn1cclxuXHJcbi5ob3ZlciByZWN0IHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbmApO1xyXG5cclxuICBjb25zdCB5ID0gZDMuc2NhbGVQb2ludChub2Rlcy5tYXAoKGQpID0+IGQubmFtZSkuc29ydChkMy5hc2NlbmRpbmcpLCBbXHJcbiAgICBtYXJnaW4udG9wLFxyXG4gICAgaGVpZ2h0IC0gbWFyZ2luLmJvdHRvbSxcclxuICBdKTtcclxuXHJcbiAgY29uc3QgbGFiZWwgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcImZvbnQtZmFtaWx5XCIsIFwic2Fucy1zZXJpZlwiKVxyXG4gICAgLmF0dHIoXCJmb250LXNpemVcIiwgMTApXHJcbiAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIFwiZW5kXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwiZ1wiKVxyXG4gICAgLmRhdGEobm9kZXMpXHJcbiAgICAuam9pbihcImdcIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIChkKSA9PiBgdHJhbnNsYXRlKCR7bWFyZ2luLmxlZnR9LCR7KGQueSA9IHkoZC5uYW1lKSl9KWApXHJcbiAgICAuY2FsbCgoZykgPT5cclxuICAgICAgZ1xyXG4gICAgICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAgICAgLmF0dHIoXCJ4XCIsIC02KVxyXG4gICAgICAgIC5hdHRyKFwiZHlcIiwgXCIwLjM1ZW1cIilcclxuICAgICAgICAvLyAuYXR0cihcImZpbGxcIiwgKGQpID0+IGQzLmxhYihjb2xvcihkLmdyb3VwKSkuZGFya2VyKDIpKVxyXG4gICAgICAgIC50ZXh0KChkKSA9PiBkLm5hbWUpXHJcbiAgICApXHJcbiAgICAuY2FsbChcclxuICAgICAgKGcpID0+IGcuYXBwZW5kKFwiY2lyY2xlXCIpLmF0dHIoXCJyXCIsIDMpXHJcbiAgICAgIC8vIC5hdHRyKFwiZmlsbFwiLCAoZCkgPT4gY29sb3IoZC5ncm91cCkpXHJcbiAgICApO1xyXG5cclxuICBjb25zdCBwYXRoID0gc3ZnXHJcbiAgICAuaW5zZXJ0KFwiZ1wiLCBcIipcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLmF0dHIoXCJzdHJva2Utd2lkdGhcIiwgMS41KVxyXG4gICAgLnNlbGVjdEFsbChcInBhdGhcIilcclxuICAgIC5kYXRhKGxpbmtzKVxyXG4gICAgLmpvaW4oXCJwYXRoXCIpXHJcbiAgICAvLyAuYXR0cihcInN0cm9rZVwiLCAoZCkgPT5cclxuICAgIC8vICAgZC5zb3VyY2UuZ3JvdXAgPT09IGQudGFyZ2V0Lmdyb3VwID8gY29sb3IoZC5zb3VyY2UuZ3JvdXApIDogXCIjYWFhXCJcclxuICAgIC8vIClcclxuICAgIC5hdHRyKFwiZFwiLCBhcmMpO1xyXG5cclxuICBjb25zdCBzdGVwID0gMTA0O1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgb3ZlcmxheSA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcclxuICAgIC5zZWxlY3RBbGwoXCJyZWN0XCIpXHJcbiAgICAuZGF0YShub2RlcylcclxuICAgIC5qb2luKFwicmVjdFwiKVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCBtYXJnaW4ubGVmdCArIDQwKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgc3RlcClcclxuICAgIC5hdHRyKFwieVwiLCAoZCkgPT4geShkLm5hbWUpIC0gc3RlcCAvIDIpXHJcbiAgICAub24oXCJtb3VzZW92ZXJcIiwgKGQpID0+IHtcclxuICAgICAgc3ZnLmNsYXNzZWQoXCJob3ZlclwiLCB0cnVlKTtcclxuICAgICAgbGFiZWwuY2xhc3NlZChcInByaW1hcnlcIiwgKG4pID0+IG4gPT09IGQpO1xyXG4gICAgICBsYWJlbC5jbGFzc2VkKFxyXG4gICAgICAgIFwic2Vjb25kYXJ5XCIsXHJcbiAgICAgICAgKG4pID0+XHJcbiAgICAgICAgICBuLnNvdXJjZUxpbmtzLnNvbWUoKGwpID0+IGwudGFyZ2V0ID09PSBkKSB8fFxyXG4gICAgICAgICAgbi50YXJnZXRMaW5rcy5zb21lKChsKSA9PiBsLnNvdXJjZSA9PT0gZClcclxuICAgICAgKTtcclxuICAgICAgcGF0aFxyXG4gICAgICAgIC5jbGFzc2VkKFwicHJpbWFyeVwiLCAobCkgPT4gbC5zb3VyY2UgPT09IGQgfHwgbC50YXJnZXQgPT09IGQpXHJcbiAgICAgICAgLmZpbHRlcihcIi5wcmltYXJ5XCIpXHJcbiAgICAgICAgLnJhaXNlKCk7XHJcbiAgICB9KVxyXG4gICAgLm9uKFwibW91c2VvdXRcIiwgKGQpID0+IHtcclxuICAgICAgc3ZnLmNsYXNzZWQoXCJob3ZlclwiLCBmYWxzZSk7XHJcbiAgICAgIGxhYmVsLmNsYXNzZWQoXCJwcmltYXJ5XCIsIGZhbHNlKTtcclxuICAgICAgbGFiZWwuY2xhc3NlZChcInNlY29uZGFyeVwiLCBmYWxzZSk7XHJcbiAgICAgIHBhdGguY2xhc3NlZChcInByaW1hcnlcIiwgZmFsc2UpLm9yZGVyKCk7XHJcbiAgICB9KVxyXG4gICAgLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBkM05vZGUpID0+IHtcclxuICAgICAgbm9kZUNsaWNrKGV2ZW50LCBkLm5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gIC8vICAgZnVuY3Rpb24gdXBkYXRlKCkge1xyXG4gIC8vICAgICB5LmRvbWFpbihub2Rlcy5zb3J0KHZpZXdvZiBvcmRlci52YWx1ZSkubWFwKGQgPT4gZC5pZCkpO1xyXG5cclxuICAvLyAgICAgY29uc3QgdCA9IHN2Zy50cmFuc2l0aW9uKClcclxuICAvLyAgICAgICAgIC5kdXJhdGlvbig3NTApO1xyXG5cclxuICAvLyAgICAgbGFiZWwudHJhbnNpdGlvbih0KVxyXG4gIC8vICAgICAgICAgLmRlbGF5KChkLCBpKSA9PiBpICogMjApXHJcbiAgLy8gICAgICAgICAuYXR0clR3ZWVuKFwidHJhbnNmb3JtXCIsIGQgPT4ge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBpID0gZDMuaW50ZXJwb2xhdGVOdW1iZXIoZC55LCB5KGQuaWQpKTtcclxuICAvLyAgICAgICAgICAgcmV0dXJuIHQgPT4gYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0fSwke2QueSA9IGkodCl9KWA7XHJcbiAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgLy8gICAgIHBhdGgudHJhbnNpdGlvbih0KVxyXG4gIC8vICAgICAgICAgLmR1cmF0aW9uKDc1MCArIG5vZGVzLmxlbmd0aCAqIDIwKVxyXG4gIC8vICAgICAgICAgLmF0dHJUd2VlbihcImRcIiwgZCA9PiAoKSA9PiBhcmMoZCkpO1xyXG5cclxuICAvLyAgICAgb3ZlcmxheS50cmFuc2l0aW9uKHQpXHJcbiAgLy8gICAgICAgICAuZGVsYXkoKGQsIGkpID0+IGkgKiAyMClcclxuICAvLyAgICAgICAgIC5hdHRyKFwieVwiLCBkID0+IHkoZC5pZCkgLSBzdGVwIC8gMik7XHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgdmlld29mIG9yZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB1cGRhdGUpO1xyXG4gIC8vICAgaW52YWxpZGF0aW9uLnRoZW4oKCkgPT4gdmlld29mIG9yZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB1cGRhdGUpKTtcclxuXHJcbiAgZnVuY3Rpb24gYXJjKGQ6IHsgc291cmNlOiB7IHk6IG51bWJlciB9OyB0YXJnZXQ6IHsgeTogbnVtYmVyIH0gfSkge1xyXG4gICAgY29uc3QgeTEgPSBkLnNvdXJjZS55O1xyXG4gICAgY29uc3QgeTIgPSBkLnRhcmdldC55O1xyXG4gICAgY29uc3QgciA9IE1hdGguYWJzKHkyIC0geTEpIC8gMjtcclxuICAgIHJldHVybiBgTSR7bWFyZ2luLmxlZnR9LCR7eTF9QSR7cn0sJHtyfSAwLDAsJHt5MSA8IHkyID8gMSA6IDB9ICR7bWFyZ2luLmxlZnRcclxuICAgICAgfSwke3kyfWA7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgc3ZnLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICB9XHJcbiAgc3ZnLmNhbGwoXHJcbiAgICBkM1xyXG4gICAgICAuem9vbSgpXHJcbiAgICAgIC5leHRlbnQoW1xyXG4gICAgICAgIFswLCAwXSxcclxuICAgICAgICBbd2lkdGgsIGhlaWdodF0sXHJcbiAgICAgIF0pXHJcbiAgICAgIC5zY2FsZUV4dGVudChbMC41LCA4XSlcclxuICAgICAgLm9uKFwiem9vbVwiLCB6b29tZWQpXHJcbiAgKTtcclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgQWRqTGlzdEl0ZW0sIGQzTGluaywgZDNOb2RlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgYmZzQWRqTGlzdCwgZGZzRmxhdEFkakxpc3QsIFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHsgb3Blbk9yU3dpdGNoIH0gZnJvbSBcIm9ic2lkaWFuLWNvbW11bml0eS1saWJcIjtcclxuaW1wb3J0IHsgZ2V0Q3VyckZpbGUgfSBmcm9tIFwiLi4vVXRpbHMvT2JzaWRpYW5VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNpcmNsZVBhY2tpbmcgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXJhcmNoeSA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIGNvbnN0IGFkakxpc3Q6IEFkakxpc3RJdGVtW10gPSBiZnNBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBhZGpMaXN0IH0pO1xyXG5cclxuICBjb25zdCBub0RvdWJsZXMgPSBbLi4uYWRqTGlzdF07XHJcbiAgbm9Eb3VibGVzLmZvckVhY2goKGEsIGkpID0+IHtcclxuICAgIGlmIChub0RvdWJsZXMuc29tZSgoYiwgaikgPT4gaSAhPT0gaiAmJiBhLm5hbWUgPT09IGIubmFtZSkpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBub0RvdWJsZXMuZmluZEluZGV4KChiLCBqKSA9PiBpICE9PSBqICYmIGEubmFtZSA9PT0gYi5uYW1lKTtcclxuICAgICAgbm9Eb3VibGVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIGNvbnN0IG5vRG91YmxlcyA9IGFkakxpc3QuZmlsdGVyKChhKSA9PiB7XHJcbiAgLy8gICAhYWRqTGlzdC5zb21lKChiKSA9PiB7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKHsgYSwgYiB9KTtcclxuICAvLyAgICAgcmV0dXJuIGEubmFtZSAhPT0gYi5uYW1lICYmIGEucGFyZW50SWQgPT09IGIucGFyZW50SWQ7XHJcbiAgLy8gICB9KTtcclxuICAvLyB9KTtcclxuICBjb25zb2xlLmxvZyh7IG5vRG91YmxlcyB9KTtcclxuXHJcbiAgLy8gY29uc3Qgcm9vdCA9IHN0cmF0aWZ5KG5vRG91Ymxlcyk7XHJcbiAgLy8gY29uc29sZS5sb2cocm9vdCk7XHJcblxyXG4gIC8vIGNvbnN0IGhpZXJhcmNoeTogZDNUcmVlID0gY3JlYXRlVHJlZUhpZXJhcmNoeShub0RvdWJsZXMsIHtcclxuICAvLyAgIGlkOiBcIm5hbWVcIixcclxuICAvLyAgIGV4Y2x1ZGVQYXJlbnQ6IHRydWUsXHJcbiAgLy8gfSk7XHJcblxyXG4gIC8vIGNvbnNvbGUubG9nKHsgaGllcmFyY2h5IH0pO1xyXG5cclxuICBjb25zdCBsaW5rQXJyOiBkM0xpbmtbXSA9IG5vRG91Ymxlcy5tYXAoKGQpID0+IHtcclxuICAgIHJldHVybiB7IHNvdXJjZTogZC5uYW1lLCB0YXJnZXQ6IGQucGFyZW50SWQgfTtcclxuICB9KTtcclxuICBjb25zdCBsaW5rcyA9IGxpbmtBcnIubWFwKChkKSA9PiBPYmplY3QuY3JlYXRlKGQpKTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpO1xyXG5cclxuICBjb25zdCBub2RlQ29sb3VyID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgXCItLXRleHQtYWNjZW50XCJcclxuICApO1xyXG5cclxuICAvLyBJbml0aWFsaXplIHRoZSBjaXJjbGU6IGFsbCBsb2NhdGVkIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHN2ZyBhcmVhXHJcbiAgY29uc3Qgbm9kZSA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5zZWxlY3RBbGwoXCJjaXJjbGVcIilcclxuICAgIC5kYXRhKG5vRG91YmxlcylcclxuICAgIC5qb2luKFwiY2lyY2xlXCIpXHJcbiAgICAuYXR0cihcInJcIiwgKGQpID0+IE1hdGgucm91bmQoZC5oZWlnaHQgLyAxMCkgKyAxMClcclxuICAgIC5hdHRyKFwiY3hcIiwgd2lkdGggLyAyKVxyXG4gICAgLmF0dHIoXCJjeVwiLCBoZWlnaHQgLyAyKVxyXG4gICAgLnN0eWxlKFwiZmlsbFwiLCBub2RlQ29sb3VyKVxyXG4gICAgLnN0eWxlKFwiZmlsbC1vcGFjaXR5XCIsIDAuNilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIG5vZGVDb2xvdXIpXHJcbiAgICAuc3R5bGUoXCJzdHJva2Utd2lkdGhcIiwgNCk7XHJcblxyXG4gIG5vZGUuYXR0cihcImFyaWEtbGFiZWxcIiwgKGQ6IEFkakxpc3RJdGVtKSA9PiBkLm5hbWUpO1xyXG5cclxuICBjb25zdCBub2RlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGRlc3Q6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgY3VyckZpbGUgPSBnZXRDdXJyRmlsZSgpO1xyXG4gICAgb3Blbk9yU3dpdGNoKGRlc3QsIGV2ZW50KTtcclxuICAgIG1vZGFsLmNsb3NlKCk7XHJcbiAgfTtcclxuICBub2RlLm9uKFwiY2xpY2tcIiwgKGV2ZW50OiBNb3VzZUV2ZW50LCBkOiBkM05vZGUpID0+IHtcclxuICAgIG5vZGVDbGljayhldmVudCwgZC5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgbGluayA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzg2ODI4MlwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuc2VsZWN0QWxsKFwibGluZVwiKVxyXG4gICAgLmRhdGEobGlua3MpXHJcbiAgICAuam9pbihcImxpbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDAuOCk7XHJcblxyXG4gIC8vIEZlYXR1cmVzIG9mIHRoZSBmb3JjZXMgYXBwbGllZCB0byB0aGUgbm9kZXM6XHJcbiAgY29uc3Qgc2ltdWxhdGlvbiA9IGQzXHJcbiAgICAuZm9yY2VTaW11bGF0aW9uKClcclxuICAgIC5mb3JjZShcclxuICAgICAgXCJjZW50ZXJcIixcclxuICAgICAgZDNcclxuICAgICAgICAuZm9yY2VDZW50ZXIoKVxyXG4gICAgICAgIC54KHdpZHRoIC8gMilcclxuICAgICAgICAueShoZWlnaHQgLyAyKVxyXG4gICAgKSAvLyBBdHRyYWN0aW9uIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHN2ZyBhcmVhXHJcbiAgICAuZm9yY2UoXCJjaGFyZ2VcIiwgZDMuZm9yY2VNYW55Qm9keSgpLnN0cmVuZ3RoKDAuNSkpIC8vIE5vZGVzIGFyZSBhdHRyYWN0ZWQgb25lIGVhY2ggb3RoZXIgb2YgdmFsdWUgaXMgPiAwXHJcbiAgICAuZm9yY2UoXHJcbiAgICAgIFwiY29sbGlkZVwiLFxyXG4gICAgICBkMy5mb3JjZUNvbGxpZGUoKS5zdHJlbmd0aCgwLjAyNSkucmFkaXVzKDMwKS5pdGVyYXRpb25zKDEpXHJcbiAgICApOyAvLyBGb3JjZSB0aGF0IGF2b2lkcyBjaXJjbGUgb3ZlcmxhcHBpbmdcclxuXHJcbiAgLy8gQXBwbHkgdGhlc2UgZm9yY2VzIHRvIHRoZSBub2RlcyBhbmQgdXBkYXRlIHRoZWlyIHBvc2l0aW9ucy5cclxuICAvLyBPbmNlIHRoZSBmb3JjZSBhbGdvcml0aG0gaXMgaGFwcHkgd2l0aCBwb3NpdGlvbnMgKCdhbHBoYScgdmFsdWUgaXMgbG93IGVub3VnaCksIHNpbXVsYXRpb25zIHdpbGwgc3RvcC5cclxuICBzaW11bGF0aW9uLm5vZGVzKG5vRG91Ymxlcykub24oXCJ0aWNrXCIsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICBub2RlLmF0dHIoXCJjeFwiLCAoZCkgPT4gZC54KS5hdHRyKFwiY3lcIiwgKGQpID0+IGQueSk7XHJcbiAgfSk7XHJcblxyXG4gIGZ1bmN0aW9uIHpvb21lZCh7IHRyYW5zZm9ybSB9KSB7XHJcbiAgICBub2RlLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICB9XHJcbiAgc3ZnLmNhbGwoXHJcbiAgICBkM1xyXG4gICAgICAuem9vbSgpXHJcbiAgICAgIC5leHRlbnQoW1xyXG4gICAgICAgIFswLCAwXSxcclxuICAgICAgICBbd2lkdGgsIGhlaWdodF0sXHJcbiAgICAgIF0pXHJcbiAgICAgIC5zY2FsZUV4dGVudChbMC41LCA4XSlcclxuICAgICAgLm9uKFwiem9vbVwiLCB6b29tZWQpXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgZHJhZyA9IChcclxuICAgIHNpbXVsYXRpb246IGQzLlNpbXVsYXRpb248ZDMuU2ltdWxhdGlvbk5vZGVEYXR1bSwgdW5kZWZpbmVkPlxyXG4gICkgPT4ge1xyXG4gICAgZnVuY3Rpb24gZHJhZ3N0YXJ0ZWQoZXZlbnQsIGQpIHtcclxuICAgICAgaWYgKCFldmVudC5hY3RpdmUpIHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMC4zKS5yZXN0YXJ0KCk7XHJcbiAgICAgIGQuZnggPSBkLng7XHJcbiAgICAgIGQuZnkgPSBkLnk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZHJhZ2dlZChldmVudCwgZCkge1xyXG4gICAgICBkLmZ4ID0gZXZlbnQueDtcclxuICAgICAgZC5meSA9IGV2ZW50Lnk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZHJhZ2VuZGVkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDApO1xyXG4gICAgICBkLmZ4ID0gbnVsbDtcclxuICAgICAgZC5meSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGQzXHJcbiAgICAgIC5kcmFnKClcclxuICAgICAgLm9uKFwic3RhcnRcIiwgZHJhZ3N0YXJ0ZWQpXHJcbiAgICAgIC5vbihcImRyYWdcIiwgZHJhZ2dlZClcclxuICAgICAgLm9uKFwiZW5kXCIsIGRyYWdlbmRlZCk7XHJcbiAgfTtcclxuXHJcbiAgbm9kZS5jYWxsKGRyYWcoc2ltdWxhdGlvbikpO1xyXG5cclxuICAvLyAgIGNvbnN0IHBhY2sgPSAoZGF0YSkgPT5cclxuICAvLyAgICAgZDMucGFjaygpLnNpemUoW3dpZHRoLCBoZWlnaHRdKS5wYWRkaW5nKDMpKFxyXG4gIC8vICAgICAgIGQzXHJcbiAgLy8gICAgICAgICAuaGllcmFyY2h5KGRhdGEpXHJcbiAgLy8gICAgICAgICAuc3VtKChkKSA9PiBkLnZhbHVlKVxyXG4gIC8vICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIudmFsdWUgLSBhLnZhbHVlKVxyXG4gIC8vICAgICApO1xyXG5cclxuICAvLyAgIGNvbnN0IHJvb3QgPSBwYWNrKGhpZXJhcmNoeSk7XHJcblxyXG4gIC8vICAgY29uc3Qgc3ZnID0gZDNcclxuICAvLyAgICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gIC8vICAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAvLyAgICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aClcclxuICAvLyAgICAgLnN0eWxlKFwiZm9udFwiLCBcIjEwcHggc2Fucy1zZXJpZlwiKVxyXG4gIC8vICAgICAuc3R5bGUoXCJvdmVyZmxvd1wiLCBcInZpc2libGVcIilcclxuICAvLyAgICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBcIm1pZGRsZVwiKTtcclxuXHJcbiAgLy8gICBjb25zdCBub2RlID0gc3ZnXHJcbiAgLy8gICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIilcclxuICAvLyAgICAgLnNlbGVjdEFsbChcImdcIilcclxuICAvLyAgICAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKVxyXG4gIC8vICAgICAuam9pbihcImdcIilcclxuICAvLyAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHtkLnh9LCR7ZC55fSlgKTtcclxuXHJcbiAgLy8gICBub2RlXHJcbiAgLy8gICAgIC5hcHBlbmQoXCJjaXJjbGVcIilcclxuICAvLyAgICAgLmF0dHIoXCJyXCIsIChkKSA9PiBkLnIpXHJcbiAgLy8gICAgIC5hdHRyKFwic3Ryb2tlXCIsIChkKSA9PiAoZC5jaGlsZHJlbiA/IFwiI2JiYlwiIDogXCJub25lXCIpKVxyXG4gIC8vICAgICAuYXR0cihcImZpbGxcIiwgKGQpID0+IChkLmNoaWxkcmVuID8gXCJub25lXCIgOiBcIiNkZGRcIikpO1xyXG5cclxuICAvLyAgIGNvbnN0IGxlYWYgPSBub2RlLmZpbHRlcigoZCkgPT4gIWQuY2hpbGRyZW4pO1xyXG5cclxuICAvLyAgIGxlYWYuc2VsZWN0KFwiY2lyY2xlXCIpO1xyXG5cclxuICAvLyAgIC8vIGxlYWZcclxuICAvLyAgIC8vICAgLmFwcGVuZChcImNsaXBQYXRoXCIpXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwiaWRcIiwgKGQpID0+IChkLmNsaXBVaWQgPSBET00udWlkKFwiY2xpcFwiKSkuaWQpXHJcbiAgLy8gICAvLyAgIC5hcHBlbmQoXCJ1c2VcIilcclxuICAvLyAgIC8vICAgLmF0dHIoXCJ4bGluazpocmVmXCIsIChkKSA9PiBkLmxlYWZVaWQuaHJlZik7XHJcblxyXG4gIC8vICAgLy8gbGVhZlxyXG4gIC8vICAgLy8gICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gIC8vICAgLy8gICAuYXR0cihcImNsaXAtcGF0aFwiLCAoZCkgPT4gZC5jbGlwVWlkKVxyXG4gIC8vICAgLy8gICAuc2VsZWN0QWxsKFwidHNwYW5cIilcclxuICAvLyAgIC8vICAgLmRhdGEoKGQpID0+IGQuZGF0YS5uYW1lLnNwbGl0KC8oPz1bQS1aXVteQS1aXSkvZykpXHJcbiAgLy8gICAvLyAgIC5qb2luKFwidHNwYW5cIilcclxuICAvLyAgIC8vICAgLmF0dHIoXCJ4XCIsIDApXHJcbiAgLy8gICAvLyAgIC5hdHRyKFwieVwiLCAoZCwgaSwgbm9kZXMpID0+IGAke2kgLSBub2Rlcy5sZW5ndGggLyAyICsgMC44fWVtYClcclxuICAvLyAgIC8vICAgLnRleHQoKGQpID0+IGQpO1xyXG5cclxuICAvLyAgIG5vZGUuYXBwZW5kKFwidGl0bGVcIikudGV4dChcclxuICAvLyAgICAgKGQpID0+IGAke2RcclxuICAvLyAgICAgICAuYW5jZXN0b3JzKClcclxuICAvLyAgICAgICAubWFwKChkKSA9PiBkLmRhdGEuZGF0YS5uYW1lKVxyXG4gIC8vICAgICAgIC5yZXZlcnNlKClcclxuICAvLyAgICAgICAuam9pbihcIi9cIil9XHJcbiAgLy8gJHtkLnZhbHVlLnRvTG9jYWxlU3RyaW5nKCl9YFxyXG4gIC8vICAgKTtcclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0LCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZWRnZUJ1bmRsaW5nID0gKFxyXG4gIGdyYXBoOiBHcmFwaCxcclxuICBjdXJyRmlsZTogVEZpbGUsXHJcbiAgbW9kYWw6IFZpc01vZGFsLFxyXG4gIHdpZHRoOiBudW1iZXIsXHJcbiAgaGVpZ2h0OiBudW1iZXJcclxuKSA9PiB7XHJcbiAgY29uc3QgZmxhdEFkaiA9IGRmc0ZsYXRBZGpMaXN0KGdyYXBoLCBjdXJyRmlsZS5iYXNlbmFtZSk7XHJcbiAgY29uc29sZS5sb2coeyBmbGF0QWRqIH0pO1xyXG5cclxuICBjb25zdCBoaWVyID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXIgfSk7XHJcblxyXG4gIGNvbnN0IFBBRERJTkdfQlVCQkxFID0gMTU7IC8vIGRpc3RhbmNlIGJldHdlZW4gZWRnZSBlbmQgYW5kIGJ1YmJsZVxyXG4gIGNvbnN0IFBBRERJTkdfTEFCRUwgPSAzMDsgLy8gZGlzdGFuY2UgYmV0d2VlbiBlZGdlIGVuZCBhbmQgZW5naW5lZXIgbmFtZVxyXG4gIGNvbnN0IEJVQkJMRV9TSVpFX01JTiA9IDQ7XHJcbiAgY29uc3QgQlVCQkxFX1NJWkVfTUFYID0gMjA7XHJcblxyXG4gIHZhciBkaWFtZXRlciA9IDU2MCxcclxuICAgIHJhZGl1cyA9IGRpYW1ldGVyIC8gMixcclxuICAgIGlubmVyUmFkaXVzID0gcmFkaXVzIC0gMTcwOyAvLyBiZXR3ZWVuIGNlbnRlciBhbmQgZWRnZSBlbmRcclxuXHJcbiAgLy8gVGhlICdjbHVzdGVyJyBmdW5jdGlvbiB0YWtlcyAxIGFyZ3VtZW50IGFzIGlucHV0LiBJdCBhbHNvIGhhcyBtZXRob2RzICg/PykgbGlrZSBjbHVzdGVyLnNlcGFyYXRpb24oKSwgY2x1c3Rlci5zaXplKCkgYW5kIGNsdXN0ZXIubm9kZVNpemUoKVxyXG4gIHZhciBjbHVzdGVyID0gZDMuY2x1c3RlcigpLnNpemUoWzM2MCwgaW5uZXJSYWRpdXNdKTtcclxuXHJcbiAgdmFyIGxpbmUgPSBkM1xyXG4gICAgLmxpbmVSYWRpYWwoKVxyXG4gICAgLmN1cnZlKGQzLmN1cnZlQnVuZGxlLmJldGEoMC44NSkpXHJcbiAgICAucmFkaXVzKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkWzFdO1xyXG4gICAgfSlcclxuICAgIC5hbmdsZShmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gKGRbMF0gLyAxODApICogTWF0aC5QSTtcclxuICAgIH0pO1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aClcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIHJhZGl1cyArIFwiLFwiICsgcmFkaXVzICsgXCIpXCIpO1xyXG5cclxuICB2YXIgbGluayA9IHN2Zy5hcHBlbmQoXCJnXCIpLnNlbGVjdEFsbChcIi5saW5rXCIpLFxyXG4gICAgbGFiZWwgPSBzdmcuYXBwZW5kKFwiZ1wiKS5zZWxlY3RBbGwoXCIubGFiZWxcIiksXHJcbiAgICBidWJibGUgPSBzdmcuYXBwZW5kKFwiZ1wiKS5zZWxlY3RBbGwoXCIuYnViYmxlXCIpO1xyXG5cclxuICAvLyBBZGQgYSBzY2FsZSBmb3IgYnViYmxlIHNpemVcclxuICB2YXIgYnViYmxlU2l6ZVNjYWxlID0gZDNcclxuICAgIC5zY2FsZUxpbmVhcigpXHJcbiAgICAuZG9tYWluKFswLCAxMDBdKVxyXG4gICAgLnJhbmdlKFtCVUJCTEVfU0laRV9NSU4sIEJVQkJMRV9TSVpFX01BWF0pO1xyXG5cclxuICAvLyBTY2FsZSBmb3IgdGhlIGJ1YmJsZSBzaXplXHJcblxyXG4gIC8vIElmIHdhbm5hIHNlZSB5b3VyIGRhdGFcclxuICAvLyBjb25zb2xlLmxvZyhoaWVyYXJjaGljYWxEYXRhKVxyXG5cclxuICAvLyBSZWZvcm1hdCB0aGUgZGF0YVxyXG4gIHZhciByb290ID0gcGFja2FnZUhpZXJhcmNoeShoaWVyKVxyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIC5zdW0oZnVuY3Rpb24gKGQpIHtcclxuICAgICAgY29uc29sZS5sb2coZCk7XHJcbiAgICAgIHJldHVybiBkLmhlaWdodDtcclxuICAgIH0pO1xyXG5cclxuICAvLyBjb25zb2xlLmxvZyhyb290KVxyXG5cclxuICAvLyBCdWlsZCBhbiBvYmplY3QgdGhhdCBnaXZlcyBmZWF0dXJlIG9mIGVhY2ggbGVhdmVzXHJcbiAgY2x1c3Rlcihyb290KTtcclxuICBjb25zdCBsZWF2ZXMgPSByb290LmxlYXZlcygpO1xyXG5cclxuICAvLyBMZWF2ZXMgaXMgYW4gYXJyYXkgb2YgT2JqZWN0cy4gMSBpdGVtID0gb25lIGxlYWYuIFByb3ZpZGVzIHggYW5kIHkgZm9yIGxlYWYgcG9zaXRpb24gaW4gdGhlIHN2Zy4gQWxzbyBnaXZlcyBkZXRhaWxzIGFib3V0IGl0cyBwYXJlbnQuXHJcbiAgY29uc3QgX2xpbmsgPSBsaW5rXHJcbiAgICAuZGF0YShwYWNrYWdlSW1wb3J0cyhsZWF2ZXMpKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoXCJwYXRoXCIpXHJcbiAgICAuZWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAoZC5zb3VyY2UgPSBkWzBdKSwgKGQudGFyZ2V0ID0gZFtkLmxlbmd0aCAtIDFdKTtcclxuICAgIH0pXHJcbiAgICAuYXR0cihcImNsYXNzXCIsIFwibGlua1wiKVxyXG4gICAgLmF0dHIoXCJkXCIsIGxpbmUpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcImJsYWNrXCIpO1xyXG5cclxuICBjb25zdCBfbGFiZWwgPSBsYWJlbFxyXG4gICAgLmRhdGEobGVhdmVzKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoXCJ0ZXh0XCIpXHJcbiAgICAuYXR0cihcImNsYXNzXCIsIFwibGFiZWxcIilcclxuICAgIC5hdHRyKFwiZHlcIiwgXCIwLjMxZW1cIilcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgXCJyb3RhdGUoXCIgK1xyXG4gICAgICAgIChkLnggLSA5MCkgK1xyXG4gICAgICAgIFwiKXRyYW5zbGF0ZShcIiArXHJcbiAgICAgICAgKGQueSArIFBBRERJTkdfTEFCRUwpICtcclxuICAgICAgICBcIiwwKVwiICtcclxuICAgICAgICAoZC54IDwgMTgwID8gXCJcIiA6IFwicm90YXRlKDE4MClcIilcclxuICAgICAgKTtcclxuICAgIH0pXHJcbiAgICAuYXR0cihcInRleHQtYW5jaG9yXCIsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLnggPCAxODAgPyBcInN0YXJ0XCIgOiBcImVuZFwiO1xyXG4gICAgfSlcclxuICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLmRhdGEua2V5O1xyXG4gICAgfSk7XHJcblxyXG4gIGNvbnN0IF9idWJibGUgPSBidWJibGVcclxuICAgIC5kYXRhKGxlYXZlcylcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwiY2lyY2xlXCIpXHJcbiAgICAuYXR0cihcImNsYXNzXCIsIFwiYnViYmxlXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIFwicm90YXRlKFwiICsgKGQueCAtIDkwKSArIFwiKXRyYW5zbGF0ZShcIiArIChkLnkgKyBQQURESU5HX0JVQkJMRSkgKyBcIiwwKVwiXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJyXCIsIChkKSA9PiBidWJibGVTaXplU2NhbGUoZC52YWx1ZSkpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcImJsYWNrXCIpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgXCIjNjlhM2IyXCIpXHJcbiAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIDAuMik7XHJcblxyXG4gIC8vIExhemlseSBjb25zdHJ1Y3QgdGhlIHBhY2thZ2UgaGllcmFyY2h5IGZyb20gY2xhc3MgbmFtZXMuXHJcbiAgZnVuY3Rpb24gcGFja2FnZUhpZXJhcmNoeShjbGFzc2VzKSB7XHJcbiAgICB2YXIgbWFwID0ge307XHJcblxyXG4gICAgZnVuY3Rpb24gZmluZChuYW1lLCBkYXRhKSB7XHJcbiAgICAgIHZhciBub2RlID0gbWFwW25hbWVdLFxyXG4gICAgICAgIGk7XHJcbiAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgIG5vZGUgPSBtYXBbbmFtZV0gPSBkYXRhIHx8IHsgbmFtZTogbmFtZSwgY2hpbGRyZW46IFtdIH07XHJcbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICBub2RlLnBhcmVudCA9IGZpbmQobmFtZS5zdWJzdHJpbmcoMCwgKGkgPSBuYW1lLmxhc3RJbmRleE9mKFwiLlwiKSkpKTtcclxuICAgICAgICAgIG5vZGUucGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICBub2RlLmtleSA9IG5hbWUuc3Vic3RyaW5nKGkgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGZpbmQoZC5uYW1lLCBkKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkMy5oaWVyYXJjaHkobWFwW1wiXCJdKTtcclxuICB9XHJcblxyXG4gIC8vIFJldHVybiBhIGxpc3Qgb2YgaW1wb3J0cyBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIG5vZGVzLlxyXG4gIGZ1bmN0aW9uIHBhY2thZ2VJbXBvcnRzKG5vZGVzKSB7XHJcbiAgICB2YXIgbWFwID0ge30sXHJcbiAgICAgIGltcG9ydHMgPSBbXTtcclxuXHJcbiAgICAvLyBDb21wdXRlIGEgbWFwIGZyb20gbmFtZSB0byBub2RlLlxyXG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBtYXBbZC5kYXRhLm5hbWVdID0gZDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEZvciBlYWNoIGltcG9ydCwgY29uc3RydWN0IGEgbGluayBmcm9tIHRoZSBzb3VyY2UgdG8gdGFyZ2V0IG5vZGUuXHJcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIGlmIChkLmRhdGEuaW1wb3J0cylcclxuICAgICAgICBkLmRhdGEuaW1wb3J0cy5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7XHJcbiAgICAgICAgICBpbXBvcnRzLnB1c2gobWFwW2QuZGF0YS5uYW1lXS5wYXRoKG1hcFtpXSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGltcG9ydHM7XHJcbiAgfVxyXG59O1xyXG4iLCAiaW1wb3J0ICogYXMgZDMgZnJvbSBcImQzXCI7XHJcbmltcG9ydCB0eXBlIEdyYXBoIGZyb20gXCJncmFwaG9sb2d5XCI7XHJcbmltcG9ydCB7IG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbmltcG9ydCB0eXBlIHsgZDNOb2RlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgZ3JhcGhsaWJUb0QzLCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcbmltcG9ydCB0eXBlIHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmV4cG9ydCBjb25zdCBmb3JjZURpcmVjdGVkRyA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyXHJcbikgPT4ge1xyXG4gIGNvbnN0IHsgc2V0dGluZ3MgfSA9IG1vZGFsLnBsdWdpbjtcclxuICBsZXQgbm9kZVRvR2V0VG8gPSBjdXJyRmlsZS5iYXNlbmFtZTtcclxuICBjb25zb2xlLmxvZyh7IG5vZGVUb0dldFRvIH0pO1xyXG5cclxuICBjb25zb2xlLnRpbWUoXCJGaW5kIGFsbCBwYXRoc1wiKTtcclxuICAvLyBsZXQgcGF0aHNGcm9tTm9kZVRvR2V0VG8gPSBncmFwaGxpYi5hbGcuZGlqa3N0cmEoZ3JhcGgsIG5vZGVUb0dldFRvKTtcclxuICBjb25zb2xlLnRpbWVFbmQoXCJGaW5kIGFsbCBwYXRoc1wiKTtcclxuXHJcbiAgY29uc3QgZGVmYXVsdE5vZGVDb2xvdXIgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICBcIi0tdGV4dC1hY2NlbnRcIlxyXG4gICk7XHJcbiAgbGV0IGN1cnJOb2RlQ29sb3VyID0gZGVmYXVsdE5vZGVDb2xvdXI7XHJcblxyXG4gIGNvbnN0IGNvbG91ckNoYW5nZUlucHV0ID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJpbnB1dFwiKVxyXG4gICAgLmF0dHIoXCJ0eXBlXCIsIFwiY29sb3JcIik7XHJcblxyXG4gIGNvbG91ckNoYW5nZUlucHV0Lm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIGNoYW5nZUNvbG9yKGVsKSB7XHJcbiAgICBjdXJyTm9kZUNvbG91ciA9IGVsLnRhcmdldC52YWx1ZTtcclxuICAgIG5vZGVcclxuICAgICAgLnRyYW5zaXRpb24oKVxyXG4gICAgICAuZHVyYXRpb24oMzAwKVxyXG4gICAgICAuc3R5bGUoXCJmaWxsXCIsIChkKSA9PiB7XHJcbiAgICAgICAgaWYgKGQuaW5kZXggPT09IGN1cnJOb2RlSW5kZXgpIHJldHVybjtcclxuICAgICAgICByZXR1cm4gY3Vyck5vZGVDb2xvdXI7XHJcbiAgICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICAvLyBjb25zdCBzYXZlTGF5b3V0QnV0dG9uID0gbW9kYWwuY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IHRleHQ6ICdTYXZlIExheW91dCcgfSlcclxuICAvLyAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVHcmFwaClcclxuXHJcbiAgY29uc3QgZGF0YSA9IGdyYXBobGliVG9EMyhncmFwaCk7XHJcblxyXG4gIGNvbnN0IGxpbmtzOiB7XHJcbiAgICBpbmRleDogbnVtYmVyO1xyXG4gICAgc291cmNlOiB7IGluZGV4OiBudW1iZXI7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XHJcbiAgICB0YXJnZXQ6IHsgaW5kZXg6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcclxuICB9W10gPSBkYXRhLmxpbmtzLm1hcCgoZCkgPT4gT2JqZWN0LmNyZWF0ZShkKSk7XHJcblxyXG4gIGNvbnN0IGN1cnJOb2RlID0gZGF0YS5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLm5hbWUgPT09IGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBsZXQgY3Vyck5vZGVJbmRleDogbnVtYmVyO1xyXG4gIGlmICghY3Vyck5vZGUpIHtcclxuICAgIGNvbnN0IGlkID0gZGF0YS5ub2Rlcy5sZW5ndGg7XHJcbiAgICBkYXRhLm5vZGVzLnB1c2goeyBpZCwgbmFtZTogY3VyckZpbGUuYmFzZW5hbWUgfSk7XHJcbiAgICBjdXJyTm9kZUluZGV4ID0gaWQ7XHJcbiAgfSBlbHNlIHtcclxuICAgIGN1cnJOb2RlSW5kZXggPSBjdXJyTm9kZS5pZDtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5vZGVzID0gZGF0YS5ub2Rlcy5tYXAoKGQpID0+IE9iamVjdC5jcmVhdGUoZCkpO1xyXG5cclxuICBjb25zdCBzaW11bGF0aW9uID0gZDNcclxuICAgIC5mb3JjZVNpbXVsYXRpb24obm9kZXMpXHJcbiAgICAuZm9yY2UoXHJcbiAgICAgIFwibGlua1wiLFxyXG4gICAgICBkMy5mb3JjZUxpbmsobGlua3MpLmlkKChkKSA9PiBkLmlkKVxyXG4gICAgKVxyXG4gICAgLmZvcmNlKFwiY2hhcmdlXCIsIGQzLmZvcmNlTWFueUJvZHkoKS5zdHJlbmd0aCgtOCkpXHJcbiAgICAuZm9yY2UoXCJjZW50ZXJcIiwgZDMuZm9yY2VDZW50ZXIod2lkdGggLyAyLCBoZWlnaHQgLyAyKS5zdHJlbmd0aCgwLjUpKTtcclxuXHJcbiAgY29uc3QgZHJhZyA9IChzaW11bGF0aW9uOiBkMy5TaW11bGF0aW9uPGFueSwgdW5kZWZpbmVkPikgPT4ge1xyXG4gICAgZnVuY3Rpb24gZHJhZ3N0YXJ0ZWQoZXZlbnQsIGQpIHtcclxuICAgICAgaWYgKCFldmVudC5hY3RpdmUpIHNpbXVsYXRpb24uYWxwaGFUYXJnZXQoMC4zKS5yZXN0YXJ0KCk7XHJcbiAgICAgIGQuZnggPSBkLng7XHJcbiAgICAgIGQuZnkgPSBkLnk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZHJhZ2dlZChldmVudCwgZCkge1xyXG4gICAgICBkLmZ4ID0gZXZlbnQueDtcclxuICAgICAgZC5meSA9IGV2ZW50Lnk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZHJhZ2VuZGVkKGV2ZW50LCBkKSB7XHJcbiAgICAgIGlmICghZXZlbnQuYWN0aXZlKSBzaW11bGF0aW9uLmFscGhhVGFyZ2V0KDApO1xyXG4gICAgICBkLmZ4ID0gbnVsbDtcclxuICAgICAgZC5meSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGQzXHJcbiAgICAgIC5kcmFnKClcclxuICAgICAgLm9uKFwic3RhcnRcIiwgZHJhZ3N0YXJ0ZWQpXHJcbiAgICAgIC5vbihcImRyYWdcIiwgZHJhZ2dlZClcclxuICAgICAgLm9uKFwiZW5kXCIsIGRyYWdlbmRlZCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgICAuYXR0cihcImNsYXNzXCIsIFwiZm9yY2VEaXJlY3RlZEdcIik7XHJcblxyXG4gIGNvbnN0IGxpbmsgPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZVwiLCBcIiM4NjgyODJcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLW9wYWNpdHlcIiwgMC42KVxyXG4gICAgLnNlbGVjdEFsbChcImxpbmVcIilcclxuICAgIC5kYXRhKGxpbmtzKVxyXG4gICAgLmpvaW4oXCJsaW5lXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAwLjgpXHJcbiAgICAuYXR0cihcIm1hcmtlci1lbmRcIiwgXCJ1cmwoI2VuZClcIik7XHJcblxyXG4gIHZhciBwYXRoID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwic3ZnOmdcIilcclxuICAgIC5zZWxlY3RBbGwoXCJwYXRoXCIpXHJcbiAgICAuZGF0YShsaW5rcylcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKFwic3ZnOnBhdGhcIilcclxuICAgIC8vICAgIC5hdHRyKFwiY2xhc3NcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gXCJsaW5rIFwiICsgZC50eXBlOyB9KVxyXG4gICAgLmF0dHIoXCJjbGFzc1wiLCBcImxpbmtcIilcclxuICAgIC5hdHRyKFwibWFya2VyLWVuZFwiLCBcInVybCgjZW5kKVwiKTtcclxuXHJcbiAgY29uc3QgYXJyb3dIZWFkID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwic3ZnOmRlZnNcIilcclxuICAgIC5zZWxlY3RBbGwoXCJtYXJrZXJcIilcclxuICAgIC5kYXRhKFtcImVuZFwiXSkgLy8gRGlmZmVyZW50IGxpbmsvcGF0aCB0eXBlcyBjYW4gYmUgZGVmaW5lZCBoZXJlXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZChcInN2ZzptYXJrZXJcIikgLy8gVGhpcyBzZWN0aW9uIGFkZHMgaW4gdGhlIGFycm93c1xyXG4gICAgLmF0dHIoXCJpZFwiLCBTdHJpbmcpXHJcbiAgICAuYXR0cihcInZpZXdCb3hcIiwgXCIwIC01IDEwIDEwXCIpXHJcbiAgICAuYXR0cihcInJlZlhcIiwgMjApXHJcbiAgICAuYXR0cihcInJlZllcIiwgMC4xKVxyXG4gICAgLmF0dHIoXCJtYXJrZXJXaWR0aFwiLCA2KVxyXG4gICAgLmF0dHIoXCJtYXJrZXJIZWlnaHRcIiwgNilcclxuICAgIC5hdHRyKFwib3JpZW50XCIsIFwiYXV0b1wiKVxyXG4gICAgLy8gLmF0dHIoXCJzdHJva2VcIiwgXCIjODY4MjgyXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAxMClcclxuICAgIC5hcHBlbmQoXCJzdmc6cGF0aFwiKVxyXG4gICAgLmF0dHIoXCJkXCIsIFwiTTAsLTVMMTAsMEwwLDVcIik7XHJcblxyXG4gIGNvbnN0IG5hbWVGcm9tSW5kZXggPSAoZDogeyBpbmRleDogbnVtYmVyIH0pID0+XHJcbiAgICBkYXRhLm5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGQuaW5kZXgpLm5hbWU7XHJcblxyXG4gIGNvbnN0IGluZGV4RnJvbU5hbWUgPSAobmFtZTogc3RyaW5nKTogbnVtYmVyID0+XHJcbiAgICBkYXRhLm5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUubmFtZSA9PT0gbmFtZSkuaWQ7XHJcblxyXG4gIGNvbnN0IG5vZGU6IGQzLlNlbGVjdGlvbjxcclxuICAgIGQzLkJhc2VUeXBlIHwgU1ZHQ2lyY2xlRWxlbWVudCxcclxuICAgIGFueSxcclxuICAgIFNWR0dFbGVtZW50LFxyXG4gICAgdW5rbm93blxyXG4gID4gPSBzdmdcclxuICAgIC5hcHBlbmQoXCJnXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwiY2lyY2xlXCIpXHJcbiAgICAuZGF0YShub2RlcylcclxuICAgIC5qb2luKFwiY2lyY2xlXCIpXHJcblxyXG4gICAgLmF0dHIoXCJyXCIsIDUpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgKGQpID0+IHtcclxuICAgICAgaWYgKG5hbWVGcm9tSW5kZXgoZCkgPT09IGN1cnJGaWxlLmJhc2VuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiI2ZmZmZmZlwiO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBjdXJyTm9kZUNvbG91cjtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5jYWxsKGRyYWcoc2ltdWxhdGlvbikpO1xyXG5cclxuICBub2RlLmF0dHIoXCJhcmlhLWxhYmVsXCIsIChkOiBkM05vZGUpID0+IGQubmFtZSk7XHJcblxyXG4gIGNvbnN0IG5vZGVDbGljayA9IChldmVudDogTW91c2VFdmVudCwgZGVzdDogc3RyaW5nKSA9PiB7XHJcbiAgICBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQpO1xyXG4gICAgbW9kYWwuY2xvc2UoKTtcclxuICB9O1xyXG4gIG5vZGUub24oXCJjbGlja1wiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IGQzTm9kZSkgPT4ge1xyXG4gICAgbm9kZUNsaWNrKGV2ZW50LCBkLm5hbWUpO1xyXG4gIH0pO1xyXG5cclxuICBub2RlLm9uKFwibW91c2Vkb3duXCIsIChldmVudDogTW91c2VFdmVudCwgZCkgPT4ge1xyXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMikge1xyXG4gICAgICBub2RlVG9HZXRUbyA9IGQubmFtZTtcclxuXHJcbiAgICAgIG5vZGUuc3R5bGUoXCJmaWxsXCIsIChuKSA9PiB7XHJcbiAgICAgICAgaWYgKG4ubmFtZSA9PT0gbm9kZVRvR2V0VG8pIHtcclxuICAgICAgICAgIHJldHVybiBcIiNmZjAwMDBcIjtcclxuICAgICAgICB9IGVsc2UgcmV0dXJuIGN1cnJOb2RlQ29sb3VyO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIHBhdGhzRnJvbU5vZGVUb0dldFRvID0gZ3JhcGhsaWIuYWxnLmRpamtzdHJhKGdyYXBoLCBub2RlVG9HZXRUbyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtlZChhOiBudW1iZXIsIGI6IG51bWJlcikge1xyXG4gICAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xyXG4gICAgY29uc3QgbGlua2VkQXJyID0gbGlua3MuZmluZChcclxuICAgICAgKGxpbmspID0+XHJcbiAgICAgICAgKGxpbmsuc291cmNlLmluZGV4ID09PSBhICYmIGxpbmsudGFyZ2V0LmluZGV4ID09PSBiKSB8fFxyXG4gICAgICAgIChsaW5rLnRhcmdldC5pbmRleCA9PT0gYSAmJiBsaW5rLnNvdXJjZS5pbmRleCA9PT0gYilcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuICEhbGlua2VkQXJyO1xyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gd2Fsa0RpamtzdHJhUGF0aHMoXHJcbiAgLy8gICBwYXRoczogeyBbbm9kZTogc3RyaW5nXTogZ3JhcGhsaWIuUGF0aCB9LFxyXG4gIC8vICAgc3RhcnROb2RlOiBzdHJpbmdcclxuICAvLyApIHtcclxuICAvLyAgIGlmIChzdGFydE5vZGUgPT09IG5vZGVUb0dldFRvIHx8IHBhdGhzW3N0YXJ0Tm9kZV0uZGlzdGFuY2UgPT09IEluZmluaXR5KVxyXG4gIC8vICAgICByZXR1cm4gW107XHJcbiAgLy8gICBsZXQgc3RlcCA9IHN0YXJ0Tm9kZTtcclxuXHJcbiAgLy8gICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtzdGFydE5vZGVdO1xyXG4gIC8vICAgbGV0IGkgPSAwO1xyXG4gIC8vICAgY29uc3QgTUFYID0gMzAwO1xyXG4gIC8vICAgd2hpbGUgKHBhdGhzW3N0ZXBdLnByZWRlY2Vzc29yICE9PSBub2RlVG9HZXRUbyAmJiBpIDwgTUFYKSB7XHJcbiAgLy8gICAgIGkrKztcclxuICAvLyAgICAgc3RlcCA9IHBhdGhzW3N0ZXBdLnByZWRlY2Vzc29yO1xyXG4gIC8vICAgICBwYXRoLnB1c2goc3RlcCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoaSA+PSBNQVgpIHJldHVybiBbXTtcclxuICAvLyAgIHBhdGgucHVzaChub2RlVG9HZXRUbyk7XHJcbiAgLy8gICByZXR1cm4gcGF0aDtcclxuICAvLyB9XHJcblxyXG4gIG5vZGVcclxuICAgIC5vbihcIm1vdXNlb3ZlclwiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQ6IHsgaW5kZXg6IG51bWJlciB9KSA9PiB7XHJcbiAgICAgIG5vZGVcclxuICAgICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgICAgLmR1cmF0aW9uKDE1MClcclxuICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIChvKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gbGlua2VkKGQuaW5kZXgsIG8uaW5kZXgpID8gMSA6IDAuMjtcclxuICAgICAgICB9KTtcclxuICAgICAgbGlua1xyXG4gICAgICAgIC50cmFuc2l0aW9uKClcclxuICAgICAgICAuZHVyYXRpb24oMTUwKVxyXG4gICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICAgIHJldHVybiBvLnNvdXJjZS5pbmRleCA9PT0gZC5pbmRleCB8fCBvLnRhcmdldC5pbmRleCA9PT0gZC5pbmRleFxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiAwLjI7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBIaWdobGlnaHQgcGF0aCBmcm9tIGhvdmVyZWQgbm9kZSB0byBjdXJyTm9kZVxyXG4gICAgICBjb25zdCBob3ZlcmVkTm9kZSA9IG5hbWVGcm9tSW5kZXgoZCk7XHJcbiAgICAgIC8vIGNvbnN0IHBhdGggPSB3YWxrRGlqa3N0cmFQYXRocyhwYXRoc0Zyb21Ob2RlVG9HZXRUbywgaG92ZXJlZE5vZGUpO1xyXG4gICAgICAvLyBpZiAocGF0aC5sZW5ndGgpIHtcclxuICAgICAgLy8gICBsaW5rXHJcbiAgICAgIC8vICAgICAudHJhbnNpdGlvbigpXHJcbiAgICAgIC8vICAgICAuZHVyYXRpb24oMTUwKVxyXG4gICAgICAvLyAgICAgLnN0eWxlKFwic3Ryb2tlXCIsIGZ1bmN0aW9uIChsaW5rKSB7XHJcbiAgICAgIC8vICAgICAgIGlmIChcclxuICAgICAgLy8gICAgICAgICBwYXRoLmluY2x1ZGVzKG5hbWVGcm9tSW5kZXgobGluay5zb3VyY2UpKSAmJlxyXG4gICAgICAvLyAgICAgICAgIHBhdGguaW5jbHVkZXMobmFtZUZyb21JbmRleChsaW5rLnRhcmdldCkpXHJcbiAgICAgIC8vICAgICAgIClcclxuICAgICAgLy8gICAgICAgICByZXR1cm4gY3Vyck5vZGVDb2xvdXI7XHJcbiAgICAgIC8vICAgICB9KVxyXG4gICAgICAvLyAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCBmdW5jdGlvbiAobGluaykge1xyXG4gICAgICAvLyAgICAgICBpZiAoXHJcbiAgICAgIC8vICAgICAgICAgcGF0aC5pbmNsdWRlcyhuYW1lRnJvbUluZGV4KGxpbmsuc291cmNlKSkgJiZcclxuICAgICAgLy8gICAgICAgICBwYXRoLmluY2x1ZGVzKG5hbWVGcm9tSW5kZXgobGluay50YXJnZXQpKVxyXG4gICAgICAvLyAgICAgICApXHJcbiAgICAgIC8vICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIC8vICAgICB9KTtcclxuICAgICAgLy8gfVxyXG4gICAgfSlcclxuICAgIC5vbihcIm1vdXNlb3V0XCIsIHVuZm9jdXMpO1xyXG5cclxuICBmdW5jdGlvbiBmb2N1c05laWdoYm91cnMoZCwgZXZlbnQ6IE1vdXNlRXZlbnQpIHsgfVxyXG5cclxuICBmdW5jdGlvbiB1bmZvY3VzKCkge1xyXG4gICAgLy8gbGFiZWxOb2RlLmF0dHIoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XHJcbiAgICBub2RlLnN0eWxlKFwib3BhY2l0eVwiLCAxKTtcclxuICAgIGxpbmsuc3R5bGUoXCJvcGFjaXR5XCIsIDEpLnN0eWxlKFwic3Ryb2tlXCIsIFwiIzg2ODI4MlwiKTtcclxuICB9XHJcblxyXG4gIHNpbXVsYXRpb24ub24oXCJ0aWNrXCIsICgpID0+IHtcclxuICAgIGxpbmtcclxuICAgICAgLmF0dHIoXCJ4MVwiLCAoZCkgPT4gZC5zb3VyY2UueClcclxuICAgICAgLmF0dHIoXCJ5MVwiLCAoZCkgPT4gZC5zb3VyY2UueSlcclxuICAgICAgLmF0dHIoXCJ4MlwiLCAoZCkgPT4gZC50YXJnZXQueClcclxuICAgICAgLmF0dHIoXCJ5MlwiLCAoZCkgPT4gZC50YXJnZXQueSk7XHJcblxyXG4gICAgbm9kZS5hdHRyKFwiY3hcIiwgKGQpID0+IGQueCkuYXR0cihcImN5XCIsIChkKSA9PiBkLnkpO1xyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgbm9kZS5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgICBsaW5rLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICB9XHJcbiAgc3ZnLmNhbGwoXHJcbiAgICBkM1xyXG4gICAgICAuem9vbSgpXHJcbiAgICAgIC5leHRlbnQoW1xyXG4gICAgICAgIFswLCAwXSxcclxuICAgICAgICBbd2lkdGgsIGhlaWdodF0sXHJcbiAgICAgIF0pXHJcbiAgICAgIC5zY2FsZUV4dGVudChbMC41LCAxMF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcblxyXG4gIGZ1bmN0aW9uIHNhdmVHcmFwaCgpIHtcclxuICAgIGNvbnN0IGNsb25lID0gc3ZnLmNsb25lKHRydWUpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJGREdcIiwgSlNPTi5zdHJpbmdpZnkoY2xvbmUpKTtcclxuICB9XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGljaWNsZSA9IChcclxuICBncmFwaDogR3JhcGgsXHJcbiAgY3VyckZpbGU6IFRGaWxlLFxyXG4gIG1vZGFsOiBWaXNNb2RhbCxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIHZpZXdIZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXIgPSBkMy5zdHJhdGlmeSgpKGZsYXRBZGopO1xyXG4gIGNvbnNvbGUubG9nKHsgaGllciB9KTtcclxuXHJcbiAgY29uc3QgZm9ybWF0ID0gZDMuZm9ybWF0KFwiLGRcIik7XHJcblxyXG4gIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKFxyXG4gICAgZDMucXVhbnRpemUoZDMuaW50ZXJwb2xhdGVSYWluYm93LCBoaWVyLmNoaWxkcmVuLmxlbmd0aCArIDEpXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgcGFydGl0aW9uID0gKGRhdGEpID0+IHtcclxuICAgIGNvbnN0IHJvb3QgPSBkM1xyXG4gICAgICAuaGllcmFyY2h5KGRhdGEpXHJcbiAgICAgIC5zdW0oKGQpID0+IGQudmFsdWUpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmhlaWdodCAtIGEuaGVpZ2h0IHx8IGIudmFsdWUgLSBhLnZhbHVlKTtcclxuICAgIHJldHVybiBkMy5wYXJ0aXRpb24oKS5zaXplKFt2aWV3SGVpZ2h0LCAoKHJvb3QuaGVpZ2h0ICsgMSkgKiB3aWR0aCkgLyAzXSkoXHJcbiAgICAgIHJvb3RcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3Qgcm9vdCA9IHBhcnRpdGlvbihoaWVyKTtcclxuICBsZXQgZm9jdXMgPSByb290O1xyXG5cclxuICBjb25zdCBzdmcgPSBkM1xyXG4gICAgLnNlbGVjdChcIi5kMy1ncmFwaFwiKVxyXG4gICAgLmFwcGVuZChcInN2Z1wiKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgdmlld0hlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgICAuc3R5bGUoXCJmb250XCIsIFwiMTBweCBzYW5zLXNlcmlmXCIpO1xyXG5cclxuICBjb25zdCBjZWxsID0gc3ZnXHJcbiAgICAuc2VsZWN0QWxsKFwiZ1wiKVxyXG4gICAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKVxyXG4gICAgLmpvaW4oXCJnXCIpXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCAoZCkgPT4gYHRyYW5zbGF0ZSgke2QueTB9LCR7ZC54MH0pYCk7XHJcblxyXG4gIGNvbnN0IHJlY3QgPSBjZWxsXHJcbiAgICAuYXBwZW5kKFwicmVjdFwiKVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCAoZCkgPT4gZC55MSAtIGQueTAgLSAxKVxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgKGQpID0+IHJlY3RIZWlnaHQoZCkpXHJcbiAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuYXR0cihcImZpbGxcIiwgKGQpID0+IHtcclxuICAgICAgaWYgKCFkLmRlcHRoKSByZXR1cm4gXCIjY2NjXCI7XHJcbiAgICAgIHdoaWxlIChkLmRlcHRoID4gMSkgZCA9IGQucGFyZW50O1xyXG4gICAgICByZXR1cm4gY29sb3IoZC5kYXRhLmRhdGEubmFtZSk7XHJcbiAgICB9KVxyXG4gICAgLnN0eWxlKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKVxyXG4gICAgLm9uKFwiY2xpY2tcIiwgY2xpY2tlZCk7XHJcblxyXG4gIGNvbnN0IHRleHQgPSBjZWxsXHJcbiAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgLnN0eWxlKFwidXNlci1zZWxlY3RcIiwgXCJub25lXCIpXHJcbiAgICAuYXR0cihcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJ4XCIsIDQpXHJcbiAgICAuYXR0cihcInlcIiwgMTMpO1xyXG4gIC8vIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIChkKSA9PiArbGFiZWxWaXNpYmxlKGQpKTtcclxuXHJcbiAgdGV4dC5hcHBlbmQoXCJ0c3BhblwiKS50ZXh0KChkKSA9PiBkLmRhdGEuZGF0YS5uYW1lKTtcclxuXHJcbiAgY29uc3QgdHNwYW4gPSB0ZXh0XHJcbiAgICAuYXBwZW5kKFwidHNwYW5cIilcclxuICAgIC5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIChkKSA9PiAobGFiZWxWaXNpYmxlKGQpID8gMSA6IDApICogMC43KVxyXG4gICAgLnRleHQoKGQpID0+IGAgJHtmb3JtYXQoZC52YWx1ZSl9YCk7XHJcblxyXG4gIGNlbGwuYXBwZW5kKFwidGl0bGVcIikudGV4dChcclxuICAgIChkKSA9PlxyXG4gICAgICBgJHtkLmFuY2VzdG9ycygpLm1hcCgoZCkgPT4gZC5kYXRhLmRhdGEubmFtZSlcclxuICAgICAgLy8gLnJldmVyc2UoKVxyXG4gICAgICAvLyAuam9pbihcIi9cIil9XFxuJHtmb3JtYXQoZC52YWx1ZSlcclxuICAgICAgfWBcclxuICApO1xyXG5cclxuICBmdW5jdGlvbiBjbGlja2VkKGV2ZW50LCBwKSB7XHJcbiAgICBjb25zb2xlLmxvZyh7IHAgfSk7XHJcbiAgICBmb2N1cyA9IGZvY3VzID09PSBwID8gKHAgPSBwLnBhcmVudCkgOiBwO1xyXG5cclxuICAgIHJvb3QuZWFjaCgoZCkgPT4ge1xyXG4gICAgICBkLnRhcmdldCA9IHtcclxuICAgICAgICB4MDogKChkLngwIC0gcC54MCkgLyAocC54MSAtIHAueDApKSAqIHZpZXdIZWlnaHQsXHJcbiAgICAgICAgeDE6ICgoZC54MSAtIHAueDApIC8gKHAueDEgLSBwLngwKSkgKiB2aWV3SGVpZ2h0LFxyXG4gICAgICAgIHkwOiBkLnkwIC0gcC55MCxcclxuICAgICAgICB5MTogZC55MSAtIHAueTAsXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnNvbGUubG9nKGQudGFyZ2V0LngwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHQgPSBjZWxsXHJcbiAgICAgIC50cmFuc2l0aW9uKClcclxuICAgICAgLmR1cmF0aW9uKDc1MClcclxuICAgICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHtkLnRhcmdldC55MH0sJHtkLnRhcmdldC54MH0pYCk7XHJcblxyXG4gICAgcmVjdC50cmFuc2l0aW9uKHQpLmF0dHIoXCJoZWlnaHRcIiwgKGQpID0+IHJlY3RIZWlnaHQoZC50YXJnZXQpKTtcclxuICAgIHRleHQudHJhbnNpdGlvbih0KS5hdHRyKFwiZmlsbC1vcGFjaXR5XCIsIChkKSA9PiArbGFiZWxWaXNpYmxlKGQudGFyZ2V0KSk7XHJcbiAgICB0c3BhblxyXG4gICAgICAudHJhbnNpdGlvbih0KVxyXG4gICAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAoZCkgPT4gKGxhYmVsVmlzaWJsZShkKSA/IDEgOiAwKSAqIDAuNyk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiByZWN0SGVpZ2h0KGQpIHtcclxuICAgIGNvbnNvbGUubG9nKHsgZCB9KTtcclxuICAgIHJldHVybiBkLngxIC0gZC54MCAtIE1hdGgubWluKDEsIChkLngxIC0gZC54MCkgLyAyKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxhYmVsVmlzaWJsZShkKSB7XHJcbiAgICByZXR1cm4gZC55MSA8PSB3aWR0aCAmJiBkLnkwID49IDAgJiYgZC54MSAtIGQueDAgPiAxNjtcclxuICB9XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCwgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHJhZGlhbFRyZWUgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXJhcmNoeSA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKTtcclxuXHJcbiAgY29uc3Qgcm9vdCA9IGQzXHJcbiAgICAuaGllcmFyY2h5KGhpZXJhcmNoeSwgKGQpID0+IGQuY2hpbGRyZW4pXHJcbiAgICAuc3VtKChkKSA9PiAoZC5jaGlsZHJlbiA/IDAgOiAxKSlcclxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aCk7XHJcblxyXG4gIGNvbnN0IG91dGVyUmFkaXVzID0gd2lkdGggLyAyO1xyXG4gIGNvbnN0IGlubmVyUmFkaXVzID0gb3V0ZXJSYWRpdXMgLSAxNzA7XHJcblxyXG4gIGNvbnN0IGNsdXN0ZXIgPSBkM1xyXG4gICAgLmNsdXN0ZXIoKVxyXG4gICAgLnNpemUoWzM2MCwgaW5uZXJSYWRpdXNdKVxyXG4gICAgLnNlcGFyYXRpb24oKGEsIGIpID0+IDEpO1xyXG5cclxuICBjb25zdCBjb2xvciA9IGQzXHJcbiAgICAuc2NhbGVPcmRpbmFsKClcclxuICAgIC5kb21haW4oZ3JhcGgubm9kZXMoKSlcclxuICAgIC5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKTtcclxuXHJcbiAgZnVuY3Rpb24gbWF4TGVuZ3RoKGQ6IGQzLkhpZXJhcmNoeU5vZGU8dW5rbm93bj4pIHtcclxuICAgIHJldHVybiBkLmRhdGEuZGF0YS5kZXB0aCArIChkLmNoaWxkcmVuID8gZDMubWF4KGQuY2hpbGRyZW4sIG1heExlbmd0aCkgOiAwKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHNldFJhZGl1cyhkOiBkMy5IaWVyYXJjaHlOb2RlPHVua25vd24+LCB5MDogbnVtYmVyLCBrOiBudW1iZXIpIHtcclxuICAgIGQucmFkaXVzID0gKHkwICs9IGQuZGF0YS5kYXRhLmRlcHRoKSAqIGs7XHJcbiAgICBpZiAoZC5jaGlsZHJlbikgZC5jaGlsZHJlbi5mb3JFYWNoKChkKSA9PiBzZXRSYWRpdXMoZCwgeTAsIGspKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHNldENvbG9yKGQ6IGQzLkhpZXJhcmNoeU5vZGU8dW5rbm93bj4pIHtcclxuICAgIHZhciBuYW1lID0gZC5kYXRhLmRhdGEubmFtZTtcclxuICAgIGQuY29sb3IgPVxyXG4gICAgICBjb2xvci5kb21haW4oKS5pbmRleE9mKG5hbWUpID49IDBcclxuICAgICAgICA/IGNvbG9yKG5hbWUpXHJcbiAgICAgICAgOiBkLnBhcmVudFxyXG4gICAgICAgICAgPyBkLnBhcmVudC5jb2xvclxyXG4gICAgICAgICAgOiBudWxsO1xyXG4gICAgaWYgKGQuY2hpbGRyZW4pIGQuY2hpbGRyZW4uZm9yRWFjaChzZXRDb2xvcik7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaW5rVmFyaWFibGUoZCkge1xyXG4gICAgcmV0dXJuIGxpbmtTdGVwKGQuc291cmNlLngsIGQuc291cmNlLnJhZGl1cywgZC50YXJnZXQueCwgZC50YXJnZXQucmFkaXVzKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGxpbmtDb25zdGFudChkKSB7XHJcbiAgICByZXR1cm4gbGlua1N0ZXAoZC5zb3VyY2UueCwgZC5zb3VyY2UueSwgZC50YXJnZXQueCwgZC50YXJnZXQueSk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaW5rRXh0ZW5zaW9uVmFyaWFibGUoZCkge1xyXG4gICAgcmV0dXJuIGxpbmtTdGVwKGQudGFyZ2V0LngsIGQudGFyZ2V0LnJhZGl1cywgZC50YXJnZXQueCwgaW5uZXJSYWRpdXMpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gbGlua0V4dGVuc2lvbkNvbnN0YW50KGQpIHtcclxuICAgIHJldHVybiBsaW5rU3RlcChkLnRhcmdldC54LCBkLnRhcmdldC55LCBkLnRhcmdldC54LCBpbm5lclJhZGl1cyk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsaW5rU3RlcChcclxuICAgIHN0YXJ0QW5nbGU6IG51bWJlcixcclxuICAgIHN0YXJ0UmFkaXVzOiBudW1iZXIsXHJcbiAgICBlbmRBbmdsZTogbnVtYmVyLFxyXG4gICAgZW5kUmFkaXVzOiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGMwID0gTWF0aC5jb3MoKHN0YXJ0QW5nbGUgPSAoKHN0YXJ0QW5nbGUgLSA5MCkgLyAxODApICogTWF0aC5QSSkpO1xyXG4gICAgY29uc3QgczAgPSBNYXRoLnNpbihzdGFydEFuZ2xlKTtcclxuICAgIGNvbnN0IGMxID0gTWF0aC5jb3MoKGVuZEFuZ2xlID0gKChlbmRBbmdsZSAtIDkwKSAvIDE4MCkgKiBNYXRoLlBJKSk7XHJcbiAgICBjb25zdCBzMSA9IE1hdGguc2luKGVuZEFuZ2xlKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIFwiTVwiICtcclxuICAgICAgc3RhcnRSYWRpdXMgKiBjMCArXHJcbiAgICAgIFwiLFwiICtcclxuICAgICAgc3RhcnRSYWRpdXMgKiBzMCArXHJcbiAgICAgIChlbmRBbmdsZSA9PT0gc3RhcnRBbmdsZVxyXG4gICAgICAgID8gXCJcIlxyXG4gICAgICAgIDogXCJBXCIgK1xyXG4gICAgICAgIHN0YXJ0UmFkaXVzICtcclxuICAgICAgICBcIixcIiArXHJcbiAgICAgICAgc3RhcnRSYWRpdXMgK1xyXG4gICAgICAgIFwiIDAgMCBcIiArXHJcbiAgICAgICAgKGVuZEFuZ2xlID4gc3RhcnRBbmdsZSA/IDEgOiAwKSArXHJcbiAgICAgICAgXCIgXCIgK1xyXG4gICAgICAgIHN0YXJ0UmFkaXVzICogYzEgK1xyXG4gICAgICAgIFwiLFwiICtcclxuICAgICAgICBzdGFydFJhZGl1cyAqIHMxKSArXHJcbiAgICAgIFwiTFwiICtcclxuICAgICAgZW5kUmFkaXVzICogYzEgK1xyXG4gICAgICBcIixcIiArXHJcbiAgICAgIGVuZFJhZGl1cyAqIHMxXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbGVnZW5kID0gKHN2ZykgPT4ge1xyXG4gICAgY29uc3QgZyA9IHN2Z1xyXG4gICAgICAuc2VsZWN0QWxsKFwiZ1wiKVxyXG4gICAgICAuZGF0YShjb2xvci5kb21haW4oKSlcclxuICAgICAgLmpvaW4oXCJnXCIpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgIFwidHJhbnNmb3JtXCIsXHJcbiAgICAgICAgKGQsIGkpID0+IGB0cmFuc2xhdGUoJHstb3V0ZXJSYWRpdXN9LCR7LW91dGVyUmFkaXVzICsgaSAqIDIwfSlgXHJcbiAgICAgICk7XHJcblxyXG4gICAgZy5hcHBlbmQoXCJyZWN0XCIpLmF0dHIoXCJ3aWR0aFwiLCAxOCkuYXR0cihcImhlaWdodFwiLCAxOCkuYXR0cihcImZpbGxcIiwgY29sb3IpO1xyXG5cclxuICAgIGcuYXBwZW5kKFwidGV4dFwiKVxyXG4gICAgICAuYXR0cihcInhcIiwgMjQpXHJcbiAgICAgIC5hdHRyKFwieVwiLCA5KVxyXG4gICAgICAuYXR0cihcImR5XCIsIFwiMC4zNWVtXCIpXHJcbiAgICAgIC50ZXh0KChkKSA9PiBkKTtcclxuICB9O1xyXG5cclxuICBjbHVzdGVyKHJvb3QpO1xyXG4gIHNldFJhZGl1cyhyb290LCAocm9vdC5kYXRhLmRhdGEuZGVwdGggPSAwKSwgaW5uZXJSYWRpdXMgLyBtYXhMZW5ndGgocm9vdCkpO1xyXG4gIHNldENvbG9yKHJvb3QpO1xyXG5cclxuICBzdmcuYXBwZW5kKFwiZ1wiKS5jYWxsKGxlZ2VuZCk7XHJcblxyXG4gIHN2Zy5hcHBlbmQoXCJzdHlsZVwiKS50ZXh0KGBcclxuXHJcbi5saW5rLS1hY3RpdmUge1xyXG5zdHJva2U6ICMwMDAgIWltcG9ydGFudDtcclxuc3Ryb2tlLXdpZHRoOiAxLjVweDtcclxufVxyXG5cclxuLmxpbmstZXh0ZW5zaW9uLS1hY3RpdmUge1xyXG5zdHJva2Utb3BhY2l0eTogLjY7XHJcbn1cclxuXHJcbi5sYWJlbC0tYWN0aXZlIHtcclxuZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbmApO1xyXG5cclxuICBjb25zdCBsaW5rRXh0ZW5zaW9uID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjMDAwXCIpXHJcbiAgICAuYXR0cihcInN0cm9rZS1vcGFjaXR5XCIsIDAuMjUpXHJcbiAgICAuc2VsZWN0QWxsKFwicGF0aFwiKVxyXG4gICAgLmRhdGEocm9vdC5saW5rcygpLmZpbHRlcigoZCkgPT4gIWQudGFyZ2V0LmNoaWxkcmVuKSlcclxuICAgIC5qb2luKFwicGF0aFwiKVxyXG4gICAgLmVhY2goZnVuY3Rpb24gKGQpIHtcclxuICAgICAgZC50YXJnZXQubGlua0V4dGVuc2lvbk5vZGUgPSB0aGlzO1xyXG4gICAgfSlcclxuICAgIC5hdHRyKFwiZFwiLCBsaW5rRXh0ZW5zaW9uQ29uc3RhbnQpO1xyXG5cclxuICBjb25zdCBsaW5rID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIFwibm9uZVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCIjMDAwXCIpXHJcbiAgICAuc2VsZWN0QWxsKFwicGF0aFwiKVxyXG4gICAgLmRhdGEocm9vdC5saW5rcygpKVxyXG4gICAgLmpvaW4oXCJwYXRoXCIpXHJcbiAgICAuZWFjaChmdW5jdGlvbiAoZCkge1xyXG4gICAgICBkLnRhcmdldC5saW5rTm9kZSA9IHRoaXM7XHJcbiAgICB9KVxyXG4gICAgLmF0dHIoXCJkXCIsIGxpbmtDb25zdGFudClcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIChkKSA9PiBkLnRhcmdldC5jb2xvcik7XHJcblxyXG4gIGNvbnN0IGxhYmVsID0gc3ZnXHJcbiAgICAuYXBwZW5kKFwiZ1wiKVxyXG4gICAgLnNlbGVjdEFsbChcInRleHRcIilcclxuICAgIC5kYXRhKHJvb3QubGVhdmVzKCkpXHJcbiAgICAuam9pbihcInRleHRcIilcclxuICAgIC5hdHRyKFwiZHlcIiwgXCIuMzFlbVwiKVxyXG4gICAgLmF0dHIoXHJcbiAgICAgIFwidHJhbnNmb3JtXCIsXHJcbiAgICAgIChkKSA9PlxyXG4gICAgICAgIGByb3RhdGUoJHtkLnggLSA5MH0pIHRyYW5zbGF0ZSgke2lubmVyUmFkaXVzICsgNH0sMCkke2QueCA8IDE4MCA/IFwiXCIgOiBcIiByb3RhdGUoMTgwKVwiXHJcbiAgICAgICAgfWBcclxuICAgIClcclxuICAgIC5hdHRyKFwidGV4dC1hbmNob3JcIiwgKGQpID0+IChkLnggPCAxODAgPyBcInN0YXJ0XCIgOiBcImVuZFwiKSlcclxuICAgIC50ZXh0KChkKSA9PiBkLmRhdGEuZGF0YS5uYW1lKVxyXG4gICAgLm9uKFwibW91c2VvdmVyXCIsIG1vdXNlb3ZlcmVkKHRydWUpKVxyXG4gICAgLm9uKFwibW91c2VvdXRcIiwgbW91c2VvdmVyZWQoZmFsc2UpKTtcclxuXHJcbiAgLy8gICBmdW5jdGlvbiB1cGRhdGUoY2hlY2tlZCkge1xyXG4gIC8vICAgICBjb25zdCB0ID0gZDMudHJhbnNpdGlvbigpLmR1cmF0aW9uKDc1MCk7XHJcbiAgLy8gICAgIGxpbmtFeHRlbnNpb25cclxuICAvLyAgICAgICAudHJhbnNpdGlvbih0KVxyXG4gIC8vICAgICAgIC5hdHRyKFwiZFwiLCBjaGVja2VkID8gbGlua0V4dGVuc2lvblZhcmlhYmxlIDogbGlua0V4dGVuc2lvbkNvbnN0YW50KTtcclxuICAvLyAgICAgbGluay50cmFuc2l0aW9uKHQpLmF0dHIoXCJkXCIsIGNoZWNrZWQgPyBsaW5rVmFyaWFibGUgOiBsaW5rQ29uc3RhbnQpO1xyXG4gIC8vICAgfVxyXG5cclxuICBmdW5jdGlvbiBtb3VzZW92ZXJlZChhY3RpdmUpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQsIGQpIHtcclxuICAgICAgZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoXCJsYWJlbC0tYWN0aXZlXCIsIGFjdGl2ZSk7XHJcbiAgICAgIGQzLnNlbGVjdChkLmxpbmtFeHRlbnNpb25Ob2RlKVxyXG4gICAgICAgIC5jbGFzc2VkKFwibGluay1leHRlbnNpb24tLWFjdGl2ZVwiLCBhY3RpdmUpXHJcbiAgICAgICAgLnJhaXNlKCk7XHJcbiAgICAgIGRvIGQzLnNlbGVjdChkLmxpbmtOb2RlKS5jbGFzc2VkKFwibGluay0tYWN0aXZlXCIsIGFjdGl2ZSkucmFpc2UoKTtcclxuICAgICAgd2hpbGUgKChkID0gZC5wYXJlbnQpKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgbGlua0V4dGVuc2lvbi5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgICBsaW5rLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICAgIGxhYmVsLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICB9XHJcbiAgc3ZnLmNhbGwoXHJcbiAgICBkM1xyXG4gICAgICAuem9vbSgpXHJcbiAgICAgIC5leHRlbnQoW1xyXG4gICAgICAgIFswLCAwXSxcclxuICAgICAgICBbd2lkdGgsIGhlaWdodF0sXHJcbiAgICAgIF0pXHJcbiAgICAgIC5zY2FsZUV4dGVudChbMC41LCA4XSlcclxuICAgICAgLm9uKFwiem9vbVwiLCB6b29tZWQpXHJcbiAgKTtcclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB0eXBlIHsgVmlzTW9kYWwgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5pbXBvcnQgeyBkZnNGbGF0QWRqTGlzdCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcblxyXG5leHBvcnQgY29uc3Qgc3VuYnVyc3QgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXJhcmNoeSA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIHZhciByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7IC8vIDwgLS0gMlxyXG4gIHZhciBjb2xvciA9IGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKTtcclxuXHJcbiAgdmFyIGcgPSBkM1xyXG4gICAgLnNlbGVjdChcInN2Z1wiKSAvLyA8LS0gMVxyXG4gICAgLmF0dHIoXCJ3aWR0aFwiLCB3aWR0aCkgLy8gPC0tIDJcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hcHBlbmQoXCJnXCIpIC8vIDwtLSAzXHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIHdpZHRoIC8gMiArIFwiLFwiICsgaGVpZ2h0IC8gMiArIFwiKVwiKTsgLy8gPC0tIDRcclxuXHJcbiAgdmFyIGcgPSBkM1xyXG4gICAgLnNlbGVjdChcInN2Z1wiKSAvLyByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSA8c3ZnPiBlbGVtZW50XHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKSAvLyBzZXRzIHRoZSB3aWR0aCBvZiA8c3ZnPiBhbmQgdGhlbiByZXR1cm5zIHRoZSA8c3ZnPiBlbGVtZW50IGFnYWluXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpIC8vIChzYW1lIGFzIHdpZHRoKVxyXG4gICAgLmFwcGVuZChcImdcIikgLy8gYWRkcyBhIDxnPiBlbGVtZW50IHRvIHRoZSA8c3ZnPiBlbGVtZW50LiBJdCByZXR1cm5zIHRoZSA8Zz4gZWxlbWVudFxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyB3aWR0aCAvIDIgKyBcIixcIiArIGhlaWdodCAvIDIgKyBcIilcIik7IC8vIHRha2VzIHRoZSA8Zz4gZWxlbWVudCBhbmQgbW92ZXMgdGhlIFswLDBdIGNlbnRlciBvdmVyIGFuZCBkb3duXHJcblxyXG4gIHZhciBnID0gZDNcclxuICAgIC5zZWxlY3QoXCJzdmdcIikgLy8gLS0+IDxzdmc+PC9zdmc+XHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKSAvLyAtLT4gPHN2ZyB3aWR0aD1cIjUwMFwiPjwvc3ZnPlxyXG4gICAgLmF0dHIoXCJoZWlnaHRcIiwgaGVpZ2h0KSAvLyAtLT4gPHN2ZyB3aWR0aD1cIjUwMFwiIGhlaWdodD1cIjUwMFwiPjwvc3ZnPlxyXG4gICAgLmFwcGVuZChcImdcIikgLy8gLS0+IDxzdmcgd2lkdGg9XCI1MDBcIiBoZWlnaHQ9XCI1MDBcIj48Zz48L2c+PC9zdmc+XHJcbiAgICAuYXR0cihcInRyYW5zZm9ybVwiLCBcInRyYW5zbGF0ZShcIiArIHdpZHRoIC8gMiArIFwiLFwiICsgaGVpZ2h0IC8gMiArIFwiKVwiKTsgLy8gLS0+IDxzdmcgd2lkdGg9XCI1MDBcIiBoZWlnaHQ9XCI1MDBcIj48ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMjUwLDI1MClcIj48L2c+PC9zdmc+XHJcblxyXG4gIHZhciBwYXJ0aXRpb24gPSBkM1xyXG4gICAgLnBhcnRpdGlvbigpIC8vIDwtLSAxXHJcbiAgICAuc2l6ZShbMiAqIE1hdGguUEksIHJhZGl1c10pOyAvLyA8LS0gMlxyXG5cclxuICB2YXIgcm9vdCA9IGQzXHJcbiAgICAuaGllcmFyY2h5KGhpZXJhcmNoeSkgLy8gPC0tIDFcclxuICAgIC5zdW0oZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQuaGVpZ2h0O1xyXG4gICAgfSk7IC8vIDwtLSAyXHJcblxyXG4gIHBhcnRpdGlvbihyb290KTsgLy8gPC0tIDFcclxuICB2YXIgYXJjID0gZDNcclxuICAgIC5hcmMoKSAvLyA8LS0gMlxyXG4gICAgLnN0YXJ0QW5nbGUoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQueDA7XHJcbiAgICB9KVxyXG4gICAgLmVuZEFuZ2xlKGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgIHJldHVybiBkLngxO1xyXG4gICAgfSlcclxuICAgIC5pbm5lclJhZGl1cyhmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC55MDtcclxuICAgIH0pXHJcbiAgICAub3V0ZXJSYWRpdXMoZnVuY3Rpb24gKGQpIHtcclxuICAgICAgcmV0dXJuIGQueTE7XHJcbiAgICB9KTtcclxuXHJcbiAgZy5zZWxlY3RBbGwoXCJwYXRoXCIpIC8vIDwtLSAxXHJcbiAgICAuZGF0YShyb290LmRlc2NlbmRhbnRzKCkpIC8vIDwtLSAyXHJcbiAgICAuZW50ZXIoKSAvLyA8LS0gM1xyXG4gICAgLmFwcGVuZChcInBhdGhcIikgLy8gPC0tIDRcclxuICAgIC5hdHRyKFwiZGlzcGxheVwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gZC5kZXB0aCA/IG51bGwgOiBcIm5vbmVcIjtcclxuICAgIH0pIC8vIDwtLSA1XHJcbiAgICAuYXR0cihcImRcIiwgYXJjKSAvLyA8LS0gNlxyXG4gICAgLnN0eWxlKFwic3Ryb2tlXCIsIFwiI2ZmZlwiKSAvLyA8LS0gN1xyXG4gICAgLnN0eWxlKFwiZmlsbFwiLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICByZXR1cm4gY29sb3IoKGQuY2hpbGRyZW4gPyBkIDogZC5wYXJlbnQpLmRhdGEubmFtZSk7XHJcbiAgICB9KTsgLy8gPC0tIDhcclxufTtcclxuIiwgImltcG9ydCAqIGFzIGQzIGZyb20gXCJkM1wiO1xyXG5pbXBvcnQgdHlwZSBHcmFwaCBmcm9tIFwiZ3JhcGhvbG9neVwiO1xyXG5pbXBvcnQgdHlwZSB7IFRGaWxlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IG9wZW5PclN3aXRjaCB9IGZyb20gXCJvYnNpZGlhbi1jb21tdW5pdHktbGliXCI7XHJcbmltcG9ydCB7IGRmc0ZsYXRBZGpMaXN0LCBWaXNNb2RhbCB9IGZyb20gXCIuL1Zpc01vZGFsXCI7XHJcblxyXG5leHBvcnQgY29uc3QgdGlkeVRyZWUgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICAvLyBjb25zdCBhZGpMaXN0OiBBZGpMaXN0SXRlbVtdID0gYmZzQWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIC8vIGNvbnNvbGUubG9nKHsgYWRqTGlzdCB9KTtcclxuXHJcbiAgLy8gY29uc3Qgbm9Eb3VibGVzID0gWy4uLmFkakxpc3RdO1xyXG4gIC8vIG5vRG91Ymxlcy5mb3JFYWNoKChhLCBpLCBsaXN0KSA9PiB7XHJcbiAgLy8gICBpZiAobGlzdC5zb21lKChiLCBqKSA9PiBpICE9PSBqICYmIGEucGFyZW50SWQgPT09IGIucGFyZW50SWQpKSB7XHJcbiAgLy8gICAgIG5vRG91Ymxlcy5zcGxpY2UoaSwgMSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfSk7XHJcbiAgLy8gY29uc29sZS5sb2coeyBub0RvdWJsZXMgfSk7XHJcblxyXG4gIGNvbnN0IHRyZWUgPSAoZGF0YSkgPT4ge1xyXG4gICAgY29uc3Qgcm9vdCA9IGQzLmhpZXJhcmNoeShkYXRhKTtcclxuICAgIHJvb3QuZHggPSAxMDtcclxuICAgIHJvb3QuZHkgPSB3aWR0aCAvIChyb290LmhlaWdodCArIDEpO1xyXG4gICAgcmV0dXJuIGQzLnRyZWUoKS5ub2RlU2l6ZShbcm9vdC5keCwgcm9vdC5keV0pKHJvb3QpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGZsYXRBZGogPSBkZnNGbGF0QWRqTGlzdChncmFwaCwgY3VyckZpbGUuYmFzZW5hbWUpO1xyXG4gIGNvbnNvbGUubG9nKHsgZmxhdEFkaiB9KTtcclxuXHJcbiAgY29uc3QgaGllcmFyY2h5ID0gZDMuc3RyYXRpZnkoKShmbGF0QWRqKTtcclxuICBjb25zb2xlLmxvZyh7IGhpZXJhcmNoeSB9KTtcclxuXHJcbiAgY29uc3Qgcm9vdCA9IHRyZWUoaGllcmFyY2h5KTtcclxuICBjb25zb2xlLmxvZyhyb290KTtcclxuXHJcbiAgbGV0IHgwID0gSW5maW5pdHk7XHJcbiAgbGV0IHgxID0gLXgwO1xyXG4gIHJvb3QuZWFjaCgoZCkgPT4ge1xyXG4gICAgaWYgKGQueCA+IHgxKSB4MSA9IGQueDtcclxuICAgIGlmIChkLnggPCB4MCkgeDAgPSBkLng7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHN2ZyA9IGQzXHJcbiAgICAuc2VsZWN0KFwiLmQzLWdyYXBoXCIpXHJcbiAgICAuYXBwZW5kKFwic3ZnXCIpXHJcbiAgICAuYXR0cihcImhlaWdodFwiLCBoZWlnaHQpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIHdpZHRoKTtcclxuXHJcbiAgY29uc3QgZyA9IHN2Z1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZm9udC1mYW1pbHlcIiwgXCJzYW5zLXNlcmlmXCIpXHJcbiAgICAuYXR0cihcImZvbnQtc2l6ZVwiLCAxMClcclxuICAgIC5hdHRyKFwidHJhbnNmb3JtXCIsIGB0cmFuc2xhdGUoJHtyb290LmR5IC8gM30sJHtyb290LmR4IC0geDB9KWApO1xyXG5cclxuICBjb25zdCBsaW5rID0gZ1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwiZmlsbFwiLCBcIm5vbmVcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlXCIsIFwiIzU1NVwiKVxyXG4gICAgLmF0dHIoXCJzdHJva2Utb3BhY2l0eVwiLCAwLjQpXHJcbiAgICAuYXR0cihcInN0cm9rZS13aWR0aFwiLCAxLjUpXHJcbiAgICAuc2VsZWN0QWxsKFwicGF0aFwiKVxyXG4gICAgLmRhdGEocm9vdC5saW5rcygpKVxyXG4gICAgLmpvaW4oXCJwYXRoXCIpXHJcbiAgICAuYXR0cihcclxuICAgICAgXCJkXCIsXHJcbiAgICAgIGQzXHJcbiAgICAgICAgLmxpbmtIb3Jpem9udGFsKClcclxuICAgICAgICAueCgoZCkgPT4gZC55KVxyXG4gICAgICAgIC55KChkKSA9PiBkLngpXHJcbiAgICApO1xyXG5cclxuICBjb25zdCBub2RlID0gZ1xyXG4gICAgLmFwcGVuZChcImdcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLWxpbmVqb2luXCIsIFwicm91bmRcIilcclxuICAgIC5hdHRyKFwic3Ryb2tlLXdpZHRoXCIsIDEwKVxyXG4gICAgLnNlbGVjdEFsbChcImdcIilcclxuICAgIC5kYXRhKHJvb3QuZGVzY2VuZGFudHMoKSlcclxuICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHtkLnl9LCR7ZC54fSlgKTtcclxuXHJcbiAgbm9kZVxyXG4gICAgLmFwcGVuZChcImNpcmNsZVwiKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiAoZC5jaGlsZHJlbiA/IFwiIzU1NVwiIDogXCIjOTk5XCIpKVxyXG4gICAgLmF0dHIoXCJyXCIsIDEwKTtcclxuXHJcbiAgbm9kZS5hdHRyKFwiYXJpYS1sYWJlbFwiLCAoZCkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coZCk7XHJcbiAgICByZXR1cm4gZC5kYXRhLmRhdGEubmFtZTtcclxuICB9KTtcclxuXHJcbiAgY29uc3Qgbm9kZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBkZXN0OiBzdHJpbmcpID0+IHtcclxuICAgIG9wZW5PclN3aXRjaChkZXN0LCBldmVudCk7XHJcbiAgICBtb2RhbC5jbG9zZSgpO1xyXG4gIH07XHJcbiAgbm9kZS5vbihcImNsaWNrXCIsIChldmVudDogTW91c2VFdmVudCwgZCkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coeyBkIH0pO1xyXG4gICAgbm9kZUNsaWNrKGV2ZW50LCBkLmRhdGEuZGF0YS5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgbm9kZVxyXG4gICAgLmFwcGVuZChcInRleHRcIilcclxuICAgIC5hdHRyKFwiZHlcIiwgXCIwLjMxZW1cIilcclxuICAgIC5hdHRyKFwieFwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyAtNiA6IDYpKVxyXG4gICAgLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCAoZCkgPT4gKGQuY2hpbGRyZW4gPyBcImVuZFwiIDogXCJzdGFydFwiKSlcclxuICAgIC50ZXh0KChkKSA9PiBkLmRhdGEuZGF0YS5uYW1lKVxyXG4gICAgLmNsb25lKHRydWUpXHJcbiAgICAubG93ZXIoKVxyXG4gICAgLmF0dHIoXCJzdHJva2VcIiwgXCJ3aGl0ZVwiKTtcclxuXHJcbiAgZnVuY3Rpb24gem9vbWVkKHsgdHJhbnNmb3JtIH0pIHtcclxuICAgIHN2Zy5hdHRyKFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSk7XHJcbiAgfVxyXG4gIHN2Zy5jYWxsKFxyXG4gICAgZDNcclxuICAgICAgLnpvb20oKVxyXG4gICAgICAuZXh0ZW50KFtcclxuICAgICAgICBbMCwgMF0sXHJcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxyXG4gICAgICBdKVxyXG4gICAgICAuc2NhbGVFeHRlbnQoWzAuNSwgOF0pXHJcbiAgICAgIC5vbihcInpvb21cIiwgem9vbWVkKVxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgKiBhcyBkMyBmcm9tIFwiZDNcIjtcclxuaW1wb3J0IHR5cGUgR3JhcGggZnJvbSBcImdyYXBob2xvZ3lcIjtcclxuaW1wb3J0IHR5cGUgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBvcGVuT3JTd2l0Y2ggfSBmcm9tIFwib2JzaWRpYW4tY29tbXVuaXR5LWxpYlwiO1xyXG5pbXBvcnQgdHlwZSB7IFZpc01vZGFsIH0gZnJvbSBcIi4vVmlzTW9kYWxcIjtcclxuaW1wb3J0IHsgZGZzRmxhdEFkakxpc3QgfSBmcm9tIFwiLi9WaXNNb2RhbFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHRyZWVNYXAgPSAoXHJcbiAgZ3JhcGg6IEdyYXBoLFxyXG4gIGN1cnJGaWxlOiBURmlsZSxcclxuICBtb2RhbDogVmlzTW9kYWwsXHJcbiAgd2lkdGg6IG51bWJlcixcclxuICBoZWlnaHQ6IG51bWJlclxyXG4pID0+IHtcclxuICBjb25zdCBmbGF0QWRqID0gZGZzRmxhdEFkakxpc3QoZ3JhcGgsIGN1cnJGaWxlLmJhc2VuYW1lKTtcclxuICBjb25zb2xlLmxvZyh7IGZsYXRBZGogfSk7XHJcblxyXG4gIGNvbnN0IGhpZXJhcmNoeSA9IGQzLnN0cmF0aWZ5KCkoZmxhdEFkaik7XHJcbiAgY29uc29sZS5sb2coeyBoaWVyYXJjaHkgfSk7XHJcblxyXG4gIGNvbnN0IHJvb3QgPSBkM1xyXG4gICAgLnRyZWVtYXAoKVxyXG4gICAgLnRpbGUoZDMudHJlZW1hcEJpbmFyeSlcclxuICAgIC5zaXplKFt3aWR0aCwgaGVpZ2h0XSlcclxuICAgIC5wYWRkaW5nKDEpXHJcbiAgICAucm91bmQodHJ1ZSkoXHJcbiAgICAgIGhpZXJhcmNoeS5zdW0oKGQpID0+IGQuaGVpZ2h0KS5zb3J0KChhLCBiKSA9PiBiLmhlaWdodCAtIGEuaGVpZ2h0KVxyXG4gICAgKTtcclxuXHJcbiAgLy8gICBjb25zdCByb290ID0gdHJlZW1hcChkYXRhKTtcclxuXHJcbiAgY29uc3Qgc3ZnID0gZDNcclxuICAgIC5zZWxlY3QoXCIuZDMtZ3JhcGhcIilcclxuICAgIC5hcHBlbmQoXCJzdmdcIilcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIGhlaWdodClcclxuICAgIC5hdHRyKFwid2lkdGhcIiwgd2lkdGgpXHJcbiAgICAuc3R5bGUoXCJmb250XCIsIFwiMTBweCBzYW5zLXNlcmlmXCIpO1xyXG5cclxuICBjb25zdCBsZWFmID0gc3ZnXHJcbiAgICAuc2VsZWN0QWxsKFwiZ1wiKVxyXG4gICAgLmRhdGEocm9vdC5sZWF2ZXMoKSlcclxuICAgIC5qb2luKFwiZ1wiKVxyXG4gICAgLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgKGQpID0+IGB0cmFuc2xhdGUoJHtkLngwfSwke2QueTB9KWApO1xyXG5cclxuICBsZWFmLmF0dHIoXCJhcmlhLWxhYmVsXCIsIChkKSA9PiBkLmRhdGEubmFtZSk7XHJcblxyXG4gIC8vICAgbGVhZi5hcHBlbmQoXCJ0aXRsZVwiKS50ZXh0KFxyXG4gIC8vICAgICAoZCkgPT5cclxuICAvLyAgICAgICBgJHtkXHJcbiAgLy8gICAgICAgICAuYW5jZXN0b3JzKClcclxuICAvLyAgICAgICAgIC5yZXZlcnNlKClcclxuICAvLyAgICAgICAgIC5tYXAoKGQpID0+IGQuZGF0YS5pZClcclxuICAvLyAgICAgICAgIC5qb2luKFwiL1wiKX1cXG4ke2Zvcm1hdChkLmhlaWdodCl9YFxyXG4gIC8vICAgKTtcclxuXHJcbiAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCk7XHJcblxyXG4gIGxlYWZcclxuICAgIC5hcHBlbmQoXCJyZWN0XCIpXHJcbiAgICAvLyAuYXR0cihcImlkXCIsIChkKSA9PiAoZC5sZWFmVWlkID0gRE9NLnVpZChcImxlYWZcIikpLmlkKVxyXG4gICAgLmF0dHIoXCJmaWxsXCIsIChkKSA9PiB7XHJcbiAgICAgIHdoaWxlIChkLmRlcHRoID4gMSkgZCA9IGQucGFyZW50O1xyXG4gICAgICByZXR1cm4gY29sb3IoZC5kYXRhLmlkKTtcclxuICAgIH0pXHJcbiAgICAuYXR0cihcImZpbGwtb3BhY2l0eVwiLCAwLjYpXHJcbiAgICAuYXR0cihcIndpZHRoXCIsIChkKSA9PiBkLngxIC0gZC54MClcclxuICAgIC5hdHRyKFwiaGVpZ2h0XCIsIChkKSA9PiBkLnkxIC0gZC55MCk7XHJcblxyXG4gIGxlYWZcclxuICAgIC5hcHBlbmQoXCJjbGlwUGF0aFwiKVxyXG4gICAgLy8gLmF0dHIoXCJpZFwiLCAoZCkgPT4gKGQuY2xpcFVpZCA9IERPTS51aWQoXCJjbGlwXCIpKS5pZClcclxuICAgIC5hcHBlbmQoXCJ1c2VcIik7XHJcbiAgLy8gLmF0dHIoXCJ4bGluazpocmVmXCIsIChkKSA9PiBkLmxlYWZVaWQuaHJlZik7XHJcblxyXG4gIC8vICAgbGVhZlxyXG4gIC8vICAgICAuYXBwZW5kKFwidGV4dFwiKVxyXG4gIC8vICAgICAuYXR0cihcImNsaXAtcGF0aFwiLCAoZCkgPT4gZC5jbGlwVWlkKVxyXG4gIC8vICAgICAuc2VsZWN0QWxsKFwidHNwYW5cIilcclxuICAvLyAgICAgLmRhdGEoKGQpID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmxvZyh7IGQgfSk7XHJcbiAgLy8gICAgICAgcmV0dXJuIGQuZGF0YS5uYW1lLnNwbGl0KC8oPz1bQS1aXVteQS1aXSkvZykuY29uY2F0KGZvcm1hdChkLmhlaWdodCkpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICAuam9pbihcInRzcGFuXCIpXHJcbiAgLy8gICAgIC5hdHRyKFwieFwiLCAzKVxyXG4gIC8vICAgICAuYXR0cihcclxuICAvLyAgICAgICBcInlcIixcclxuICAvLyAgICAgICAoZCwgaSwgbm9kZXMpID0+IGAkeyhpID09PSBub2Rlcy5sZW5ndGggLSAxKSAqIDAuMyArIDEuMSArIGkgKiAwLjl9ZW1gXHJcbiAgLy8gICAgIClcclxuICAvLyAgICAgLmF0dHIoXCJmaWxsLW9wYWNpdHlcIiwgKGQsIGksIG5vZGVzKSA9PlxyXG4gIC8vICAgICAgIGkgPT09IG5vZGVzLmxlbmd0aCAtIDEgPyAwLjcgOiBudWxsXHJcbiAgLy8gICAgICk7XHJcbiAgLy8gICAvLyAudGV4dCgoZCkgPT4gZCk7XHJcblxyXG4gIGNvbnN0IG5vZGVDbGljayA9IChldmVudDogTW91c2VFdmVudCwgZGVzdDogc3RyaW5nKSA9PiB7XHJcbiAgICBvcGVuT3JTd2l0Y2goZGVzdCwgZXZlbnQpO1xyXG4gICAgbW9kYWwuY2xvc2UoKTtcclxuICB9O1xyXG4gIGxlYWYub24oXCJjbGlja1wiLCAoZXZlbnQ6IE1vdXNlRXZlbnQsIGQpID0+IHtcclxuICAgIGNvbnNvbGUubG9nKHsgZCB9KTtcclxuICAgIG5vZGVDbGljayhldmVudCwgZC5kYXRhLm5hbWUpO1xyXG4gIH0pO1xyXG5cclxuICBmdW5jdGlvbiB6b29tZWQoeyB0cmFuc2Zvcm0gfSkge1xyXG4gICAgc3ZnLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtKTtcclxuICB9XHJcbiAgc3ZnLmNhbGwoXHJcbiAgICBkM1xyXG4gICAgICAuem9vbSgpXHJcbiAgICAgIC5leHRlbnQoW1xyXG4gICAgICAgIFswLCAwXSxcclxuICAgICAgICBbd2lkdGgsIGhlaWdodF0sXHJcbiAgICAgIF0pXHJcbiAgICAgIC5zY2FsZUV4dGVudChbMC41LCA4XSlcclxuICAgICAgLm9uKFwiem9vbVwiLCB6b29tZWQpXHJcbiAgKTtcclxufTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFBLFFBQ2hELFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNoRCxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFDdEIsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQzFFLFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUMxRSxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFBSyxRQUFRO0FBQUEsUUFDaEQsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQUssUUFBUTtBQUFBLFFBQ2hELFFBQVE7QUFBQSxRQUFNLFFBQVE7QUFBQSxRQUFLLFFBQVE7QUFBQSxRQUNuQyxRQUFRO0FBQUEsUUFBTSxRQUFRO0FBQUEsUUFDdEIsUUFBUTtBQUFBLFFBQU0sUUFBUTtBQUFBLFFBQ3RCLFFBQVE7QUFBQSxRQUVSLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN4RCxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDdkUsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3ZFLFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN2RSxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDeEQsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3hELFVBQVU7QUFBQSxRQUFNLFVBQVU7QUFBQSxRQUFLLFVBQVU7QUFBQSxRQUN6QyxVQUFVO0FBQUEsUUFBTSxVQUFVO0FBQUEsUUFBSyxVQUFVO0FBQUEsUUFDekMsVUFBVTtBQUFBLFFBQU0sVUFBVTtBQUFBLFFBQUssVUFBVTtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUFNLFVBQVU7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QUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQO0FBQUEsRUFDQTtBQUFBLElBQ0UsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsSUFDRSxPQUFPO0FBQUEsSUFDUCxNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUDtBQUFBLEVBQ0E7QUFBQSxJQUNFLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJ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QUEsRUFDUCxRQUFRO0FBQUEsRUFDUixPQUFPO0FBQUEsRUFDUCxnQkFBZ0I7QUFBQSxFQUNoQixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUEsRUFDWCxXQUFXO0FBQUEsRUFDWCxZQUFZO0FBQUEsRUFDWixXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxnQkFBZ0I7QUFBQSxFQUNoQixVQUFVO0FBQUEsRUFDVixTQUFTO0FBQUEsRUFDVCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFDZixVQUFVO0FBQUEsRUFDVixXQUFXO0FBQUEsRUFDWCxVQUFVO0FBQUEsRUFDVixXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixnQkFBZ0I7QUFBQSxFQUNoQixZQUFZO0FBQUEsRUFDWixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsRUFDVCxZQUFZO0FBQUEsRUFDWixjQUFjO0FBQUEsRUFDZCxlQUFlO0FBQUEsRUFDZixlQUFlO0FBQUEsRUFDZixlQUFlO0FBQUEsRUFDZixlQUFlO0FBQUEsRUFDZixZQUFZO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVixhQUFhO0FBQUEsRUFDYixTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFDVCxZQUFZO0FBQUEsRUFDWixXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixhQUFhO0FBQUEsRUFDYixTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFDWCxZQUFZO0FBQUEsRUFDWixNQUFNO0FBQUEsRUFDTixXQUFXO0FBQUEsRUFDWCxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFDWCxRQUFRO0FBQUEsRUFDUixPQUFPO0FBQUEsRUFDUCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUEsRUFDVixlQUFlO0FBQUEsRUFD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LEdBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssRUFBQyxJQUN0RixNQUFNLElBQUksSUFBSSxJQUFLLE1BQUssSUFBSSxLQUFRLE1BQUssSUFBSSxLQUFRLE1BQUssSUFBSSxLQUFRLEtBQUksS0FBUyxNQUFJLE9BQVEsSUFBTSxLQUFJLElBQU0sQ0FBQyxJQUNoSCxNQUFNLElBQUksS0FBSyxNQUFLLEtBQUssS0FBTSxNQUFLLEtBQUssS0FBTSxNQUFLLElBQUksS0FBTyxNQUFJLE9BQVEsR0FBSSxJQUMvRSxNQUFNLElBQUksS0FBTSxNQUFLLEtBQUssS0FBUSxNQUFLLElBQUksS0FBUSxNQUFLLElBQUksS0FBUSxNQUFLLElBQUksS0FBUSxNQUFLLElBQUksS0FBUSxLQUFJLEtBQVUsT0FBSSxPQUFRLElBQU0sS0FBSSxNQUFRLEdBQUksSUFDdEosUUFDQyxNQUFJLGFBQWEsS0FBSyxPQUFNLEtBQUssSUFBSSxJQUFJLEdBQUUsSUFBSSxHQUFFLElBQUksR0FBRSxJQUFJLENBQUMsSUFDNUQsTUFBSSxhQUFhLEtBQUssT0FBTSxLQUFLLElBQUksSUFBSSxHQUFFLEtBQUssTUFBTSxLQUFLLEdBQUUsS0FBSyxNQUFNLEtBQUssR0FBRSxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQ2hHLE1BQUksY0FBYyxLQUFLLE9BQU0sS0FBSyxLQUFLLEdBQUUsSUFBSSxHQUFFLElBQUksR0FBRSxJQUFJLEdBQUUsRUFBRSxJQUM3RCxNQUFJLGNBQWMsS0FBSyxPQUFNLEtBQUssS0FBSyxHQUFFLEtBQUssTUFBTSxLQUFLLEdBQUUsS0FBSyxNQUFNLEtBQUssR0FBRSxLQUFLLE1BQU0sS0FBSyxHQUFFLEVBQUUsSUFDakcsTUFBSSxhQUFhLEtBQUssT0FBTSxLQUFLLEtBQUssR0FBRSxJQUFJLEdBQUUsS0FBSyxLQUFLLEdBQUUsS0FBSyxLQUFLLENBQUMsSUFDckUsTUFBSSxjQUFjLEtBQUssT0FBTSxLQUFLLEtBQUssR0FBRSxJQUFJLEdBQUUsS0FBSyxLQUFLLEdBQUUsS0FBSyxLQUFLLEdBQUUs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 diff --git a/src/Components/TrailGrid.svelte b/src/Components/TrailGrid.svelte index 8d61cd0b..7e5ed034 100644 --- a/src/Components/TrailGrid.svelte +++ b/src/Components/TrailGrid.svelte @@ -44,7 +44,7 @@ class="BC-trail-grid" style=" grid-template-columns: {'1fr '.repeat(transposedTrails.length)}; - grid-template-rows: {'1fr '.repeat(slicedTrails.length)}" + grid-template-rows: {'1fr '.repeat(slicedTrails.length)};" > {#each transposedTrails as col, i} {#each allRuns[i] as { value, first, last }} @@ -147,11 +147,4 @@ div.BC-trail-grid-item.BC-filler { opacity: 0.7; } - - /* .dot { - height: 5px; - width: 5px; - border-radius: 50%; - display: inline-block; - } */ diff --git a/src/Views/TrailView.ts b/src/Views/TrailView.ts index 73594832..8b5347df 100644 --- a/src/Views/TrailView.ts +++ b/src/Views/TrailView.ts @@ -197,7 +197,10 @@ export async function drawTrail(plugin: BCPlugin): Promise { attr: { style: (mode !== "preview" ? `max-width: ${max_width};` : "") + - "margin: 0 auto; width: 100%;", + "margin: 0 auto;" + + `${respectReadableLineLength + ? 'width: var(--file-line-width);' + : 'width: 100%'}`, }, });